在Yii中获取当前控制器和操作ID

时间:2013-10-15 08:53:55

标签: php yii yii1.x

我想强制所有用户在访问我的网站页面之前登录。我已经关注了Larry Ullman的教程Forcing Login for All Pages in Yii

根据教程,您可以对某些页面进行例外处理,以避免重定向到登录页面。为了检查当前控制器,它检查了$_GET值。我的问题是我使用urlManager重写了URL,$_GET给了我一个空值。我可以使用任何方法来获得当前控制器和动作的分数吗?

我尝试了以下内容,但在组件类的范围内无法访问它:

Yii::app()->controller->getId

8 个答案:

答案 0 :(得分:45)

是的,您可以通过撤消controller/action规则来获取当前的urlManager路线:

Yii::app()->urlManager->parseUrl(Yii::app()->request)

答案 1 :(得分:44)

你有没有尝试过:

Yii::app()->controller->id

Yii::app()->controller->action->id

答案 2 :(得分:16)

现在在Yii2

获取最新controller name

Yii::$app->controller->id

当前controller object

Yii::$app->controller

当前action name

Yii::$app->controller->action->id

当前route

Yii::$app->requestedRoute

答案 3 :(得分:11)

使用Yii2,获取当前控制器对象:

Yii::$app->controller

从控制器,使用以下命令获取当前操作:

Yii::$app->controller->action->id

答案 4 :(得分:8)

在Yii2:

调用Yii::$app->controller->id的问题是,当你在某个地方调用它时(例如:在你的一个顶层抽象控制器中),Yii::$app->controller可能尚未实例化,因此它将返回错误。

直接调用urlManager将请求映射到路由:

var_dump(Yii::$app->urlManager->parseRequest(Yii::$app->request))

答案 5 :(得分:4)

尝试Yii::app()->controller->getRoute()

答案 6 :(得分:4)

如果我对您提出正确的问题,您基本上是在尝试停止访问控制器中的某些操作而无法正确登录?

如果这是你所追求的,那么正确的方法就是:

  1. 在控制器中设置actionMethod(),如下所示:

    class SomeController extends CController{
    
      public function actionSomeAction(){
    
        ... More code...
    
    }
    
  2. 之后,您可以使用以下命令访问该网站:path / to / application / controllerName / actionName

  3. 现在,如果要在访问操作之前强制用户登录,请执行以下操作:
  4. 像这样制作访问控制:

     /**
         * @return array action filters
         */
        public function filters()
        {
            return array(
                'accessControl', // perform access control for CRUD operations
            );
        }
    
    /**
     * Specifies the access control rules.
     * This method is used by the 'accessControl' filter.
     * @return array access control rules
     */
    public function accessRules()
    {
        return array(
    
            array('allow', // allow authenticated user to perform 'create' and 'update' actions
                'actions' => array('**yourActionMethodName**'),
                'users' => array('@'),
            ),
    
            array('deny', // deny all users
                'users' => array('*'),
            ),
        );
    }
    

    现在只有经过身份验证的用户才能访问该网址。

    我希望它能解决你的问题。

    <强> If you simply want to check if the user is a guest and if he is, send him to the login page everytime:

    在config / main.php中,添加以下内容:

    'defaultController' => 'controllerName/actionMethod',
    

    在该控制器中添加上述访问规则。现在,默认情况下,您将站点打开访问受控方法。因此它会自动将您重定向到登录页面。

    Even another method

    只需在 views / layouts / main.php

    中添加
    <?php 
    
    if(Yii::app()->user->isGuest)
    { 
       $this->redirect('/site/login');
    }
    ?>
    

答案 7 :(得分:0)

if (Yii::$app->requestedAction->id == "index") {
    //do something
}