2014-04-04 9 views

Antwort

12

Verwendung:

$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'; 
+0

Ja, funktioniert gut! –

+0

Das ist auch falsch. Die Aktionsmethode muss nicht aufgerufen werden * "somethingAction" * Dies kann durch Hinzufügen einer Überprüfung des Namens behoben werden, wenn "action" tailing ist. – Touki

+0

@Touki, wie in meinem Kommentar zu meiner Antwort erwähnt, ist die Frage eine Symfony2 Frage (siehe Tag). Lesen Sie hier die Konventionen für die Benennung der Controller: http://symfony.com/doc/current/book/controller.html#a-simple-controller –

2

ich diesen Schnipsel gefunden (here):

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

, die ein vielversprechender Ansatz zu sein scheint. Diese Regexp funktioniert eigentlich nicht. Aber es wird nicht schwer sein, den Aktionsnamen mit strstr() zu holen. Works!

und kehrt (see example)

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

Wenn eingegeben wurde Acme\MyBundle\Controller\MyController::myAction.

+0

Ergänzung zu meinem letzten Satz: Schauen Sie sich @ Leo's Antwort an :) –

+0

Nein, das ist falsch. Ein Controller [kann als Service definiert werden] (http://symfony.com/doc/current/cookbook/controller/service.html) und muss daher nicht als "SomethingController" * bezeichnet werden. Das Gleiche gilt für die Aktion. – Touki

+0

Ich verstehe Ihren Standpunkt nicht. Ich möchte etwas mit dem aktuell gewählten Aktionsnamen (Logging) machen. Nein, das sollte über einen Listener oder Service geschehen. Aber ich verstehe dich nicht, warum ist das falsch? Kannst du genau? –

1

Nun, ich bin mit diesem mit Symfony 2.8 (und 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; 
    } 
} 

diese kundenspezifische Anfrage Klasse verwenden zu können, müssen Sie "verwenden" es in Ihrem web/app*.php Controller:

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

Dann in Ihrem Controller:

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(); 

     // ... 
    } 

Will Ausgang:

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

Sie können diese Funktionen auch durch den RequestStack Dienst zugreifen:

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(); 

     // ... 
    } 
+0

Wie kann ich alle Aktionen im Controller bekommen? –

+0

Bitte stellen Sie eine neue Frage. – COil

1

Wenn Sie Controller als einen Dienst als das Schema verwenden ist anders:

$request->attributes->get('_controller'); will return "service_id: Create"

Eine mögliche Lösung für beide Schemas:

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