Сгруппированные маршруты в нескольких контроллерах в Symfony 4 - PullRequest
0 голосов
/ 22 мая 2018

Я переписываю свое приложение на базе Silex в Symfony 4, так как через некоторое время Silex устареет.Пока все отлично работает, но у меня проблема с вложенными маршрутами.

У меня было много вложенных (дочерних маршрутов) в приложении Silex с назначенными им разными контроллерами.

$app->match('/api', function (ControllerCollection $api) {
    $api->get('/homepage', 'ControllerOne::index');
    $api->get('/contact', 'ControllerTwo::index');
});

Это было довольно легко в Silex, но теперь в Symfony 4 яиспользуя аннотации для управления маршрутами, и кажется, что я не могу найти способ сгруппировать эти маршруты.

Это раздражает, особенно когда речь идет о маршрутах с _locale, поскольку синтаксис этих маршрутов довольно длинный и все же ... это не очень хороший способ иметь его везде, если мне нужно изменить _localeКогда-нибудь префикс к что-то вроде /home/{_locale}/.

ControllerOne extends Controller 
{
    /**
     * @Route("/{_locale}/",
     *     name="root",
     *     methods="GET",
     *     requirements={"_locale": "en|fr"}
     * )
     *
     * @return Response
     */
    public function index(): Response
    {
        return $this->render('some.html.twig');
    }
}

ControllerTwo extends Controller
{
    /**
     * @Route("/{_locale}/homepage",
     *     name="homepage",
     *     methods="GET",
     *     requirements={"_locale": "en|fr"}
     * )
     *
     * @return Response
     */
    public function index(): Response
    {
        return $this->render('some2.html.twig');
    }
}

ОБНОВЛЕНИЕ

У меня была идея создать что-то вроде PrefixedController, где я бы указалпрефикс над классом и расширение, PrefixedController вместо базового Controller, но, похоже, оно не работает.

/**
 * @Route("/{_locale}", requirements={"_locale": "en|fr"})
 */
controller PrefixedController extends Controller 
{
}

controller ControllerOne extends PrefixedController
{
    /**
     * @Route("/", methods="GET")
     * @Return Response
     */
    public function index(): Response 
    {
        return $this->render('some.html.twig');
    }
}

Но когда я перехожу к /en/, оно не может совпадатьмаршрут.

1 Ответ

0 голосов
/ 22 мая 2018

Это можно сделать в основном файле маршрутизации, куда импортируются ресурсы маршрутизации.В Symfony 4 он находится в config/routes/annotations.yaml.Затем для предоставления префикса /{_locale} для импортированных маршрутов используется опция prefix:

# config/routes/annotations.yaml
controllers:
    resource: '../src/Controller/'
    type: annotation
    prefix: /{_locale}

Путь к каждому маршруту, загружаемому из нового ресурса маршрутизации, теперь будет иметь префикс с заполнителем /{_locale}.

...