php - una - yii create url
Obtenga el controlador actual y la identificación de acción en Yii (8)
Sí, puede obtener la ruta actual de controller/action
invirtiendo la regla de urlManager
:
Yii::app()->urlManager->parseUrl(Yii::app()->request)
Quiero forzar a todos los usuarios a iniciar sesión antes de acceder a las páginas de mi sitio. He seguido el tutorial de Larry Ullman Forcing Login for All Pages en Yii .
De acuerdo con el tutorial, puede hacer una excepción para algunas páginas para evitar redirigirlas a la página de inicio de sesión. Para verificar el controlador actual, ha comprobado el valor $_GET
. Mi problema es que he usado urlManager
para reescribir la URL y $_GET
me da un valor nulo. ¿Hay algún método que pueda usar para obtener el controlador actual y la acción en el puntaje de mi clase?
Intenté lo siguiente, pero no está accesible en el alcance de mi clase de componente:
Yii::app()->controller->getId
Has probado:
Yii::app()->controller->id
y:
Yii::app()->controller->action->id
?
Pruebe Yii::app()->controller->getRoute()
Usando Yii2, obtenga el objeto del controlador actual con:
Yii::$app->controller
Desde el controlador, obtenga la acción actual como una cadena usando:
Yii::$app->controller->action->id
Como ahora en Yii2
obtener el controller name
actual
Yii::$app->controller->id
controller object
actual
Yii::$app->controller
action name
actual:
Yii::$app->controller->action->id
En Yii2:
El problema de llamar a Yii::$app->controller->id
es que cuando lo llamas a alguna parte (ejemplo: en uno de tus controladores abstractos de nivel superior), Yii::$app->controller
aún no se ha instanciado, por lo que devolverá el error.
Simplemente llame directamente a urlManager
para mapear la solicitud a la ruta:
var_dump(Yii::$app->urlManager->parseRequest(Yii::$app->request))
if (Yii::$app->requestedAction->id == "index") {
//do something
}
Si recibo su pregunta correctamente, básicamente está tratando de impedir que se acceda al acceso a ciertas acciones en el controlador sin haber iniciado sesión ¿correcto?
Si esto es lo que buscas, el método correcto para hacerlo es este:
Haga un
actionMethod()
en el controlador de esta manera:class SomeController extends CController{ public function actionSomeAction(){ ... More code... }
Después de eso, puede acceder al sitio usando: ruta / a / aplicación / nombre-controlador / nombre-acción
- Ahora, si desea obligar al usuario a iniciar sesión antes de acceder a la acción, haga esto:
Haga un control de acceso como ese:
/**
* @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(''*''),
),
);
}
Ahora solo los usuarios autenticados podrían acceder a la URL.
Espero que haya resuelto tu problema
If you simply want to check if the user is a guest and if he is, send him to the login page everytime:
En config / main.php, agregue lo siguiente:
''defaultController'' => ''controllerName/actionMethod'',
Y en ese controlador simplemente agregue la regla de acceso anterior. Ahora, de forma predeterminada, está abriendo el sitio a un método de acceso controlado. Entonces lo redirigiría automáticamente a la página de inicio de sesión.
Even another method
:
Solo agregue esto en las vistas / layouts / main.php
<?php
if(Yii::app()->user->isGuest)
{
$this->redirect(''/site/login'');
}
?>