yii2 - bootstrap - Ejecutar mi código antes de cualquier acción de cualquier controlador.
yii2 tutorial (4)
Me gustaría comprobar si mi usuario ha completado ciertos campos en su perfil antes de poder acceder a cualquier acción de cualquier controlador. Por ejemplo
if(empty(field1) && empty(field2))
{
header("Location:/site/error")
}
En yii1 podría hacerlo en protected / components / Controller.php en la función init () Pero en yii2 no estoy seguro de dónde colocar mi código. No puedo modificar los archivos principales, pero no estoy seguro de qué hacer en el backend de mi aplicación avanzada para que funcione.
Sé que puedo usar la aplicación beforeAction () pero tengo demasiados controladores para hacer eso y para hacer un seguimiento de cada controlador.
Crear un nuevo controlador
namespace backend/components;
class Controller extends /yii/web/Controller {
public function beforeAction($event)
{
..............
return parent::beforeAction($event);
}
}
Todos los controladores ahora deben extender el backend / components / Controller y no / yii / web / Controller. Con esto, deberás modificar cada controlador. Yo iría por esta solución.
Creo que también puede reemplazar una clase con otra (por lo que no es necesario cambiar ningún controlador), algo así como
/Yii::$classMap = array_merge(/Yii::$classMap,[
''/yii/web/Controller''=>''backend/components/Controller'',
]);
Vea más detalles aquí: http://www.yiiframework.com/doc-2.0/guide-tutorial-yii-integration.html y tomé el código de aquí: https://github.com/mithun12000/adminUI/blob/master/src/AdminUiBootstrap.php
Puedes poner esto en tu archivo index.php. Sin embargo, asegúrese de documentar este cambio muy bien, ya que alguien que vendrá y tratar de depurar su código quedará totalmente confundido por esto.
En caso de que necesite ejecutar un código antes de cada controlador y acción, puede hacer lo siguiente:
1 - Agregue un componente a su directorio de componentes, por ejemplo ( MyGlobalClass
):
namespace app/components;
class MyGlobalClass extends /yii/base/Component{
public function init() {
echo "Hi";
parent::init();
}
}
2 - Agregue el componente MyGlobalClass
a su matriz de componentes en el archivo de configuración:
''components'' => [
''MyGlobalClass''=>[
''class''=>''app/components/MyGlobalClass''
],
//other components
3 - Agregar MyGlobalClass
a la matriz de bootstarp
en el archivo de configuración:
''bootstrap'' => [''log'',''MyGlobalClass''],
Ahora, puedes ver Hi
antes de cada acción.
Tenga en cuenta que, si no necesita usar Events
y Behaviors
, puede usar /yii/base/Object
lugar de /yii/base/Component
O bien, https://github.com/yiisoft/yii2/blob/master/docs/guide/security-authorization.md use RBAC, para restringir el acceso a las acciones de los controladores de una en una, según las reglas. ¿Por qué querría restringir el acceso a las acciones del controlador en función de los campos de usuario? No podrá acceder a nada (incluido el formulario de inicio de sesión) si coloca una restricción allí.
Solo agregue el archivo de configuración en $ config array:
''on beforeAction'' => function ($event) {
echo "Hello";
},