Как автоматизировать имя функции в маршрутизации Symfony?

Вот простой маршрут, определенный в пользовательском пакете

my_admin_route:
    pattern:  /admin/{name}
    defaults: { _controller: NamespaceCustomBundle:CustomControl:login }

Выше код маршрутизации вызовет CustomControlControllerметод loginAction() мой вопрос: как я могу автоматизировать имя функции в маршрутизации, как для каждой функции, мне не нужно снова определять маршрут, должен быть один маршрут и автоматически вызывать функцию как определенный параметр {name} в маршруте, как показано ниже

my_admin_route:
    pattern:  /admin/{name}
    defaults: { _controller: NamespaceCustomBundle:CustomControl:{name} }

3 ответа

Вы можете посмотреть на KNP Rad Bundle: http://rad.knplabs.com/

Он делает много хороших вещей, включая ту, о которой вы говорите

Вы, вероятно, хотите создать собственный загрузчик маршрутов, смотрите.

Насколько я знаю, в настоящее время не существует готового решения для непосредственной привязки контроллеров -> методов -> параметров к конкретному маршруту. controller/method/param1/param2 как и другие фреймворки (CodeIgniter, FuelPHP...).

Действительно, этого можно добиться с помощью пользовательского загрузчика маршрутов, как сказал @Onema.

Я могу подумать о двух других вариантах, ни один из которых не делает именно то , что вы хотели, но может представлять интерес:

1. Creating a controller action which would just forward request to other actions
2. Using @Route annotation

1.

В AdminController создайте действие:

public function adminAction($actionName)
{
    return $this->forward('MyBundle:TargetController:' . $actionName);
}

2.

Маршрутизация аннотаций, поскольку она позволяет вам определять маршруты, не называя их. Имя будет неявно создано соглашением: маршрутизация аннотации.

Не совсем то, что вы хотели, но довольно элегантно, если вы не хотите создавать пользовательский маршрутный загрузчик:

/**
 * @Route("/admin/dosmt")
 */
public function dosmtAction()
{
    return new Response('smtAction');
}

Кроме того, вы можете подключить все действия контроллера к префиксу, как при маршрутизации YAML:

/**
 * @Route("/admin")
 */
class MyController extends Controller
{
    /**
     * @Route("/dosmt")
     */
    public function dosmtAction()
    {
        return new Response('smtAction');
    }
}
Другие вопросы по тегам