Introducción al MVC de Yii – Parte I

Introducción.

MVC es un patrón de diseño que separa de manera clara y precisa los tres componentes de una aplicación: el modelo, la vista y el controlador.  Su objetivo principal es el de separar la lógica del negocio de la lógica de la presentación para darle estructura a la implementación y facilitar con esto su posterior mantenimiento.

Como se mencionó anteriormente, el modelo consta de tres partes de acuerdo con la siguiente descripción.

  • El modelo representa la lógica de la aplicación, que se encuentra inmersa en los datos y en las reglas del negocio.
  • La vista hace referencia a la interfaz de usuario, a la presentación de la información.
  • El controlador actúa como mediador entre la solicitud del usuario y los modelos y vistas involucrados en la ejecución.
Estructura de una aplicación Yii.
Estructura de una aplicación Yii.

Aplicación.

  • Yii utiliza adicionalmente el patrón de diseño del controlador frontal.
  • Representado por el index.php y es el único punto de acceso del usuario a la aplicación web.
  • En el controlador frontal se crea la instancia de la Aplicación cuya función es la de recibir los requerimientos del usuario y remitirlos a los controladores apropiados para su posterior procesamiento.
  • Representa el contexto de ejecución del procesamiento de los requerimientos del usuario.
  • Puede accederse en cualquier momento a través del singleton Yii::app().
  • Su configuración se realiza en la ruta protected/config, especialmente en el archivo main.php.

Componente.

  • Su clase base es CComponent.
  • Implementan funcionalidades específicas con la suficiente flexibilidad para poderse compartir con otras aplicaciones.
  • Se pueden incluír y configurar facilmente en el archivo de configuración de la aplicación (arreglo components).
  • Se acceden a través de Yii::app() -> ComponenteId.
  • Su creación es perezosa, es decir, sus instancias sólo son creadas cuando son invocados por primera vez.  Es posible evitar este comportamiento listando los componentes bajo la sección preload de la configuración de la aplicación.
  • Sus propiedades pueden definirse de dos maneras.
    • Como atributos públicos de la instancia.
      • Su nombre es sensible a mayúsculas.
      • Su acceso es directo.
      • No permite definir restricciones sobre su modificación.
    • A través de los métodos de consulta y modificadores.
      • Su nombre no es sensible a mayúsculas.
      • Se deben definir los métodos getAtributo y setAtributo según se requiera el acceso.
      • La implementación de estos métodos permite filtrar el acceso a la propiedad.
  • Yii incluye en su distribución múltiples componentes listos para ser utilizados.

Controlador.

  • Su clase base es CController.
  • Su misión es la de dirigir la interacción entre los modelos (lógica del negocio) y las vistas (presentación) para producir el resultado que el usuario desea a partir de su requerimiento.
  • Contiene las acciones.
  • Determina la acción por defecto: index.  Es posible modificar su valor mediante CController::defaultAction.
  • El nombre de la clase es “{ControladorId}Controller“.
  • El nombre del archivo que lo contiene es “{ControladorId}Controller.php” y se ubica bajo la ruta protected/controllers.
  • La búsqueda para localizar una clase de un controlador se rige por las siguientes reglas.
    1. Si la aplicación define a CWebApplication::catchAllRequest se rige por esta propiedad y el controlador especificado en el requerimiento es obviado.
    2. Si se encuentra un alias para este controlador en CWebApplication::controllerMap es utilizado.
    3. Si para el requerimiento ruta/ControladorId se encuentra el archivo protected/controllers/ruta/ControladorIdController.php es utilizada la clase contenida en él.
    4. Si hay módulos definidos en la aplicación la búsqueda incluye sus rutas de manera similar a la regla anterior.
    5. El controlador no fue encontrado y se lanza una excepción CHttpException.

Acciones.

  • Corresponden a las actividades que el controlador puede realizar.
  • Pueden definirse de dos maneras.
    • Como un método de la clase controlador.
      • El nombre del método debe corresponder con el formato “action{AcciónId}”.
      • De esta manera, la acción agregar se encuentra implementada en el método actionAgregar.
    • Como una subclase de la clase CAction.
      • Se define una clase por cada acción.
      • El nombre de la clase corresponde con el formato “{AcciónId}Action“.
      • El nombre del archivo donde se almacena la acción tiene el formato “{AcciónId}Action.php” y se almacena bajo protected/controllers/{ControladorId}.
      • De esta manera, la acción agregar se encuentra implementada en la clase AgregarAction.
      • La clase debe implementar el método run donde se implementa la lógica de la acción.
        class AgregarAction extends CAction
        {
            public function run()
            {
                // Lógica de la acción.
            }
        }
      • Es necesario sobreescribir el método actions() del controlador para hacerle saber de la existencia de la acción.
        class UsuarioController extends CController
        {
            public function actions()
            {
                return array(
                    'adicionar' => 'application.controllers.usuario.AgregarAction'
                );
            }
        }
      • En el ejemplo anterior se le especificó al controlador de Usuario que la acción adicionar se relaciona con la clase AgregarAction definida anteriormente y que se encuentra ubicada bajo protected/controllers/usuario.

