Как получить имя действия в контроллере Symfony2?

Есть ли способ получить имя действия в контроллере Symfony2?

public function createAction(Request $request, $title) { // Expected result: create $name = $this->getActionName(); } 

использовать:

 $request->attributes->get('_controller'); // will get yourBundle\Controller\yourController::CreateAction $params = explode('::',$request->attributes->get('_controller')); // $params[1] = 'createAction'; $actionName = substr($params[1],0,-6); // $actionName = 'create'; 

Я нашел этот фрагмент ( здесь ):

 $matches = array(); $controller = $this->getRequest()->attributes->get('_controller'); preg_match('/(.*)\\\(.*)Bundle\\\Controller\\\(.*)Controller::(.*)Action/', $controller, $matches); 

что представляется перспективным подходом. Это регулярное выражение фактически не работает. Но не будет сложно получить имя действия с помощью strstr() . Работает!

И возвращает ( см. Пример )

 Array ( [0] => Acme\MyBundle\Controller\MyController::myAction [1] => Acme [2] => My [3] => My [4] => my ) 

Если Acme\MyBundle\Controller\MyController::myAction .

Теперь я использую это с Symfony 2.8 (и Symfony3):

 <?php namespace Company\Bundle\AppBundle\Component\HttpFoundation; use Symfony\Component\HttpFoundation\Request as BaseRequest; /** * Request shortcuts. */ class Request extends BaseRequest { /** * Extract the action name. * * @return string */ public function getActionName() { $action = $this->get('_controller'); $action = explode('::', $action); // use this line if you want to remove the trailing "Action" string //return isset($action[1]) ? preg_replace('/Action$/', '', $action[1]) : false; return $action[1]; } /** * Extract the controller name (only for the master request). * * @return string */ public function getControllerName() { $controller = $this->get('_controller'); $controller = explode('::', $controller); $controller = explode('\\', $controller[0]); // use this line if you want to remove the trailing "Controller" string //return isset($controller[4]) ? preg_replace('/Controller$/', '', $controller[4]) : false; return isset($controller[4]) ? $controller[4] : false; } } 

Чтобы использовать этот класс пользовательских запросов, вы должны «использовать» его в своих web/app*.php контроллерах:

 use Company\Bundle\AppBundle\Component\HttpFoundation\Request; // ... $request = Request::createFromGlobals(); // ... 

Затем в вашем контроллере:

 class AppController extends Controller { /** * @Route("/", name="home_page") * @Template("") * * @return array */ public function homePageAction(Request $request) { $controllerName = $request->getControllerName(); $actionName = $request->getActionName(); dump($controllerName, $actionName); die(); // ... } 

Вывод:

 AppController.php on line 27: "AppController" AppController.php on line 27: "homePageAction" 

Вы также можете получить доступ к этим функциям через службу RequestStack :

 class MyService { /** * @param RequestStack $requestStack */ public function __construct(RequestStack $requestStack) { $this->requestStack = $requestStack; } public function myService() { $this->controllerName = $this->requestStack->getMasterRequest()->getControllerName(); $this->actionName = $this->requestStack->getMasterRequest()->getActionName(); // ... } 

Если вы используете Controller в качестве службы, чем в другой схеме:

$request->attributes->get('_controller'); вернет «service_id: createAction»

Возможное решение для обеих схем:

 $controller = $request->attributes->get('_controller'); $controller = str_replace('::', ':', $controller); list($controller, $action) = explode(':', $controller);