Symfony Capa de Controladores (Lógica de presentación) Rodolfo Campos camposer@softclear.net http://www.softclear.net
Capa de Controladores La Capa de controladores o Lógica de presentación contiene el código que vincula la lógica de negocios con la presentación.
Controladores de Frente (Front Controllers) Tienen la función de: Definir las constantes principales. Localizar las librerías de Symfony. Instanciar e inicializar las clases principales de Symfony. Cargar la configuración. Decodificar la petición URL para determinar la acción a ejecutar y los parámetros que viajan en ella. Si la acción no existe, redirigir a la acción de error 404. Activar filtros. Ejecutar los filtros (primera ejecución) petición. Ejecutar la acción y pintar la vista. Ejecuar los filtros (segunda ejecución) respuesta. Enviar la respuesta al Cliente.
Controladores de Frente (Front Controllers) En la carpeta web del proyecto se pueden conseguir los controladores de frente por omisión: index.php (o app1.php en caso de existir más de una aplicación en el proyecto). Para entorno de producción. app_dev.php. Para entorno de desarrollo.
Controladores de Frente (Front Controllers) Para agregar un nuevo entorno de ejecución simplemente debe crear un nuevo front controller. Por ejemplo: si desea agregar un nuevo entorno llamado pruebas, deberá copiar el contenido de cualquiera de los archivos por omisión (preferiblemente el de desarrollo -dev-) dentro de la carpeta web del proyecto con el nombre app_pruebas.php y cambiar dentro de éste el valor de la variable SF_ENVIRONMENT a pruebas. Luego podrá ejecutar su aplicación en entorno de pruebas a través del siguiente URL: http://localhost/proy/web/app_pruebas.php
Archivos por lotes Si desea crear archivos PHP para ejecutar por línea de comandos, dentro del entorno de Symfony, deberá agregar las siguientes líneas al script (primeras líneas de los front controllers): <?php define('sf_root_dir', realpath(dirname( FILE ).'/..')); define('sf_app', 'myapp'); define('sf_environment', 'prod'); define('sf_debug', false); require_once(sf_root_dir.directory_separator.'apps'.directory_separator.sf_app.directory_separator.'co nfig'.directory_separator.'config.php'); // Comienzo del código PHP del desarrollador
Acciones Las acciones deben crearse dentro del archivo actions.class.php, ubicado en la carpeta actions del módulo. Cada acción es representada a través de un método executemiaccion de la clase mimoduloactions que hereda de la clase sfactions. Luego, las acciones también pueden ser creadas en archivos a parte -recomendado para casos donde se tienen módulos muy exensos con muchas acciones-. Para crear acciones en archivos a parte, se debe agregar un archivo llamado miaccionaction.class.php dentro de la carpeta actions del módulo, con la lógica en un método execute() dentro de una clase llamada miaccionaction, que extienda de la clase sfaction.
Obteniendo información class holamundoaction extends sfaction public function execute() // Obteniendo parámetros de la petición (request) $nombre = $this >getrequestparameter('nombre'); // Obteniendo información del controlador $nombremodulo = $this >getmodulename(); $nombreaccion = $this >getactionname(); // Obteniendo objetos principales del framework $peticion = $this >getrequest(); $sesion = $this >getuser(); $respuesta = $this >getresponse(); $controlador = $this >getcontroller(); $contexto = $this >getcontext(); // Pasando variables a la plantilla $this >setvar('nombre', 'juan'); $this >nombre = 'juan'; // Versión corta
Terminando Acciones Al final de cada método execute de una acción debe ser devuelto un valor que indica el flujo que deberá continuar la aplicación. A continuación se presentan los valores por omisión: sfview::success (en caso de que el método no tenga valor de retorno se asume éste). Retorna la salida a la plantilla miaccionsuccess.php. sfview::error. Retorna la salida a la plantilla miaccionerror.php. sfview::none. No retorna la salida a ninguna plantilla. Es utilizado generalmente en scripts que serán ejecutados por consola.
Terminando Acciones (personalizado) Al ejecutarse la siguiente acción: public function executeindex() return 'OtroResultado'; El flujo será dirigido a la plantilla indexotroresultado.php
Redirigiendo Acciones En ocasiones una acción debe redirigir el flujo a otra acción, otra plantilla o simplemente otro URL. Para ello, se pueden utilizar los siguientes métodos: $this >forward('modulo', 'pagina'). Realiza una redirección interna del flujo. $this >redirect('modulo/pagina') o $this >redirect('http://www.google.com'). Indica al navegador del Cliente a través de un mensaje HTTP que se dirija al URL indicado. $this >forward404(). Reenvía al Cliente a la página de recurso no encontrado (Error 404).
Repitiendo código en todas las acciones de un módulo Existen ocasiones en las que es necesario repetir fragmentos de código antes y después de la ejecución de todas las acciones de un módulo (Ej. apertura y cierre de conexiones a BD). Para estos casos se pueden utilizar los métodos: preexecute(). Ejecuta un conjunto de operaciones antes de cualquier método executexxx. postexecute(). Ejecuta un conjunto de operaciones después de cualquier método executexxx.
Accediendo al objeto de peticiones
Manejando sesiones Para manejar sesiones dentro de las acciones se pueden utilizar los siguientes métodos: $this >getuser() >setattribute('atributo', 'valor')). Permite almacenar información en la sesión del usuario. $this >getuser() >getattribute('atributo'). Permite obtener información de la sesión del usuario. $this >getuser() >getattributeholder() >remove('atributo'). Permite eliminar información de la sesión del usuario. $this >getuser() >getattributeholder() >clear(). Permite terminar el objeto de sesión del usuario. Para manejar sesiones dentro de las plantillas cuenta con el objeto principal: $sf_user (Ej. $sf_user >getattribute('atributo))
Atributos Flash Los Atributos Flash sirven para asignar valores temporales con ámbito de sesión. Esta información expira tras cada nueva petición. En los métodos execute se pueden utilizar de la siguiente forma: $this >setflash('atributo', 'valor'). Permite almacenar información en la sesión del usuario temporalmente. $this >getflash('atributo'). Permite obtener información de la sesión temporal del usuario. Para manejar sesiones temporales dentro de las plantillas cuenta con el objeto principal: $sf_flash. <?php if ($sf_flash >has('atributo')):?> <?php echo $sf_flash >get('atributo')?> <?php endif;?>
Seguridad de acciones En Symfony se puede utilizar seguridad declarativa para restringir el acceso a los recursos. Para ello simplemente debe agregar las directivas apropiadas dentro del archivo security.yml de la carpeta config de su módulo. Por ejemplo: index: is_secure: off # Todos los usuarios pueden acceder holamundo: is_secure: on # Sólo los usuarios autenticados pueden acceder helpers: is_secure: on credentials: admin # Sólo los usuarios autenticados con la credencial de admin pueden acceder nueva: is_secure: on credentials: [admin, [[invitado, desarrollador]]] # Sólo los usuarios autenticados con la credencial de admin Y (invitado O desarrollador) pueden acceder all: is_secure: off # Valor por omisión para el resto de acciones
Para garantizar el acceso Para garantizar el acceso a aquellas páginas que han sido marcadas como seguras (is_secure: on) debe autenticar la sesión del usuario. Por ejemplo: class mimoduloactions extends sfactions public function executeindex() if ($this >getrequestparameter('usuario') == 'juan') $this >getuser() >setauthenticated(true); public function executefinsesion() $this >getuser() >setauthenticated(false);
Trabajando con credenciales class mimoduloactions extends sfactions public function executehelpers() $user = $this >getuser(); // Agregando credenciales $user >addcredential('admin'); $user >addcredentials('invitado', 'desarrollador'); // Validando credenciales del usuario echo $user >hascredential('admin'); => true // Validando si el usuario tiene alguna de las credenciales echo $user >hascredential(array('admin', 'root')); => true // Validando si el usuario tiene todas las credenciales echo $user >hascredential(array('admin', 'invitado'), true); => true // Eliminando una credencial $user >removecredential('invitado'); echo $user >hascredential('invitado'); => false // Eliminando todas las credenciales $user >clearcredentials(); echo $user >hascredential('admin'); => false
Trabajando con credenciales en la plantillas <?php if ($sf_user >isauthenticated()):?> Estoy autenticado!!! <?php endif;?> <?php if ($sf_user >hascredential('admin')):?> Y soy admin!!! <?php endif;?>
Validaciones class mimoduloactions extends sfactions // Es ejecutado antes del método executemiaccion public function validatemiaccion() return ($this >getrequestparameter('id') > 0); /* Es ejecutado en caso de que el método validatemiaccion * devuelva false. Retorna el flujo a las plantillas (sin * pasar por el método executemiaccion */ public function handleerrormiaccion() $this >message = "Parámetro inválido"; return sfview::success; /* Es ejecutado en caso de que el método validatemiaccion * devuelva true */ public function executemiaccion() $this >message = "Los parámetros son correctos";