Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/229.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在Yii中获取当前控制器和操作id_Php_Yii_Yii1.x - Fatal编程技术网

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

Php 在Yii中获取当前控制器和操作id,php,yii,yii1.x,Php,Yii,Yii1.x,我想强制所有用户在访问我的站点页面之前登录。我遵循了拉里·厄尔曼的教程 根据本教程,您可以为某些页面设置例外,以避免重定向到登录页面。为了检查当前控制器,它已检查了$\u GET值。我的问题是我使用了urlManager来重写URL,而$\u GET给了我一个空值。有什么方法可以让我在课堂成绩中得到当前的控制器和动作吗 我尝试了以下操作,但在我的组件类的范围内无法访问: Yii::app()->controller->getId 您是否尝试过: Yii::app()->con

我想强制所有用户在访问我的站点页面之前登录。我遵循了拉里·厄尔曼的教程

根据本教程,您可以为某些页面设置例外,以避免重定向到登录页面。为了检查当前控制器,它已检查了
$\u GET
值。我的问题是我使用了
urlManager
来重写URL,而
$\u GET
给了我一个空值。有什么方法可以让我在课堂成绩中得到当前的控制器和动作吗

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

Yii::app()->controller->getId
您是否尝试过:

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


尝试
Yii::app()->controller->getRoute()
如果我正确回答了你的问题,你基本上是在试图阻止对控制器中某些操作的访问而没有登录,对吗

如果这是您所追求的,正确的方法是:

  • 在控制器中创建一个
    actionMethod()
    ,如下所示:

    class SomeController extends CController{
    
      public function actionSomeAction(){
    
        ... More code...
    
    }
    
     /**
         * @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('*'),
            ),
        );
    }
    
  • 之后,您可以使用:path/to/application/controllerName/actionName访问该站点

  • 现在,如果要在访问操作之前强制用户登录,请执行以下操作:
  • 进行如下访问控制:

    class SomeController extends CController{
    
      public function actionSomeAction(){
    
        ... More code...
    
    }
    
     /**
         * @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('*'),
            ),
        );
    }
    
    现在只有经过身份验证的用户才能访问URL

    我希望它解决了你的问题

    如果您只是想检查用户是否是客人,并且他是客人,请每次都将他发送到登录页面:

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

    'defaultController' => 'controllerName/actionMethod',
    
    在该控制器中,只需添加上述访问规则。现在,默认情况下,您将使用访问控制方法打开站点。因此,它会自动将您重定向到登录页面

    甚至还有另一种方法

    只需将其添加到views/layouts/main.php中


    是您可以通过反转
    urlManager
    规则获得当前的
    控制器/操作
    路线:

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

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

    Yii::$app->controller
    
    从控制器中,使用以下命令以字符串形式获取当前操作:

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

    与现在的Yii2一样

    获取当前
    控制器名称

    Yii::$app->controller->id
    
    当前
    控制器对象

    Yii::$app->controller
    
    当前
    操作名称

    Yii::$app->controller->action->id
    
    当前
    路线

    Yii::$app->requestedRoute
    
    在Yii2中:

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

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

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

    我得到了这个错误:在Yii2:
    Yii::$app->controller->getRoute()上调用非对象的成员函数getRoute()
    它不起作用。Yii::app()->controller返回nulltry Yii::$app->controller->id@Ruben它只能在Yii2中工作!在Yii1中,
    app
    是一个方法,而不是
    Yii
    类的变量。唯一的工作方式是在Yii1中调用
    Yii::app()
    。对于yii2,请使用
    Yii::$app->controller->id
    非常感谢,但我不想为每个控制器编写访问规则。我只想检查一下用户是否是guest,然后将其重定向到登录页面。但是除了我上面解释的场景之外,我正在尝试找到如何在使用urlManager重写URL时访问控制器和操作ID。我已经编辑了我的帖子。也许它现在应该对你有帮助。如果是的话,请别忘了投赞成票,并把它作为答案:)非常感谢。我得到了答案。这正是我想要的。非常感谢。请注意,加载索引页时,即
    http://localhost/yiiapp/
    因为URL中没有请求@korcholis's是使其适用于所有操作(无论是否索引)的最佳方法。简单而快速:Yii::$app->requestedRoute请不要仅用代码回答,并解释您的答案与现有(长期)其他答案的区别。对于Yii2,它类似:
    Yii::$app->controller->id
    Yii::$app->controller->action->id
    是的,这也适用于模块上下文,例如:
    admin/permission/index
    顺便说一句,
    Yii:$app->request->resolve()[0]
    用于在请求事件之前获取路由,而其他人当时无法获取。这就是我要找的@NickTsai。非常感谢。
    if (Yii::$app->requestedAction->id == "index") {
        //do something
    }