Symfony2: Мой маршрут соответствует в консоли, а не в браузере. Вероятно, из-за конфигурации apache 2.4/php-fpm fcgi.

Я совершенно новичок в symfony, делаю свой первый исследовательский проект.

Я хочу создать REST API и установил FOSRestBundle.

В моей консоли вывод php app/console router:debug get_usuarios:

[router] Route "get_usuarios"
Name         get_usuarios
Path         /usuarios.{_format}
Host         ANY
Scheme       ANY
Method       GET
Class        Symfony\Component\Routing\Route
Defaults     _controller: MciAPIBundle:Usuarios:getUsuarios
             _format: NULL
Requirements _format: json|xml|html
Options      compiler_class: Symfony\Component\Routing\RouteCompiler
Path-Regex   #^/usuarios(?:\.(?P<_format>json|xml|html))?$#s

и: php app/console router:match /usuarios

Route "get_usuarios" matches
[router] Route "get_usuarios"
Name         get_usuarios
Path         /usuarios.{_format}
Host         ANY
Scheme       ANY
Method       GET
Class        Symfony\Component\Routing\Route
Defaults     _controller: MciAPIBundle:Usuarios:getUsuarios
             _format: NULL
Requirements _format: json|xml|html
Options      compiler_class: Symfony\Component\Routing\RouteCompiler
Path-Regex   #^/usuarios(?:\.(?P<_format>json|xml|html))?$#s

но когда я захожу в свой браузер и иду http://localhost:7080/usuarios, я получаю:

Object not found!

The requested URL was not found on this server. If you entered the URL manually please check your spelling and try again.

If you think this is a server error, please contact the webmaster.

Error 404

localhost

Я не понимаю: если он говорит (в консоли), что он совпадает, почему он не совпадает в браузере?

приложение/config/routing.yml

get_usuarios:
    type: rest
    resource: Mci\APIBundle\Controller\UsuariosController

РЕДАКТИРОВАТЬ: мне кажется, что контроллер даже не загружается. Если я добавляю мусор в этот контроллер, ничего не происходит, все та же ошибка 404

** РЕДАКТИРОВАТЬ 2: ** Я считаю, что это связано с моим веб-сервером 2.4 и php-fpm. Я использую новую установку Arch Linux, в которой установлен apache 2.4. С этой версией апача php нужно загружать (как вариант) с php-fpm через fcgi. Итак, у меня есть правило ProxyPassMatch ^/(..php(/.)?)$ fcgi://127.0.0.1:9000/var/www/html/$1. Может быть, это конфликтует с остальным API-контроллером? Потому что как URL-адрес /usuarios будет перенаправлен на фреймворк symfony...


person transient_loop    schedule 10.05.2014    source источник


Ответы (2)


Если вы посмотрите на вывод вашей команды php app/console router:debug get_usuarios:, вы увидите, что маршрут разрешен json|xml|html в качестве формата, но значение по умолчанию для вашего формата — NULL.

По умолчанию _controller: MciAPIBundle:Usuarios:getUsuarios
_format: NULL
Требования _format: json|xml|html

Это означает, что ваш параметр формата не является необязательным полем. Таким образом, вам нужно получить доступ к http://localhost:7080/usuarios.json или http://localhost:7080/usuarios.xml или http://localhost:7080/usuarios.html, чтобы получить доступ к этому ресурсу.

Теперь к ответу на ваш вопрос:

Я не понимаю: если он говорит (в консоли), что он совпадает, почему он не совпадает в браузере?

php app/console router:match /usuarios — это имитация совпадения информации о пути. то есть он просто находит соответствующий шаблон маршрутизатора.

Если вы хотите получить доступ к этому ресурсу с помощью http://localhost:7080/usuarios, вы должны указать параметр формат по умолчанию для своего маршрутизатора. Как:

get_usuarios:
    type: rest
    resource: Mci\APIBundle\Controller\UsuariosController
    defaults: { _format: json }
person xiidea    schedule 10.05.2014
comment
Очень подробный ответ, и я понял уже гораздо больше. Я добавил значения по умолчанию. Но я все еще получаю 404 (также с localhost:7080/usuarios.json, что в моих бесчисленных попытках пробовал и раньше, прежде чем добавлять значения по умолчанию...). Что еще может пойти не так? - person transient_loop; 10.05.2014
comment
Если все настроено соответствующим образом, это должно работать. Если только ваш getUsuariosAction не выдает NotFoundException исключение! - person xiidea; 10.05.2014
comment
спасибо за помощь, я понятия не имею, что происходит :( Все еще получаю 404, и ни dev.log, ни prod.log не показывают никаких ошибок - person transient_loop; 10.05.2014
comment
не могли бы вы ответить еще на один вопрос? 1. Вы получаете 404 только для этого маршрута? 2. Какой веб-сервер вы используете? 3. Какая версия PHP? - person xiidea; 11.05.2014

Хорошо, я нашел ответ.

Проблема была с моей конфигурацией веб-сервера. Я использую новую установку Arch Linux, в которой используется apache 2.4.

В apache 2.4 необходимо внести некоторые изменения в параметризацию php по умолчанию, чтобы иметь возможность запускать его с apache. Фактически, теперь мне пришлось настроить его для использования php-fpm и загрузки в apache через fcgi.

Таким образом, мне пришлось поместить правильную директиву ProxyPass в конфигурацию виртуального хоста, чтобы все заработало:

DocumentRoot /home/user/project/web    
ProxyPassMatch ^/(.*)$ fcgi://127.0.0.1:9000/home/user/project/web/app.php/$1

Примечательно, что директива ProxyPassMatch должна соответствовать ВСЕМ URL-адресам, а не только файлам php, поскольку я использую URL-адреса без окончания php для API (например, http://localhost:7080/usuarios)

person transient_loop    schedule 13.05.2014