Префикс глобального маршрута Symfony 4

Я не могу найти информацию о префиксе глобального маршрута в приложении Symfony 4. Единственная вещь, которую я обнаружил, что аннотирует контроллеры с помощью @route. Но я не использую аннотации, и мне нужно, чтобы все контроллеры имели одинаковый префикс.

Теперь я мог бы сделать это в S3, как это в файле app/config/routing.yml:

app:
    resource: '@AppBundle/Controller/'
    type: annotation
    prefix: /foo

Но S4 без бандлов, и я не могу сделать то же самое - мне пришлось бы создавать бандл, который мне не нужен.

Можно ли вообще определить глобальный префикс маршрута в Symfony 4, или я собираюсь в конечном итоге добавить префикс каждому корневому каталогу/создать собственный загрузчик маршрута, особенно если я настрою маршруты в YAML?


person super.t    schedule 05.01.2018    source источник


Ответы (4)


Это работает с с аннотациями, давая каждому контроллеру 'this/prefix':

# file: config/routes/annotations.yaml

controllers:
    resource: ../../src/Controller/
    type: annotation
    prefix: this/prefix

Затем для импортированных маршрутов this/prefix применяется ко всем маршрутам FOSUserBundle ниже (да, я проверял это).

# file: config/routes.yaml

fos_user:
    resource: "@FOSUserBundle/Resources/config/routing/all.xml"
    prefix: this/prefix

Если вы не используете аннотации, вы должны иметь возможность импортировать свой отдельный файл маршрутизации (который может импортировать гораздо больше), применяя префикс ко всему в ресурсе. Но отбросьте обозначение «@» и используйте относительный путь к вашему файлу. Значение this/prefix можно настроить как параметр сервисного контейнера, смотрите здесь: http://symfony.com/doc/current/routing/service_container_parameters.html

person Arleigh Hix    schedule 24.02.2018

Я, вероятно, не понимаю вопроса, потому что не знаю, зачем вам нужен глобальный префикс в вашем приложении. Вы можете установить префикс при импорте файла маршрута, даже если вы используете yaml и не используете пакеты.

# config/routes.yaml
blog:
    resource: '../src/Resources/config/routes/blog.yaml'
    prefix: blog

# src/Resources/config/routes/blog.yaml
blog_show:
    path: /show
    controller: App\Controller\BlogController::show

blog_list:
    path: /list
    controller: App\Controller\BlogController::list

bin/console debug:router выдаст

blog_show          ANY      ANY      ANY    /blog/show     
blog_list          ANY      ANY      ANY    /blog/list  

Но опять же, я подозреваю, что вы просите о чем-то другом. Возможно, вы могли бы добавить пример к вашему вопросу?

person Cerad    schedule 05.01.2018
comment
У меня есть внутренний веб-сервер, переписывающий запросы к различным микросервисам, подключенным к веб-серверу, в зависимости от первого сегмента в URI, так что _https://backend/account/foo/bar перезаписывается в микросервис учетной записи, _https://backend/media /foo/bar перезаписывается в микросервис мультимедиа. Вот почему мне нужны префиксы /account и /media, окончательные приложения получают исходный путь. Может быть, это можно сделать как-то лучше. - person super.t; 06.01.2018
comment
Извините, но я все еще не понимаю, о чем вы просите. Надеюсь, кто-то еще придет с лучшим пониманием. - person Cerad; 06.01.2018

Есть несколько способов получить префикс для любого маршрута. Они различаются в основном из-за типа маршрута, на который они нацелены.

Для маршрутов, определяемых аннотациями, вам нужно отредактировать config/routes/annotations.yaml и добавить пару "ключ-значение" prefix: your-prefix.

Для маршрутов, определенных списком YAML, вам нужно отредактировать config/routes.yaml, поместить туда новую пару ключ-значение маршрута prefix: your-prefix и resource: "routes/routes-that-you-want-to-be-prefixed.yaml" и создать файл routes/routes-that-you-want-to-be-prefixed.yaml, содержащий все маршруты, а затем удалить все маршруты из config/routes.yaml, кроме этого. который использует resource: "routes/routes-that-you-want-to-be-prefixed.yaml".

Вы также можете использовать быстрый и грязный подход, если вы спешите и хотите проверить префикс. Отредактируйте src/Kernel.php и добавьте ко всем $routes->import(..) суффикс ->prefix('your-prefix) (нет необходимости изменять какие-либо файлы маршрутизации)

Я написал исчерпывающее описание с некоторыми примерами кода в качестве ответа на этот вопрос: Запуск Symfony 5 с обратным прокси-сервером в подкаталоге

Примеры фрагментов кода были протестированы на Symfony 4.4 и Symfony 5.1 и работали без проблем.

person Jimmix    schedule 29.09.2020

У меня такая же проблема, и я не смог решить ее с помощью конфигурации yaml, но у меня она работает, добавляя аннотацию в верхней части класса следующим образом:

/**
 *
 * Rest\Route("/api")
 */
class TestController extends FosRestController
{
   /**
     * @Rest\Route("/test", name="tm_test")
     * @Method({"GET"})
     */
    public function testAction()
    {
        ...
    }

}

Это создаст маршрут /api/test для testAction()

Посмотрите этот пост: https://symfony.com/blog/new-in-symfony-3-4-prefix-all-controller-route-names

Надеюсь, поможет

person DanielRestrepo    schedule 09.03.2018