Filtros.

  • Se ejecutan antes y/o después de una acción.
  • Su finalidad es la de realizar verificaciones o adecuaciones antes y/o después de procesar la solicitud del usuario.  Como es el caso de verificar la autenticación del usuario antes de realizar cualquier acción administrativa.
  • Una acción puede tener múltiples filtros.
  • El orden de ejecución de los filtros corresponde con el orden de aparición en la lista.
  • Un filtro puede evitar que los siguientes filtros se ejecuten.
  • De manera similar a las Acciones, los Filtros pueden definirse de dos maneras.
    • Como un método de la clase Controlador.
      • El nombre del método debe corresponder con el formato “filter{FiltroId}”.
      • De esta manera, el filtro verificarAutenticacion se encuentra implementado en el método filterVerificarAutenticacion.
        public function filterVerificarAutenticacion($filterChain)
        {
            // El llamado a $filterChain -> run() continúa con la invocación del siguiente filtro.
        }
    • Como una subclase de la clase CFilter.
      • Se define una clase por cada filtro.
      • El nombre de la clase corresponde con el formato “{FiltroId}Filter“.
      • El nombre del archivo donde se almacena el filtro tiene el formato “{FiltroId}Filter.php” y se almacena bajo protected/filters.
      • De esta manera, el filtro estadisticas se encuentra implementado en la clase EstadisticasFilter.
      • La clase debe implementar los métodos preFilter y postFilter donde se implementa la lógica del filtro antes y después de la ejecución de la acción respectivamente.
        class EstadisticasFilter extends CFilter
        {
            public function preFilter($filterChain)
            {
                // Lógica del filtro previo a la ejecución de la acción.
        
                // Si $respuesta es 'true' se continúa con la ejecución de los filtros
                // y eventualmente con la ejecución de la acción.  Si es 'false' la
                // la ejecución de la acción es abortada.
        
                return $respuesta;
            }
        
            public function postFilter($filterChain)
            {
                // Lógica del filtro posterior a la ejecución de la acción.
            }
        }
  • En ambos casos es necesario indicarle al controlador la existencia del filtro.  Para esto se debe sobreescribir el método CController::filters() de manera que retorne la lista de filtros a ejecutarse por cada acción.
    class UsuarioController extends CController
    {
        // ...
    
        public function filters()
        {
            return array(
                'verificarAutenticacion + crear, editar',
    
                array(
                    'application.filters.EstadisticasFilter - crear, editar',
                    'activado' => true,
                    'frecuencia' => 'diaria'
                )
            );
        }
    }
  • El ejemplo anterior especifica dos filtros para el controlador Usuario con las siguientes características.
    • El filtro verificarAutenticacion esta basado en un método mientras que el filtro estadisticas está basado en una clase.
    • Se establecieron valores iniciales para la configuración del filtro de estadisticas.  Estos valores (activado = true y frecuencia = ‘diaria’) se asignan a los atributos del filtro en el momento de su construcción.
    • Los modificadores + y determinan sobre cuales acciones se ejecutan efectivamente los filtros.
      • El filtro verificarAutenticacion se le aplicará UNICAMENTE a las acciones crear y editar.
      • El filtro estadisticas se le aplicará a TODAS las acciones EXCEPTUANDO a las acciones de crear y editar.
      • Si no se especifica ningún modificador se sobreentiende que aplica a TODAS las acciones.

Modelo.

  • Su clase base es CModel.
  • Representa una unica fuente de datos como una fila de una tabla de una base de datos o un formulario con información provista por el usuario.
  • Cada campo de la fuente de datos se convierte en un atributo del modelo.
  • Cada atributo tiene una etiqueta y puede ser validado a partir de un conjunto de reglas.
  • Hay dos tipos de modelo según la fuente de datos que representan.
    • El modelo de formularios se representa con la clase CFormModel.
      • Mantiene información recibida a partir de un formulario del usuario para ser procesada y posteriormente descartada.
    • El modelo de registro activo se representa con la clase CActiveRecord.
      • Se basa en el patrón de diseño de Active Record.
      • Representa un registro de una tabla de una base de datos.
      • Permite su manipulación de una manera orientada a objetos.
      • Los campos del registro se convierten en atributos del modelo.

Enlaces.

5 thoughts on “Introducción al MVC de Yii – Parte I”

  1. Hola de nuevo yo. Mira la verdad es que yo soy programador java y apenas me estoy iniciando con php5. Pero necesito hacer un proyecto entonces busque frameworks orientados a objetos y que ademas implementaran el MVC, Entonces me gustaria saber si tienes alguna aplicacion o algun tutorial elaborado para entender a lujo de detalle este framework.

    Por tu atención muchas gracias

  2. @Luis Arturo, recibe un cordial saludo.

    La documentación que conozco de Yii es la proporcionada por su sitio web, en él vas a encotrar tres documentos de interés.

    • La guía del framework: The Definitive Guide to Yii.
    • La referencia de clases: Yii Framework Class Reference.
    • El tutorial práctico del desarrollo de un blog: The Yii Blog Tutorial.

    Su dirección es http://www.yiiframework.com/doc/.

    De igualmanera estaré publicando algunos artículos mas en mi blog al respecto.

  3. ya lo encontre el link! abajo a la derecha!! un poco escondido! lo vi cuando hice submit al comentario. 🙂 ahora sigo leyendo!! 🙂

Leave a Reply

Your email address will not be published. Required fields are marked *