【问题标题】:Why is Zend Framework so popular?Zend Framework 为何如此受欢迎?
【发布时间】:2010-12-22 10:24:07
【问题描述】:

我不是巨魔,我的目标不是发动一场火焰战争;我也不是要不尊重 Zend 框架的作者:其中有很多出色的工作。但是...我有一项工作要完成,我很难在 ZF 的流行与使用它构建应用程序的现实之间取得平衡。我真的很想从其他人那里知道他们为什么使用 Zend Framework。

我对 PHP 世界还很陌生,但我用多种语言编写了大量程序。在阅读了许多教程并在其中构建了几个应用程序之后,Zend Framework 的一些核心功能对我来说就像是 alpha 代码。对我来说,以下基本弱点(除其他外)似乎过于强大,无法考虑使用它来部署应用程序 - 但一次又一次,ZF 被建议作为领先框架之一。

首先让我说我发现 ZF 的大部分内容都是可行的。路由可以正常工作,布局工具是可用的(尽管与 JSP/ASP 等模板系统有很大不同),缓存工具等也是如此。社区似乎倾向于填充大量建模(例如验证)和视图逻辑(例如 $this->headScript() - 为什么我的控制器必须关心我的视图需要哪个 js 文件?)到控制器中,但可能是使用问题,而不是必要 框架的错误。

现在,我在短时间内遇到了几个非常严重的 (IMO) 弱点。如果我继续用它来构建,我会不寒而栗地想象未来我会发现的其他领域。

1.表单布局
许多人似乎对表单布局缺乏控制感到不满。你怎么能有一个流行的框架来构建一个简单的表单需要这么多讨论? Question 1question 2

2。身份验证/授权
似乎没有人真正了解如何简单地执行例行身份验证/授权。人们 [包括你的真正] 努力实现简单的访问控制。此外,该方法似乎依赖于序列化来实现持久性,而不是传统的用户和权限数据库存储。 A confusing example, a proposal to enhance the facility, a tutorial - part I, and part II。伙计们的工作量太大了!

我察觉到的弱点是不是真的,或者在某种程度上不是问题?为什么或者为什么不?为什么选择 Zend Framework(或不选择)?您是否发现其他领域非常痛苦以至于您想放弃采埃孚以采用不同的方法?感谢您的意见。

