【问题标题】:ZF2 model classes not found when moved to src\MyApp\Model\Repository移动到 src\MyApp\Model\Repository 时找不到 ZF2 模型类
【发布时间】:2014-01-16 17:42:58
【问题描述】:

我正在尝试将数据库表类移动到 \Model\Repository 而不是 \Model 的推荐位置,以便更好地分割模型代码。但是当我这样做时,它找不到课程。我对 ZF2 比较陌生,所以这可能很简单。我假设可以将模型类放入分段目录中,以便更好地分类模型类文件。

这行得通:

module\Client\src\Client\Model\ClientTable.php

从 Module.php 到 ClientTable.php 的路径:

    public function getServiceConfig() {
    return array(
        //  setup multiple table access by model as {tablename}Table
        'factories' => array(
            'Client\Model\ClientTable' => function($sm) {
                $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter');
                $table = new Model\ClientTable($dbAdapter);
                return $table;
            },
        ),
    );
}

但是尝试从 Repository 调用会破坏它并导致找不到类方法,但是如果它在 Module 目录中应该可以找到,对吧?

module\Client\src\Client\Model\Repository\ClientTable.php

从 Module.php 到 ClientTable.php 的路径:

    public function getServiceConfig() {
    return array(
        //  setup multiple table access by model as {tablename}Table
        'factories' => array(
            'Client\Model\Repository\ClientTable' => function($sm) {
                $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter');
                $table = new Model\Repository\ClientTable($dbAdapter);
                return $table;
            },
        ),
    );
}

【问题讨论】:

  • 听起来您在将模型类移动到 Repository 文件夹时没有更改其命名空间。即在您的ClientTable.php 文件中将namespace Client\Model; 更改为namespace Client\Model\Repository;
  • @Crisp - 在发布问题之前,我尝试按照您的建议添加命名空间 Client\Model\Repository。 :(

标签: zend-framework2


【解决方案1】:

您对类自动加载路径有疑问。您应该转到您的模块配置(module.config.php 和 module.php)并更新命名空间映射以指向文件的新位置。

例如,你将在 module.php 中有这样的函数

public function getAutoloaderConfig() {
    return array (
            'Zend\Loader\ClassMapAutoloader' => array (),
             'Zend\Loader\StandardAutoloader' => array (
                    'namespaces' => array (
                            __NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__,
                                "DBAL\\Entity" => __DIR__ . '/src/DBAL/Entity',
                            "DBAL\\Entity\\User" => __DIR__ . '/src/DBAL/Entity/User' 
                    ) 
            ) 
    )
    ;
}

这是我的一个项目的一段代码。如果您发布您的module.config.phpmodule.php,我可以为您提供更具体的帮助

可能您有一些映射指向src\MyApp\Model,您必须将它们更改为src\MyApp\Model\Repository

另外,请确保您移动的文件中有正确的 Client\Model\Repository 命名空间

【讨论】:

  • 解决方案注意事项:我不需要对我的 AutoloaderConfig() 进行任何更改。我更改了 Model/Repository 类的命名空间以包含 Repository,更改了引用它们的路径以在 Module.php::getServiceConfig() 和其他任何调用类方法的地方包含 Repository。还在学习这个东西,谢谢! :)
  • 太棒了!这一切一开始很混乱,但很快你就习惯了,很容易找到这种东西。
猜你喜欢
  • 2013-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-14
  • 1970-01-01
  • 2015-12-24
相关资源
最近更新 更多