Как я могу получить несколько подпапок / пространств имен в модуле ZF2

0

Позвольте мне начать с того, что я относительно новичок в Zend Framework. Я пытаюсь создать API с помощью ZF2, и для этого я пытаюсь создать структуру, которая позволяет мне группировать ресурсы. Почти во всех примерах, которые я прошел, я видел, что люди используют стандартную настройку:

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

Однако я не большой поклонник подхода "носок-ящик" и люблю группировать вещи. Это то, что я пытаюсь выполнить:

Изображение 174551

Каждая папка Controller и Entity имеет собственный класс 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',
            ),
        ),
    );
}

Я setup my 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, не найденную. Я прошел этот пост:

Несколько пространств имен в одном модуле в ZF2

Что говорит мне, что я на правильном пути, но я не уверен, почему мой путь не найден.

Теги:
zend-framework2

2 ответа

0
Лучший ответ

Проблема на самом деле была довольно простой; ошибка 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 на исходном посту также был тем, что нужно было исправить, прежде чем я придумаю рабочий пример.

1

Ваша конфигурация и ваш фактический класс не совпадают. Вы объявили класс контроллера как Auth\User\Controller\UserController, но все в вашем конфиге предполагает, что вы действительно хотите, чтобы он был просто User\Controller\UserController. Если это так, измените объявление пространства имен в своем классе на:

namespace User\Controller;

Если после этого все еще не сработает, нам понадобится дополнительная информация: какой путь дает вам 404, и что конкретно говорит страница 404 об ошибке (класс контроллера не найден?)

  • 0
    Ах да, это было то, что я определенно пропустил. Но это не было причиной, почему это не работало. Я ответил на свой вопрос, если у кого-то есть такая же настройка / проблема.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню