In View(CakePHP), the proper way to get current controller?

前端 未结 8 860
伪装坚强ぢ
伪装坚强ぢ 2021-02-02 07:36

In View, I can get action by using

$this->action

But, I cannot get controller name by

$this->controller
相关标签:
8条回答
  • 2021-02-02 08:00

    All the other solutions are to get the controller name... I need the controller itself, so I did the following function in an AdminHelper.php called by $this->Admin->_getController('MyControllerName') into the view.ctp file

    /******************************************************************
     * 
     ******************************************************************/
    function _getController( $pControllerName ){
        if ( ! isset($this->controllersArray[$pControllerName]) ){
            $importRes = App::import('Controller', $pControllerName);// The same as require('controllers/users_controller.php');
            $strToEval = "\$controller = new ".$pControllerName."Controller;";
            $evalRes = eval($strToEval);
            if ( $evalRes === false ){
                throw new AppException("Eval returned an error into ".__FILE__." getController()");
            }
            $controller->constructClasses();// If we want the model associations, components, etc to be loaded
            $this->controllersArray[$pControllerName] = $controller;
        }
    
        $result = $this->controllersArray[$pControllerName];
        return $result;
    }
    

    Note: don't forget to declare it into the controller you'll use for example:

    • people/view.ctp -> $this->Admin->_getController('MyControllerName')
    • PeopleController.ctp -> var $helpers = array('Html', 'Form', 'Admin');
    • AdminHelper.ctp -> function _getController(...
    0 讨论(0)
  • 2021-02-02 08:10

    For cakephp 3.6 and later:

    Although above solutions will work but it gives deprecated warning and will not work in cakephp 4. So It is better to use the following code to get the controller name. It will work in view page and controllers as well.

    $this->request->getParam('controller')
    
    0 讨论(0)
  • 2021-02-02 08:11

    You can get controller like this:

    echo "<pre>controller:".$this->request->params['controller']."</pre>";
    

    Although $this->params is shorter, $this->request->params is more autocomplete friendly. You can check the autocomplete options from this question: PHPStorm autocomplete for CakePHP custom helpers in view files

    Other data about request can be taken like this:

    echo "<pre>action:".$this->request->params['action']."</pre>";
    
    echo "<pre>request:"; print_r( $this->request ); echo "</pre>";
    
    echo "<details><summary>this:</summary><pre>"; 
          print_r( $this ); echo "</pre></details>";
    

    Edit:
    As of CakePHP 3 $this->params shortcut is removed. So you should user $this->request->params['controller'] for CakePHP 3.
    http://book.cakephp.org/3.0/en/appendices/3-0-migration-guide.html#id2
    Also note that first character of controller is uppercase. It was lowercase in Cakephp 2.

    0 讨论(0)
  • 2021-02-02 08:14

    To get the current,

    • controller: $this->params['controller']
    • action: $this->params['action']
    • arguments:$this->params['pass']
    0 讨论(0)
  • 2021-02-02 08:20

    Use $this->params['controller'] to get the current controller.

    You can do a debug($this->params) to see other available variables.

    0 讨论(0)
  • 2021-02-02 08:20

    $this->name also give you controller's name. Their difference with $this->params['controller'] is it's first letter capitalized

    debug($this->name);
    debug($this->params['controller']);
    

    Results in:

     \app\Controller\AppController.php (line 176)
    
    'Users'
    
    \app\Controller\AppController.php (line 177)
    
    'users'
    
    0 讨论(0)
提交回复
热议问题