【问题讨论】:

    标签: php zend-framework


    【解决方案1】:

    因为他们擅长营销


    Zend 的创始人 Andi Gutmans 和 Zeev Suraski 是 PHP 的主要贡献者

    他们拥有最完整的 php 框架之一。

    当你想到它时;就像在说:

    “我们的语言没有达到应有的性能,因此我们制作了一个带有缓存的框架,使其更快”

    • Zend 提供的大部分功能都可以完成 没有 Zend。
    • 但是Zend的包很不错 “一体化”分发。
    • 他们提供认证和培训。

    【讨论】:

    • 嗯,这是对“为什么 Zend Framework 如此受欢迎?”的简短解释
    • +1 我同意。有一个营销因素,这是肯定的
    • 事实上,销售认证之类的东西对于他们的大多数客户来说是一个非常好的营销策略:Zend 之于 php,就像 cisco 之于网络。
    • “Zend 提供的大部分功能,可以在没有 Zend 的情况下完成。”我没明白这一点:)就像“你可以用刀做的大多数事情都可以不用刀来做”(用砍刀、剑等其他东西;))。
    • 公司和人力资源部门喜欢认证。据我所知,Zend Framework 是唯一获得认证的 PHP 框架。
    【解决方案2】:

    ZF 的主要优点之一是您可以使用它的任何一个组件,并轻松地将它们与您自己(或第三方)的框架结合起来,只需极少的修改。

    【讨论】:

    • +1。我第一次使用 Zend Framework 时,我只是在使用 Zend Lucene,所以我只使用了它。这让我相信 Zend 是可行的。但是,我不得不承认,如果将其用于应用程序的各个方面,我觉得它是可怕的
    【解决方案3】:

    表单: 装饰器方法很复杂,但对于具有多种表单的应用程序来说是防弹且无价的。您不在乎表单中有 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
    

    【讨论】:

    • 也许我的想法对 ZF 来说太简单了...关于 Auth/Acl:您能否指出一个完整详细说明 [作为可下载和可运行代码] 如何使用当前 Zend 的公共示例或教程框架版本(1.9,没有“提案”或“实验室”)来管理三个不同角色(例如访客、成员、管理员)的三个用户/密码的身份验证/授权,以保护默认模块中的三个不同控制器?这对新人会有帮助;如果它存在于我没有找到的地方。
    • 不知道。但是我已经很好地处理了 Zend_Acl 和 Zend_Auth 的手册页。唯一的问题 - 在哪里处理 ACL - 使用前端控制器插件和它的 preDispatch 方法。
    【解决方案4】:

    用 ZendFramework 给我上色。使用 Zend Framework 就像将一组训练轮焊接到您的代码中。在 Zend Framework 中可以做的任何事情都可以在原始 PHP 中做。 (请记住 ZF 本身是用原始 PHP 编写的。)您通常可以使用相同数量的代码来完成它 - 以与应用程序的其余部分一致的风格编写。而且,通过使用原生 PHP 代码,您不会被锁定在只有少数 PHP 开发人员使用的利基工具中。而且您不必担心与 ZF 版本变化的兼容性。

    在我的应用程序中,我使用 ZF 工具所做的所有事情,主要是使用已经存在多年的简单 PHP 函数:

    • 验证表单数据
    • 清理表单输入
    • 处理通过表单上传的文件
    • 处理和比较日期
    • 处理身份验证
    • 发送电子邮件
    • 写入日志文件
    • 从配置文件中读取
    • 读取外部 HTTP 页面
    • 以 JSON 和 SOAP 格式交换
    • 使用第三方 API

    我在 Zend Framework 中找不到太多值得我花时间的东西。不要让我开始使用霸道的“脚手架”框架,例如 CodeCoffin、AppShackler 或 Ruby in Chains。

    【讨论】:

    • 哈哈,霸道的脚手架+1 :)
    【解决方案5】:

    ZF 是一个很好的起点。我使用 zend_tool 来生成我的中型应用程序的 MVC 框架,并使用了许多其他组件(Zend_Cache、电子邮件、翻译、表单、会话)。

    而且我同意如果您按照 Zend 所说的那样尝试使用装饰器,表单布局会很复杂。有一些方法可以在验证和自定义布局中仅使用 Zend_Form 元素 - 无需装饰器。

    我对 Zend Cookies 的体验很糟糕 - 我无法为我的整个域设置 cookie。老好的 setcookie 做得对。

    关于 Acl - Zend 文档和 Zend_Acl 中的示例有时不能很好地工作。我使用控制器插件方法和我自己的“基于角色的资源管理”来控制权限。

    我什至没有尝试 Zend Data Gateway - 而是使用了 Doctrine(我想那是因为我喜欢 nHibernate :))而且连接 Doctrine 真的很容易。

    我认为 ZF 很好,因为您可以随心所欲地使用它。我认为使用其他一些框架会更难。

    【讨论】:

      【解决方案6】:

      轻松构建中等规模的应用程序。 在 ZF 之前,您必须构建自己的“框架”来执行中型应用程序。现在简单多了。

      我不认为解耦和可以独立使用的简单元素是成功的关键。是一个不错的功能,但不是经常使用。

      支持社区规模与其他框架的平衡相关。

      就速度而言,它们并不比其他框架好。

      【讨论】:

      • 就速度而言,您指的是 PHP 框架,对吗?
      【解决方案7】:

      嗯,我们是开发人员,因为我们应该能够编写“一些”我们自己的代码,不是吗?框架不应该是向导,只是一个额外的帮助。

      【讨论】:

        【解决方案8】:

        我没有选择 Zend Framework,因为在我评估 PHP 框架的时候,它还不是一个完整和集成的足够的解决方案来构建 Web 应用程序。我选择了symfony,从那以后我再也不需要切换到其他任何东西了。

        我不确定现在是否也一样,但我一直认为 ZF 是一个组件库而不是一个框架。框架有更严格的做事规则,并且通常有更好的集成支持工具来帮助人们做事。在这方面,组件库更加松散。当框架规则对应框架领域中大多数应用程序的要求时,我自己显然更喜欢这种解决方案。对我来说,symfony 就是这种情况。我确实会根据需要使用某些 ZF 组件,但我的项目从不基于 ZF 本身。

        【讨论】:

        • 我非常同意这一点,我来自 CakePHP/Rails 背景,你只需要做大量的工作才能得到一个表格,这不是获得一个最快的方法webapp 正在运行。
        【解决方案9】:

        我使用 ZF 有几个原因: 漂亮类的宿主,类的懒加载,类的独立使用,干净清晰的源码。第一次使用它时,我需要构建一个 ACL 系统——一个非常复杂的系统。 Zend_Acl 帮助很大。

        我认为 ZF 需要处理它的 docs 和 db 类。 db 类问题与 PHP 本身有很大关系。所以也许这是 Zend 想要研究的东西。

        OP 是 PHP 的新手。我同意 PHP 有它的缺陷,例如函数的任意命名,但通常它对 HTTP 是有意义的,并且不会向你隐藏现实。

        【讨论】:

          【解决方案10】:

          表单布局:

          这真的很容易。装饰器在您第一次接触时会让人头疼,它们只是黑魔法。然后你会意识到它们是多么有用,你几乎可以用它们做任何事情。当您最终遇到装饰器不够用时,您可以在视图中呈现单独的表单元素,甚至编写自己的表单 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 中做所有事情的时间的一小部分。就是这样:节省时间=省钱。或者为您赚取额外的钱 - 但两个规则中的任何一个,对吗?

          【讨论】:

            【解决方案11】:

            不需要使用 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();
                    }
                }
            

            【讨论】:

              【解决方案12】:

              我不确定 ZF 是否真的是最流行的 PHP 框架。在将它与其他“神奇地”做更多事情的框架进行比较后,我选择了它,因为它们似乎都很难定制。

              我认为 ZF 是一个很好的面向对象的 PHP MVC 框架,但我不同意 ZF 的一些方法。例如,我只使用 Zend_Form 来过滤和验证数据。所有的 HTML 和演示文稿都是在视图脚本中完成的。 CSS负责布局。如果我们大部分时间都需要一些更改,那么只更改 CSS 就足够了。如果我需要让同一个表单出现在许多页面中,我将其用作部分视图脚本。

              我不喜欢为每个模型编写一个映射器并为每个数据库表创建一个 Zend_Db_Table 子类。相反,我正在研究如何使用其他模式进行数据访问,或者可能是 Doctrine。

              我不喜欢 Zend_Acl 将 ACL 信息存储在 ACL 文件中。我想将该信息存储在数据库中。

              这个框架的好处是很容易按照自己的方式做事。

              【讨论】:

                【解决方案13】:

                除了前面的答案,值得一提的是,在最近 DZone 的一个名为 Which PHP framework would you use today for a brand new application? 的池中,Zend Framework 被选为新项目的最佳选择。

                【讨论】:

                  猜你喜欢
                  • 2015-05-23
                  • 1970-01-01
                  • 2010-10-20
                  • 2021-02-20
                  • 1970-01-01
                  • 2016-01-20
                  • 1970-01-01
                  • 1970-01-01
                  • 2017-10-10
                  相关资源
                  最近更新 更多