哪里是在Zend Framework应用程序中存储特定于应用程序的非模型类的最佳位置?

时间:2011-01-12 10:26:05

标签: zend-framework architecture

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

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

4 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

您可以在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_MyType_Foo中存储名为application/mytypes/Foo.php的类。

如果您查看Zend_Application_Module_Autoloader的代码,那么它们实际上是为了让您自动加载模型,表单,插件等。

答案 2 :(得分:0)

一种方法是创建一个服务类(我们知道这些服务的位置:/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;
  }
  ...
}

答案 3 :(得分:0)

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

Zend autloading different namespaces from the same directory?