【问题标题】:How can I get multiple subfolder/namespaces in a ZF2 module如何在 ZF2 模块中获取多个子文件夹/命名空间
【发布时间】:2014-11-05 11:56:17
【问题描述】:

首先让我说我对 Zend 框架比较陌生。我正在尝试使用 ZF2 创建一个 API,为此我正在尝试设置一个允许我对资源进行分组的结构。在我经历的几乎所有示例中,我都看到人们使用标准设置:

ModuleA
  ->src
    ->ModuleA
      ->Controller
      ->Entity

不过,我不是“袜子抽屉”方法的忠实拥护者,而是喜欢将事物分组。这就是我想要完成的:

每个控制器和实体文件夹都有自己的控制器和实体类。在 Module.php 中,我将不同的命名空间添加到 AutoLoader,如下所示:

public function getAutoloaderConfig()
{
    return array(
        'Zend\Loader\ClassMapAutoloader' => array(
            __DIR__ . '/autoload_classmap.php',
        ),
        'Zend\Loader\StandardAutoloader' => array(
            'namespaces' => array(
                'User' => __DIR__ . '/src/User',
                'Permission'   => __DIR__ . '/src/Permission',
                'Group'  => __DIR__ . '/src/Group',
            ),
        ),
    );
}

我已经设置了我的 module.config.php,例如:

'controllers' => array(
    'invokables' => array(
        'Auth\Controller\User' => 'User\Controller\UserController',
        'Auth\Controller\Permission' => 'Permission\Controller\PermissionController',
        'Auth\Controller\Group' => 'Group\Controller\GroupController',
    ),
),

'router' => array(
    'routes' => array(
        'user' => array(
            'type' => 'segment',
            'options' => array(
                'route'    => '/user[/:id]',
                'constraints' => array(
                    'id'     => '[0-9]+',
                ),
                'defaults' => array(
                    'controller' => 'Auth\Controller\User',
                    'action'     => 'index',
                ),
            ),
        ),

我的 UserController 看起来像:

<?php
namespace Auth\User\Controller;

use Zend\Mvc\Controller\AbstractRestfulController;
use User\Entity\UserTable;
use Zend\View\Model\JsonModel;

class UserController extends AbstractRestfulController
{
protected $_objectManager;

public function indexAction()
{
   $users = $this->getObjectManager()->getRepository('\User\Entity\User')->findAll();
   $JSONArray = [];
   //Convert to JSON objects
   foreach ($users as $entity) {
       $JSONArray[] = $entity->getJsonData();
    }
    return new JsonModel(array('users' => $JSONArray));
}

我已经尝试了很多不同的命名空间案例,但我不断收到 404 not found 错误。我已经浏览了这篇文章:

Multiple namespaces under same module in ZF2

这告诉我我在正确的轨道上,但我不确定为什么找不到我的路径。

【问题讨论】:

    标签: php zend-framework2


    【解决方案1】:

    您的配置和您的实际课程不匹配。您已将控制器类声明为Auth\User\Controller\UserController,但配置中的所有内容都表明您实际上希望它只是User\Controller\UserController。如果是这样,请将类中的命名空间声明更改为:

    namespace User\Controller;
    

    如果之后仍然无法正常工作,我们将需要更多信息:什么路径给了您 404,以及 404 页面具体说明错误是什么(找不到控制器类?)

    【讨论】:

    • 啊,是的,那是我绝对错过的东西。但这不是它不起作用的原因。如果有人有相同的设置/问题,我已经回答了我自己的问题。
    【解决方案2】:

    这个问题其实很简单;我得到的 404 错误来自 Apache 而不是 Zend。我在原帖中没有提到这一点,因为我不知道 Zend 有自己的错误处理系统。在我的 httpd-vhost.conf 中,我没有设置 AllowOverride。这意味着 index.php 正在工作,但是 Zend 没有处理任何其他请求,因为它无法用 .htaccess 文件覆盖。

    <VirtualHost *:80>
         ServerName api.localhost
         DocumentRoot "path/to/public"
         SetEnv APPLICATION_ENV "development"
         ErrorLog "logs/localhost-error.log"
         CustomLog "logs/localhost-access.log" common
         <Directory "path/to/public/">
             DirectoryIndex index.php
             AllowOverride All <- this was AllowOverride none
             Order Allow,Deny
             Allow from all
             Require local
         </Directory>
    </VirtualHost>
    

    Tim Fountain 对原始帖子的评论也是在我得到一个工作示例之前必须修复的问题。

    【讨论】:

      猜你喜欢
      • 2013-03-24
      • 2011-04-13
      • 1970-01-01
      • 2021-02-17
      • 2013-11-24
      • 1970-01-01
      • 2013-11-04
      • 2015-11-06
      • 1970-01-01
      相关资源
      最近更新 更多