Получить текущий контроллер и действие в Yii

Я хочу заставить всех пользователей войти в систему перед доступом к страницам моего сайта. Я следовал учебнику Ларри Уллмана принудительный вход для всех страниц в Yii.

по данным учебника вы можете сделать исключение для некоторых страниц, чтобы избежать перенаправления на страницу входа в систему. Чтобы проверить текущий контроллер, он проверил $_GET значение. Моя проблема в том, что я использовал urlManager переписать URL и $_GET дает мне значение null. Есть ли способ я могу использовать чтобы получить текущий контроллер и действие в счете моего класса?

я попробовал следующее, Но он недоступен в области моего класса компонентов:

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

8 ответов


Да, вы можете получить текущее controller/action маршрут, поменяв urlManager правила:

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

ты:

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

и:

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

?


как сейчас в Yii2

вам ток!--4-->

Yii::$app->controller->id

настоящее controller object

Yii::$app->controller

настоящее action name:

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

настоящее route:

Yii::$app->requestedRoute

используя Yii2, получите текущий объект контроллера с:

Yii::$app->controller

от контроллера получите текущее действие в виде строки, используя:

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

В Коде С Yii2:

проблема вызова Yii::$app->controller->id это когда вы вызываете его где-то (пример: в одном из ваших абстрактных контроллеров верхнего уровня), Yii::$app->controller возможно, еще не создан экземпляр, поэтому он вернет ошибку.

просто позвоните urlManager чтобы отобразить запрос на маршрут:

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

если я правильно понял ваш вопрос, вы в основном пытаетесь остановить доступ к определенным действия в контроллере от доступа без входа в систему правильно?

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

  1. сделать actionMethod() в контроллере так:

    class SomeController extends CController{
    
      public function actionSomeAction(){
    
        ... More code...
    
    }
    
  2. после этого, вы можете получить доступ к сайту, используя : path/to/application/controllerName / actionName

  3. теперь, если вы хотите заставить пользователя войти в систему перед тем, как зайти действия, этого :

сделайте управление доступом так:

 /**
     * @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-адресу.

Я надеюсь, что это решит вашу проблему.

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 :

просто добавьте в тег просмотров/макеты/главная.в PHP

<?php 

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

попробовать Yii::app()->controller->getRoute()


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