【问题标题】:Where's the best place to store application specific non-model classes in a Zend Framework app?在 Zend Framework 应用程序中存储应用程序特定的非模型类的最佳位置在哪里?
【发布时间】:2011-01-12 10:26:04
【问题描述】:

假设模型是“应用程序所依据的数据的特定领域表示”。 [Wikipedia: MVC]、服务、表单、插件类等不被视为模型的一部分,因此它们位于/application 下的自己的目录中。默认资源自动加载器为我们设置了这个,所以MyApp_Form_Login 会自动在/application/form/Login.php 中找到。

对于我的应用程序,我需要编写一个自定义身份验证适配器。其中的逻辑将是特定于应用程序的,因此它不是可重用的库代码,因此它不属于/library/MyApp。它不是服务类,所以它不属于/application/service,也不属于表单等。那么,按照习惯,这个类应该存储在哪里?

【问题讨论】:

    标签: zend-framework architecture


    【解决方案1】:

    您可以在 application 文件夹中创建其他文件夹,并在 Bootstrap 类中添加资源路径。

    例如,假设您为“应用程序”的所有应用程序特定类(模型、表单、插件等)使用命名空间,您可以使用以下内容:

    protected function _initAutoloader()
    {
        $autoloader = new Zend_Application_Module_Autoloader(array(
                'basePath' => APPLICATION_PATH,
                'namespace' => 'Application',
            ));
        $autoloader->addResourceType('MyType', APPLICATION_PATH . '/mytypes');
        return $autoloader;
    }
    

    然后你可以在文件application/mytypes/Foo.php 中存储一个名为Application_MyType_Foo 的类。

    如果您查看 Zend_Application_Module_Autoloader 的代码,那基本上就是他们为您提供模型、表单、插件等的自动加载所做的工作。

    【讨论】:

      【解决方案2】:

      只需创建一个特定于应用程序的库。通常这样的课程并不是个人图书馆的唯一候选者。

      【讨论】:

      • 它肯定不属于库,因为它不能跨不同的应用程序重用。它将取决于在注册表中设置和可用的特定于应用程序的配置选项(因此取决于是否有可用的注册表)。在我看来,应用程序代码和库代码之间存在双向依赖关系很奇怪。
      • 这就是我称之为“应用程序库”的原因;)它的库,特定于您的应用程序。稍后您将看到其他类,因为您将找不到适用的模块或子目录。但是:在实例化时(或者可能稍后)将选项注入到您的对象中,而不是相反。您的课程无法通过这种方式进行测试。无论如何,将注册表作为“数据容器”是不好的风格。
      • 是的,依赖注入是可行的方法,我只是举例说明。我仍然觉得为这种类型的类创建一个库的想法很奇怪。例如,是什么让插件如此特别,以至于它们在/application 中获得了一个目录,但身份验证适配器却没有?
      【解决方案3】:

      一种方法是创建一个服务类(我们知道它们在哪里:/application/service),它封装了特定于应用程序的身份验证逻辑。它可以使用库类来进行基本的身份验证,例如根据数据库检查用户名和密码,然后在将结果返回给客户端代码之前应用特定于应用程序的逻辑。

      例子:

      class MyApp_Service_User {
        public function authenticate($sUsername, $sPassword) {
          $oAuth = Zend_Auth::getInstance();
          $oAuthAdapter = new Zend_Auth_Adapter_DbTable(...);
          $oResult = $oAuth->authenticate($oAuthAdapter);
      
          /* Application-specific logic */
      
          return $oAppSpecificAuthResult;
        }
        ...
      }
      

      【讨论】:

        【解决方案4】:

        我最近回答了一个类似的问题,看看下面的链接,看看这是否有帮助! ;)

        Zend autloading different namespaces from the same directory?

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-02-09
          • 2023-04-10
          • 1970-01-01
          • 1970-01-01
          • 2011-05-15
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多