我不是一个巨魔,我的目标不是开始一场火焰战;我不是不尊重Zend框架的作者:它有很多很好的工作。但是......我有一份工作要完成,而且我很难协调ZF的受欢迎程度与使用它构建应用程序的现实。我真的想知道其他人为什么使用Zend Framework。
我对PHP世界还很陌生,但我已经用很多语言做了很多编程。在阅读了许多教程并在其中构建了几个应用程序后,一些核心Zend Framework工具对我来说就像是alpha代码。对我来说,除了其他方面之外,以下基本弱点似乎太过于无法考虑使用它来部署应用程序 - 但是ZF一再被建议作为其中一个,如果不是 领先框架。
首先让我说我发现ZF的大部分都是可行的。路由工作非常适合,布局工具是可维护的(虽然与模板系统(如JSP / ASP)非常不同),缓存设施等也是如此。社区中似乎有一种趋势,即填充大量建模(例如验证)和查看逻辑(例如$ this-> headScript() - 为什么我的控制器必须关心我的视图需要哪个js文件?)到控制器中但可能是使用问题而不是必然我>框架的错误。
现在我在短时间内遇到了一些非常严重(IMO)的弱点。如果我继续用它构建,我会想象未来我会发现的其他领域。
1。表格布局
许多人似乎对缺乏对表单布局的控制感到不满。你怎么能有一个流行的框架,构建一个简单的表单需要这么多的讨论?
Question 1和question 2。
2。认证/授权
似乎没有人真正理解如何简单地执行例行认证/授权。人们[包括你的人]真正努力实现简单的访问控制。此外,该方法似乎依赖于持久性的序列化,而不是传统的用户和权限的数据库存储。
A confusing example,a proposal to enhance the facility,a tutorial - part I,
and part II。这是太多的工作了!
我认为的弱点不是真实的,或者某种程度上不是问题?为什么或者为什么不?你为什么选择Zend Framework(或不)?您是否发现其他区域如此痛苦以至于您想要将ZF转换为其他方法?感谢您的意见。
答案 0 :(得分:17)
因为他们擅长营销
Zend的创始人Andi Gutmans和Zeev Suraski是PHP的主要贡献者
他们拥有最完整的php框架之一。
当你想到它;这就像说:
“我们的语言不尽如人意,因此我们制作了一个带缓存的框架,使其更快”
答案 1 :(得分:15)
ZF的一个主要好处是,您可以使用它的任何一个组件,并轻松地将它们与您自己的(或第三方)框架绑定,并进行最少的修改。
答案 2 :(得分:6)
表单:装饰器方法很复杂,但对于具有多种形式的应用程序而言,它是防弹且无价的。如果表单中有10个或25个项目,则无关紧,样式始终相同。当您知道如何使用它时,可以为您节省大量的工作。 对于思维和目标更简单的用户,始终存在viewScript装饰器;)
Auth / Acl:从未遇到任何问题。
Zend_Auth::getInstance()->hasIdentity() //logged in
和
Zend_Auth::getInstance()->getIdentity()->role; //returns admin
对于Acl:
$acl->isAllowed($who, $where, $what);
$acl->isAllowed('roleAdmin', 'resourcePosts', 'create'); //returns true
可以轻松修改以匹配MVC:
$acl->isAllowed('roleAdmin', $module.ucfirst($controller), $action); //returns true
$acl->isAllowed('roleAdmin', 'adminPosts', 'create'); //returns true
答案 3 :(得分:6)
使用ZendFramework为我着色。使用Zend Framework就像将一组训练轮焊接到您的代码中。您可以在Zend Framework中执行的任何操作都可以在原始PHP中执行。 (记住ZF本身是用原始PHP编写的。)而且你通常可以使用相同数量的代码行来完成它 - 以与应用程序其余部分一致的方式编写。而且,通过使用本机PHP代码,您不会被锁定在只有少数PHP开发人员使用的小众工具中。而且您不必担心与ZF版本的更改兼容。
在我的应用程序中,我做了与ZF工具相同的事情,主要是使用已存在多年的简单PHP函数:
我无法在Zend Framework中发现任何值得我花时间的东西。并且不要让我开始咄咄逼人的脚手架" CodeCoffin,AppShackler或Ruby in Chains等框架。
答案 4 :(得分:3)
ZF是一个很好的起点。我使用zend_tool生成我的中型应用程序的MVC骨架,并使用了许多其他组件(Zend_Cache,电子邮件,翻译,表单,会话)。
我同意如果你试图像Zend所说的那样使用装饰器来完成表单布局。有一些方法可以只使用Zend_Form元素进行验证,并在自定义布局中使用 - 没有装饰器。
我对Zend Cookies的体验很糟糕 - 我无法为整个域设置cookie。老好的setcookie做对了。
关于Acl - 再次,Zend文档和Zend_Acl中的示例有时不能很好地工作。我使用了Controller插件方法和我自己的“基于角色的资源管理”来控制权限。
我甚至没有尝试使用Zend Data Gateway - 而是使用了Doctrine(我猜这是因为我喜欢nHibernate :))并且连接Doctrine非常简单。
我认为ZF很好,因为你可以随意使用它。我认为对其他一些框架来说会更难。
答案 5 :(得分:2)
构建中型应用程序的简单性。 在ZF之前,您必须构建自己的“框架”来执行中型应用程序。现在更简单了。
我认为脱钩和可以独立使用的简单元素是成功的关键。是一个很好的功能,但不是常规使用。
支持和社区siz e与其他框架的平衡相关。
就速度而言,它们并不比其他框架更好。
答案 6 :(得分:2)
好吧,我们是开发人员,因为我们应该能够编写“部分”我们自己的代码,不是吗?框架不应该是向导,只是一个额外的帮助。
答案 7 :(得分:1)
我没有选择Zend Framework,因为在我评估PHP框架时,它并不是一个完整且集成度足以构建Web应用程序的解决方案。我选择了symfony,从那以后我就没有必要切换到其他任何东西了。
我不确定它现在是否相同,但我一直认为ZF是一个组件库而不是框架。框架具有更严格的操作规则,并且通常具有更好的集成支持工具来帮助人们执行这些操作。在这方面,组件库更加松散。当框架规则符合框架领域中大多数应用程序的要求时,我自己显然更喜欢这个解决方案。 symfony对我来说就是这种情况。我根据需要使用某些ZF组件,但从不将我的项目建立在ZF本身上。
答案 8 :(得分:1)
我使用ZF有几个原因: 漂亮的类的主机,类的延迟加载,类的独立使用和干净清晰的源。我第一次使用它时需要构建一个ACL系统 - 一个非常复杂的系统。 Zend_Acl帮了大忙。
我认为ZF需要处理它的docs和db类。 db类问题与PHP本身有很大关系。所以也许这是Zend想要研究的东西。
OP是PHP的新手。我同意PHP有它的缺点,例如函数的任意命名,但通常它对HTTP有意义并且不会隐藏你的现实。
答案 9 :(得分:1)
表格布局:
这真的很容易。装饰者在你第一次接触它们时会很痛苦,它们只是黑魔法。然后你意识到它们是多么有用,你几乎可以用它们做任何事情。当你最终达到装饰器不够的程度时,你可以在视图中渲染单独的表单元素,甚至可以编写自己的表单HTML。考虑这个例子:
形式
$text = new Zend_Form_Element_Text('text');
$text->addValidator('NotEmpty')->setRequired();
$submit = new Zend_Form_Element_Submit('submit');
视图
<form>
<input type="text" id="text" name="text" />
<input type="submit" id="submit" name="submit" value="Send" />
</form>
控制器:
$form = new Form_Whatever();
if ($this->_request->isPost()) {
if ($form->isValid($this->_request->getPost()) {
// code
}
}
你去吧。您有一个表单,您手动编写了HTML,但您仍然可以从ZF的内置验证中受益。为什么?因为您仍然在控制器中创建表单对象并将其通过POST发送给它。你仍然可以得到你想要的过滤器,验证器和任何东西。使用您想要的任何HTML。如果你想要极端,你也可以将外部视图插入到表单中。)。
哦,顺便问一下,你知道你的表格是可以重复使用的吗?是的,你可以写一个表格并在多个地方使用它。没有麻烦。这就是我个人喜欢ZF中的表单(并且不喜欢CodeIgniter - 顺便说一句,这也是一个很棒的框架)。
<强>认证强>
Zend Framework: Login password hash, email validator?
是的,它只是一小段代码。您基本上将其复制并粘贴到项目中。
对于ACL,您只需创建规则,然后在需要时检查它们。一个班轮。不能简单。
就个人而言,我认为ZF很受欢迎,因为它只是节省了你的钱。如果你把我放在一个项目的前面,我可以向你保证,如果你让我使用ZF代替我知道的另一个框架,我会快两倍。可能只有一小部分时间我需要在基线PHP中完成所有工作。这就是它:节省时间=省钱。或者赚取额外的钱 - 但是这两个规则中的任何一个,对吧?
答案 10 :(得分:1)
无需使用Zend_Form或Decorators本身。您可以只使用纯HTML表单,然后在Controller = Actions内部使用Zend_Filter_Input。所以你们两个世界都是最好的。
public function indexAction()
{
$this->view->title = 'Search Results';
$filters = array('q' => array('StringTrim' , 'StripTags'));
$validators = array('q' => array('presence' => 'required'));
$input = new Zend_Filter_Input($filters, $validators, $_GET);
if ($input->isValid()) {
$this->view->messages = '';
$q = $input->getEscaped('q');
$this->view->q = $q;
// do search
try {
$index = News_Search_Lucene::open(
SearchIndexer::getIndexDirectory());
$results = $index->find($q);
} catch (Exception $e) {
$results = array();
}
$this->view->results = $results;
} else {
$this->view->messages = $input->getMessages();
}
}
答案 11 :(得分:0)
我不确定ZF是否真的是最受欢迎的PHP框架。我将它与其他框架进行比较后选择了它,这些框架“神奇地”做了更多的东西,因为它们似乎都难以定制。
我认为ZF是一个很好的面向对象的PHP MVC框架,但我不同意一些ZF方法。例如,我只使用Zend_Form进行过滤和验证数据。所有HTML和演示文稿都在视图脚本中完成。 CSS负责布局。如果我们需要一些更改,大多数时候只更改CSS就足够了。如果我需要在许多页面中显示相同的表单,我将其用作部分视图脚本。
我不想为每个Model编写Mapper并为每个数据库表创建一个Zend_Db_Table子类。相反,我正在研究如何使用其他模式进行数据访问,或者可能是Doctrine。
我不喜欢Zend_Acl是将ACL信息存储在ACL文件中。我想将这些信息存储在数据库中。
关于这个框架的好处是很容易让事情顺利进行。
答案 12 :(得分:0)
除了之前的答案之外,值得一提的是,在DZone最近的一个名为Which PHP framework would you use today for a brand new application?的池中,Zend Framework被选为新项目的最佳选择。