Как автоматизировать имя функции в маршрутизации 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');
}
}