Вопрос по php, zend-framework2 – Как получить контроллер и имя действия в zf2

5

в zf1 мы можем получить имя контроллера и действия, используя

$controller = $this->getRequest()->getControllerName();
$action = $this->getRequest()->getActionName();

Как мы можем добиться этого в zf2?

ОБНОВИТЬ: Я пытался заставить их использовать

echo $this->getEvent()->getRouteMatch()->getParam('action', 'NA');
echo $this->getEvent()->getRouteMatch()->getParam('controller', 'NA');

Но я получаю ошибку

Fatal error: Call to a member function getParam() on a non-object

Мне нравится получать их в методе __construct ();

В идеале я хотел бы проверить, не определено ли действие, будет ли выполняться метод noaction (). Я бы проверил используя метод php method_exists.

Ваш Ответ

4   ответа
0

Вы получите модуль, контроллер и имя действия, как это в Zf2 внутри вашего контроллера ...

$controllerClass = get_class($this);
$moduleNamespace = substr($controllerClass, 0, strpos($controllerClass, '\\'));
$tmp = substr($controllerClass, strrpos($controllerClass, '\\')+1 );
$controllerName = str_replace('Controller', "", $tmp);

//set 'variable' into layout...
$this->layout()->currentModuleName      = strtolower($moduleNamespace);
$this->layout()->currentControllerName  = strtolower($controllerName);
$this->layout()->currentActionName      = $this->params('action');
-6
$controllerName = strtolower(Zend_Controller_Front::getInstance()->getRequest()->getControllerName());
Автор вопроса задал вопрос о реализации zf2, а не zf1
12

Еще проще:

$controllerName =$this->params('controller');
$actionName = $this->params('action');
Я пропустил ту часть __конструктора! Вы не сможете позвонить туда, если не будете выполнять какие-либо специальные операции. Смотрите этот пост для получения дополнительной информации:mwop.net/blog/2012-07-30-the-new-init.html
бета5, на самом деле я думаю, что эти переменные недоступны в __construct метода контроллера. но может быть доступным в методах отправки и onDispatch. Developer
Вы делаете этот звонок из контроллера? Какую версию ZF2 вы используете?
это не работает. та же ошибка Неустранимая ошибка: вызов функции-члена getParam () для необъекта. Я делаю что-то неправильно?? Нужно ли использовать какое-либо пространство имен или расширять какой-либо класс? Я вызываю это в методе __contruct (). Developer
4

вы не можете получить доступ к этим переменным в контроллере__construct() метод, но вы можете получить к ним доступ вdispatch метод иonDispatch метод.

но если вы хотите проверить, существует ли действие или нет, в zf2 уже есть встроенная функция для notFoundAction, как показано ниже

 public function notFoundAction()
{
    parent::notFoundAction();
    $response = $this->getResponse();
    $response->setStatusCode(200);
    $response->setContent("Action not found");
    return $response;   
} 

но если вам все еще нравится делать это вручную, вы можете сделать это, используя следующие методы отправки

namespace Mynamespace\Controller;

use Zend\Mvc\Controller\AbstractActionController;

use Zend\Stdlib\RequestInterface as Request;
use Zend\Stdlib\ResponseInterface as Response;
use Zend\Mvc\MvcEvent;

class IndexController extends AbstractActionController 
{

    public function __construct()
    {


    }        

      public function notFoundAction()
    {
        parent::notFoundAction();
        $response = $this->getResponse();
        $response->setStatusCode(200);
        $response->setContent("Action not found");
        return $response;   
    }

    public function dispatch(Request $request, Response $response = null)
    {
        /*
         * any customize code here
         */

        return parent::dispatch($request, $response);
    }
    public function onDispatch(MvcEvent $e)
    {
        $action = $this->params('action');
        //alertnatively 
        //$routeMatch = $e->getRouteMatch();
        //$action = $routeMatch->getParam('action', 'not-found');

        if(!method_exists(__Class__, $action."Action")){
           $this->noaction();
        }

        return parent::onDispatch($e);
    }
    public function noaction()
    {        
        echo 'action does not exits';   
    }
}   
Привет, когда я вставляю ваш код в мой контроллер, браузер ничего не показывает (так как сервер не отправляет данные). Не могли бы вы сказать мне, что случилось? Спасибо

Похожие вопросы