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


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

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

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

Yii::app()->controller->getId
Author: Hilarius L. Doren, 2013-10-15

8 answers

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

Yii::app()->urlManager->parseUrl(Yii::app()->request)
 45
Author: eXtreme, 2015-03-14 14:13:33

Вы пробовали:

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

И:

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

?

 44
Author: Korcholis, 2013-10-15 08:58:13

Как сейчас в Yii2

Получить текущий controller name

Yii::$app->controller->id

Текущий controller object

Yii::$app->controller

Текущий action name:

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

Текущий route:

Yii::$app->requestedRoute
 15
Author: Kuldeep Dangi, 2018-07-01 07:35:17

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

Yii::$app->controller

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

Yii::$app->controller->action->id
 11
Author: Marco Moreno, 2014-10-24 16:20:56

В Yii2:

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

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

var_dump(Yii::$app->urlManager->parseRequest(Yii::$app->request))
 8
Author: Jinsong Li, 2015-11-20 18:09:38

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

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

  1. Сделайте actionMethod() в контроллере примерно так:

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

  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 :

Просто добавьте это в views/layouts/main.php

<?php 

if(Yii::app()->user->isGuest)
{ 
   $this->redirect('/site/login');
}
?>
 4
Author: Sankalp Singha, 2016-04-20 05:48:08

Попробуйте Yii::app()->controller->getRoute()

 3
Author: CreatoR, 2013-10-15 09:02:19
if (Yii::$app->requestedAction->id == "index") {
    //do something
}
 0
Author: sergey, 2016-01-25 10:51:44