Zend Framework中DB模型的位置 - 希望它们集中化

时间:2010-06-17 12:37:05

标签: php zend-framework

也许我一直在盯着这个问题太长时间,这比我想象的要简单得多,但我现在卡住了。

我有三个网站将共享数据库模型。我构建了我的应用程序,以便每个站点都有一个应用程序目录,每个站点都有一个公共目录。 DB模型与Zend Framework和我的第三方库一起存在于库中的目录中。我使用Autoloader类,当我尝试实例化我的一个DB类时,它失败了。库目录位于我的include路径中,但无论出于何种原因,它都拒绝实例化我的类。

如果我的模型在我的应用程序目录中,它将起作用,但这不是重点。它们应该是库中的共享类。

$model = new Model_Login();
$model->hello_world();

当它在库中时失败。这堂课只是一个考验:

 class Model_Login
 {
     public function hello_world()
     {
        echo "hello world";
     }
 }

一切正常,直到我尝试实例化我的一个模型。我甚至尝试将类重命名为其他东西(Db_Login),但这也不起作用。有任何想法吗?提前谢谢。

Bootstrap中的Autoloader:

$autoloader = new Zend_Application_Module_Autoloader(array(
       'namespace' => '',
       'basePath'  => dirname(__FILE__),
));

4 个答案:

答案 0 :(得分:3)

在你的引导程序中使用

 protected function _initAutoload() {

    $autoloader = new Zend_Application_Module_Autoloader(array(
                'namespace' => 'Default_',
                'basePath' => dirname(__FILE__),
            ));
    $autoloader->addResourceType('models', 'models/', 'Models');
    return $autoloader;
}

然后只需命名您的对象:

$model = new Default_Models_Login();
$model->hello_world();

答案 1 :(得分:1)

我会使用库目录来存储所有这些模型。该目录可以由所有站点共享。

我有以下目录:

应用

  • CONFIGS

  • 模型

  • 控制器

  • 视图

图书馆

  • myns名字

  • 的Zend

公共

我的配置我有:

includePaths.library = APPLICATION_PATH "/../library"
autoloaderNamespaces.Myns = Myns_

允许我在Myns中存储文件并调用: Myns_Login

答案 2 :(得分:1)

好的,您正在引导程序中使用模块自动加载器。它被设计用于模块引导,因为它只搜索一个目录树(通常是应用程序/模块中的特定目录),而不是使用包含路径。它可以在主引导程序中用作默认模块的自动加载器,这就是为什么当你将它放在应用程序/模型中时你的类工作。

我认为您想切换到使用标准自动加载器。

我假设你的引导课你现在有这样的东西:

protected function _initAutoloader()
{
    $autoloader = new Zend_Application_Module_Autoloader(array(
        'namespace' => '',
        'basePath'  => dirname(__FILE__),
    ));

    return $autoloader;
}

将其更改为:

protected function _initAutoloader()
{
    $autoloader = Zend_Loader_Autoloader::getInstance();
    $autoloader->setFallbackAutoloader(true);

    return $autoloader;
}

这将设置自动加载器(默认情况下也会为Zend Framework类设置自动加载),然后告诉它将此自动加载器用于任何不匹配的命名空间(因为您的类没有命名空间)。使用这种方法,您可以将使用PEAR命名约定的任何类放入库目录中,并在代码中使用它。

或者你可以这样做:

protected function _initAutoloader()
{
    $autoloader = Zend_Loader_Autoloader::getInstance();
    $autoloader->registerNamespace('Model');

    return $autoloader;
}

设置自动加载器,然后告诉它使用此自动加载器作为命名空间“Model”,它将匹配您的Model_Login类。

答案 3 :(得分:1)

嗯,我有类似的问题,花了半天时间试图解决这个问题。在试验之后,您实际上可以坚持使用模块的默认自动加载器:

protected function _initAutoload() {

   $autoloader = new Zend_Application_Module_Autoloader(array(
            'namespace' => 'Default_',
            'basePath' => dirname(__FILE__),
        ));
   $autoloader->addResourceType('models', 'models/', 'Models');
   return $autoloader;
}

确保相应地调整basePath值,以便它可以获取Application文件夹中的Model文件夹。

对于我的,我使用3x dirname修复它,因为模型文件夹几乎没有升级我的模块引导程序文件。申请>模块>默认