Получить текущий контроллер и идентификатор действия в Yii
Я хочу заставить всех пользователей войти в систему перед доступом к страницам моего сайта. Я следовал учебнику Ларри Уллмана , Заставляя входить в систему для всех страниц в Yii.
В соответствии с руководством вы можете сделать исключение для некоторых страниц, чтобы избежать перенаправления на страницу входа. Для проверки текущего контроллера он проверил значение $_GET
. Моя проблема в том, что я использовал urlManager
для перезаписи URL-адреса, и $_GET
дает мне нулевое значение. Есть ли какой-либо метод, который я могу использовать для получения текущего контроллер и действие в счете моего класса?
Я попробовал следующее, но оно недоступно в области моего класса компонентов:
Yii::app()->controller->getId
8 answers
Да, вы можете получить текущий маршрут controller/action
, изменив правило urlManager
:
Yii::app()->urlManager->parseUrl(Yii::app()->request)
Вы пробовали:
Yii::app()->controller->id
И:
Yii::app()->controller->action->id
?
Как сейчас в Yii2
Получить текущий controller name
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))
Если я правильно понял ваш вопрос, вы в основном пытаетесь запретить доступ к определенным действиям в контроллере без входа в систему, верно?
Если это то, что вам нужно, правильный способ сделать это таков:
-
Сделайте
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('*'),
),
);
}
Теперь только аутентифицированные пользователи смогут получить доступ к 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');
}
?>
Попробуйте Yii::app()->controller->getRoute()
if (Yii::$app->requestedAction->id == "index") {
//do something
}