Я хотел бы использовать сочетание yaml и php-маршрутизации в приложении Symfony (3.3.8). Мне очень удобно работать с yaml routing, поэтому я использовал bin/console doctrine:generate:crud
чтобы увидеть, как будет выглядеть PHP-маршрутизация. Он создал файл маршрутизации, который выглядит как
<?php use Symfony\Component\Routing\RouteCollection; use Symfony\Component\Routing\Route; $collection = new RouteCollection(); $collection->add('user_index', new Route( '/', array('_controller' => 'AppBundle:User:index'), array(), array(), '', array(), array('GET') )); // other CRUD routes... return $collection;
Это следует за форматом, предложенным в документах Symfony , где вы RouteCollection
с Route
s и затем возвращаете его.
Когда я пытаюсь запустить приложение с этим файлом на месте, даже если он не ссылается на мой основной файл routing.yml
, я получаю эту ошибку:
[Symfony\Component\Config\Exception\FileLoaderLoadException] The autoloader expected class "AppBundle\Resources\config\routing\restful_resource" to be defined i n file "/home/username/sites/appname/vendor/composer/../../src/AppBundle/Resources/config/routing/restfu l_resource.php". The file was found but the class was not in it, the class name or namespace probab ly has a typo in /home/username/sites/appname/app/config/services.yml (which is being imported from "/ho me/username/sites/appname/app/config/config.yml"). [RuntimeException] The autoloader expected class "AppBundle\Resources\config\routing\restful_resource" to be defined i n file "/home/username/sites/appname/vendor/composer/../../src/AppBundle/Resources/config/routing/restfu l_resource.php". The file was found but the class was not in it, the class name or namespace probab ly has a typo.
Нужно ли мне перепроектировать этот файл, чтобы действовать как класс, противоречащий предложенному формату в документах Symfony? Или мне нужно как-то сказать автозагрузчику игнорировать этот файл, чтобы он не пытался найти класс, где его не должно быть?
Одним из больших изменений, внесенных в Symfony 3.3, было понятие автоматического подключения сервисов. По моему не очень скромному мнению, много и много непоследовательной магии для небольшой пользы.
В рамках процесса автоматической проводки было принято решение сделать каждый класс сервисом по умолчанию. Предполагается, что в любом php-файле есть класс. Следовательно, попытка найти класс в Resource / config / routing / restful_resource.php.
Чтобы предотвратить это поведение, вам нужно явно указать генератору службы пропустить каталоги.
// app/config/services.yml AppBundle\: resource: '../../src/AppBundle/*' exclude: '../../src/AppBundle/{Entity,Repository,Tests,Resources}'
Хорошая идея о внедрении всех этих новых «вспомогательных» функций заключается в том, что я получаю достаточно много объяснений, объясняя их.