读书人

豌豆框架0.6正式发布解决思路

发布时间: 2012-03-06 20:47:55 作者: rapoo

豌豆框架0.6正式发布
[color=#339966]豌豆框架(英文名叫Wonderful Framework): [/color]是一个PHP开发框架, 支持PHP5以上版本, 它是免费的, 开源的, 是基于BSD协议发行的.
是具有灵活的, 可扩展的, 可配置的, 组件化的框架结构. 采用面向对象的设计理念, 同时又支持传统的面向过程的, 在HTML中直接嵌入PHP代码的开发方式.
支持MVC模式, 能让程序员更好的与美工合作, 甚至美工不需要会PHP.
PhpTagLib, Action等等, 这些技术能开发者更好的开发出强大的分层设计构架.
集成有单元测试/对象模仿功能, 还有依赖注入构架, 更好的支持敏捷开发.
框架多处参考了JAVA中的技术, 并对这些技术更一步发挥.
框架还有很多不足之处, 还需不断完善, 欢迎多提意见, 如有什么问题, 请向我们反馈. 欢迎你的参与!

特点:
* 灵活, 扩展性强, 复用性高, 完全采用面向对象设计, 并带有一些有用的类库.
* 依赖注入, 实现了IoC构架, 为开发者更好的降低类的依赖性.
* 地址映射, 这是框架的基础, 开发者可以自己定义匹配地址, 并映射到专门的类中运行.
* 标签引擎, PhpTagLib是框架中重要的MVC实现, 允许开发者定义像HTML/XML这样的标签, 实现组件化开发.
* Action模块, 强大的数据处理构架, 支持采用标签方式调用, 支持多个Action合并使用.
* 迭代器, 扩展增强PHP的迭代器(Iterator)接口, 并融合进框架中的其它模块.
* 数据库, 对PEAR DB的重新封装, 支持同时连接多个数据库, 并提供通过标签直接查询.
* 分页类, 数据分页和分页导行分开, 可更好的扩展分页, 基于迭代器可以对任何数据的迭代器分页.
* 缓存, 提供统一的缓存构架, 开发者可以方便的扩展, 支持通过缓存标签缓存页面中的内容.
* 测试引擎, 支持TDD开发方法, 敏捷开发的必需品, 支持单独运行一个测试用例, 也支持运行测试组.
* 对象模仿, 不仅可以Mock指定的类/接口, 还可以Mock父类以分离父类进行测试.
* PlainObject, 支持写一个普通的类, 不继承任何类, 不实现任何接口, 可直接用做标签类或Action类使用.
* 传统页面, 可以直接访问传统的PHP页面, HTML页面, 图片, 脚本等等文件.
* 单一入口, 可以在入口程序中设置框架环境.
* 调试, 支持更详细的错误/异常提供, 支持提示环境中的一些信息.
* XML格式的配置文件, 使配置更直观, 灵活.
* 自带有PEAR中的一些基本和常用的类库.
* 免费的, 开源的. 使用BSD开源协议发行, 你可以用在任何项目中.

框架网站: http://www.wonderfulproject.cn
Google Code: http://code.google.com/p/wonderfulframework

示例: http://www.wonderfulproject.cn/door.php/example.php

相关文章:
PhpTagLib的MVC分层设计
迭代器(Iterator)和分页(Page)类库介绍
框架中Action的特性: 组件和组合
在框架中使用FCKEditor

趁过年时, 有些时间发布个新版本.
本框架主要定位在系统开发方面, 提供了些敏捷方面的技术.
随着框架在实际项目中不断应用和实践, 整体的构架已经趋向稳定, 且在易用性上也做了些改进.
将来框架会继续完善构架, 丰富各个库(类库, 标签库, Action库, Validator库), 增强易用性, 增加控制平台, 提高效率等等方面.

[解决办法]
文档在那里?文档在那里?
[解决办法]
大致看了一下demo

你的框架不太适合php

1、框架连autoload都没实现,要知道在PHP中引用包含文件是件很麻烦的事情。
2、MVC没看到M和V嘛,那个“PhpTagLib”算作V的话实在有点勉强
3、Action的参数很复杂呀——“WDF_ActionForm & $form, WDF_ActionErrors & $errors”,要知道没有IDE或工具自动生成代码的话,参数是越简单越好的。
4、输出用$this->response->writeln,这也太复杂了吧。$this->output不是挺好
5、XML格式的配置文件可以直接用PHP Array实现,,可读性也不差,PHP本身就是动态脚本,应该好好利用这个特点。
6、获取action参数要用$form->getValue,是不是复杂了点?
public function process(string $username) { ... } 这样最好了

这个框架实在太中规中矩了,要知道PHP是低效的动态脚本语言,不像java/C#,这样的框架不适合PHP

[解决办法]
首先我还没看过源代码,所以有些所提问题的不周之处还请谅解。

> 1、框架连autoload都没实现,要知道在PHP中引用包含文件是件很麻烦的事情。
>这个很早我就在想要怎么加入? 我是这样考虑的, autoload要怎么知道要载入哪个文件呢? 通过类命名规则? 那类名会很长呀! 也许可以用命名空间, 但PHP5.3才支持命名空间, 但这样的话其实命名还是很长, 除非使用别名, 别名会比include方便多少呢?

一般通过类名实现autoload,根据优先级,到各个目录下寻找有无对应的包含文件,如果有同名类,可以用类似using(...);的函数来设置一个全局标记,告诉autoload应该优先到哪个目录加载。
实现autoload,主要依赖lib的目录组织,如果组织得好,会大大便于实现autoload。

-----------------


> 3、Action的参数很复杂呀——“WDF_ActionForm & $form, WDF_ActionErrors & $errors”,要知道没有IDE或工具自动生成代码的话,参数是越简单越好的。
>嗯, 我也认同参数越简单越好, 但这已经是最简单了, 这两个参数对象已经把主要的数据进行归类了.

为啥不把$form作为controller的成员,而要作为参数传递?
为啥不采用php内置的异常处理?class ActionException extends Exception { ... }
throw new ActionException(...);

--------------


> 6、获取action参数要用$form->getValue,是不是复杂了点?
> public function process(string $username) { ... } 这样最好了
> 不会最好, 反而更糟. 一个username一个参数, 那还有其它的数据呢? 有一个增加一个, 只会更糟.


我的意思是这样:
public function process(string $username) { ... }
$username是必要参数,缺少则controller报错

public function process(string $username = null) { ... }
则表明$username是可选参数

页面传递的其余参数仍然可以通过$form来访问


既然这个框架需要PHP5支持,那么可以采用内置的ReflectionMethod类,很方便地就把$_GET['username']对应到$username参数上
[解决办法]
关于autoload:

即使是不能实现autoload,至少要实现App::import('namespacing.module.name');这样的功能,那也会方便很多
[解决办法]
配置文件+类名前缀

Symfony的autoload就是这样的
[解决办法]
哈哈,很适合初学者。

。不过我不喜欢框架。
[解决办法]
我认为大部分PHP框架是将简单的问题复杂化。

[解决办法]
貌似框架有过多的限制。。。
[解决办法]
楼主可以看看我的框架
http://code.google.com/p/queryphp/
这个一个微型框架
可以实现MVC方式

支持path_info方式

控制动作在router目录下面
/default/index
调用router目录下面defaultRouter.class.php文件
取得类后调用index方式
J()是index方法跳转
R()是由控制
C()是生成类
M()是数据库类模型 数据库链接在model.function.php里面设置

只包括framework.php文件就可以了。

path_info方式
testframework.php?controller=default&action=index
testframework.php/default/index

可以使用apache重写 去掉testframework.php文件

可以自己设置路由规则
C("router")->ruleMaps("login",'/login/:id', array('controller' => 'auth', 'action' => 'login'));
那么会配匹testframework.php/login/5555
这样可以使用$_GET['id']得到5555;
'controller' => 'auth', 'action' => 'login'
是控制器和方法

其它设置
C("router")->ruleMaps('logout','/logout', array('controller' => 'auth', 'action' => 'logout'));
C("router")->ruleMaps('signup','/signup', array('controller' => 'auth', 'action' => 'signup'));
C("router")->ruleMaps('profile','/profile/:action', array('controller' => 'profile')); // will call controller "Profile" with dynamic method ":action()"
C("router")->ruleMaps('users','/users/:id', array('controller' => 'users'), array('id' => '[\d]{1,8}')); // define filters for the url parameters


数据库数据模型
使用方法

构造一个数据库表模型
$beian=M('beian');

自动填充aaa bbb字段 $_POST中也要有这两个字段
//$beian->autoField(array("aaa","bbbb"));
$data中填充
$beian->autoField($data,array("aaa","bbbb"));
取两个主键值,排序为升序
//print_r($beian->get(53,54,'asc'));

赋值给字段。
$beian->userid=2;
$beian->language=1;


打印已经赋值字段
//print_r($beian->data);

保存,再显示刚才插入的ID
//echo $beian->save()->pkid();

设置主键然后删除
//echo($beian->pkid(69)->delete());

取得表的行数
//echo $beian->Totalnum();

select显示两个字段,Arraylist为数组
//print_r($beian->getAll("userid,language")->record); //改为record了

查询两个userid和language为1和5,fetch为取值
print_r($beian->whereUseridAndLanguage('1','5')->fetch()->record);

取得两个主键,显示三个字段,升序
//print_r($beian->get('confid,userid,language',53,54,'asc')->record);

输出主键值
//echo $beian->confid;

更新某个表的字段累加1
$beian->colupdate('tplid');

可以在model目录下,*****Model.class.php文件里面添加方法。

生成模型后可以马上可以使用
print_r($booktype=M("booktype")->getAll());


更新J()跳函数
可以支持各个路由之间跳转和传递参数
参数为array
J("show") 为转到本路由方法show
J("show",array("id"=>555)) 为转到本路由方法show 并传递参数ID过去
J(R("member"),"list") 将跳转到member路由上面并调用list方法 如果没有list那么默认为index方法,具体框架中设置的默认方法。
J("member")
J("member","list",array("userid"=>999))


hasOne hasMany ManyhasMany ORM(Object-Relational Mapper) 对象关系影射有三种可以在"map"=>"hasOne"这里更改


<?php
class supplyModel extends supplyBase{
var $mapper=array("Books"=>array("map"=>"hasOne","TargetModel"=>"booktype","localFiled"=>"typeid","targetFiled"=>"typeid"));
var $maps;
}

$supply=M("supply");
$supply->get(3,4)->up();
echo ($supply->Books->classname);//自动取得Books中内容
print_r($supply->record);
echo $supply->Books->Supply->title; //反过来取supply中的内容
print_r(M("booktype")->record);//booktype中已有对像关系了

[解决办法]
稍微简单了一点,如果要获取userid和language大于1和小于5的对象该怎么办?
[解决办法]
那使用where条件
[解决办法]
__autoload不会弹出错误
还把问题统一起来
[解决办法]
学习学习学习~~~~~~~~~~~
[解决办法]

[解决办法]
哈哈,php版ssh 不错。 不过就是觉得太java了。

我觉得应该多用用php的语言特性。 把这个搞得php点。 不然我估计很多的phper应该是没什么意图的。

毕竟过程式编程,他们非常的习惯了。 比如说 $this->response->writeln这个, 我相信绝大部分人更愿意

echo ; 毕竟要少敲好多字符。 ssh毕竟是java的。 ssh是在java里实现飞ioc mvc aop orm

在php可能会有更简洁,更好的表现形式。肺腑之言。希望楼主不要建意。


[解决办法]
最近研究yii框架,也没接触过其他框架
[解决办法]
原生PHP开发,要用框架选ZF,至于所谓的豌豆框架...............
[解决办法]

探讨
原生PHP开发,要用框架选ZF,至于所谓的豌豆框架...............

[解决办法]

up 一个











[解决办法]
自由框架.. . . ..

读书人网 >PHP

热点推荐