Позвольте мне начать с того, что я относительно новичок в Zend Framework. Я пытаюсь создать API с помощью ZF2, и для этого я пытаюсь создать структуру, которая позволяет мне группировать ресурсы. Почти во всех примерах, которые я прошел, я видел, что люди используют стандартную настройку:
ModuleA
->src
->ModuleA
->Controller
->Entity
Однако я не большой поклонник подхода "носок-ящик" и люблю группировать вещи. Это то, что я пытаюсь выполнить:
Каждая папка 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
Что говорит мне, что я на правильном пути, но я не уверен, почему мой путь не найден.
Проблема на самом деле была довольно простой; ошибка 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 на исходном посту также был тем, что нужно было исправить, прежде чем я придумаю рабочий пример.
Ваша конфигурация и ваш фактический класс не совпадают. Вы объявили класс контроллера как Auth\User\Controller\UserController
, но все в вашем конфиге предполагает, что вы действительно хотите, чтобы он был просто User\Controller\UserController
. Если это так, измените объявление пространства имен в своем классе на:
namespace User\Controller;
Если после этого все еще не сработает, нам понадобится дополнительная информация: какой путь дает вам 404, и что конкретно говорит страница 404 об ошибке (класс контроллера не найден?)