Ahora que ya tenemos instalado y correctamente configurado nuestro entorno de desarrollo local con Dockers, vamos a comenzar a escribir una pequeña aplicación Yii2.
Para ello primero vamos a familiarizarnos con el Framework.
Creación de “hello world” en Yii2
Todas las peticiones que se reciben en Yii son recibidas por web/index.php
.
En la carpeta controllers
vemos los distintos controladores. Partiendo del ejemplo del post anterior, vemos que existe el fichero controllers/SiteController.php
. Aqui añadiremos nuestra función. Los nombres de las funciones deben comenzar con action
. Por ejemplo vamos a definir una ruta nueva en nuestra aplicación, que sea /di-algo
y muestre un mensaje.
Nuestro primer controlador
Para ello editamos controllers/SiteController.php
y añadimos nuestra nueva ruta:
/** * * @return string */ public function actionDiAlgo($message = 'Hola') { return $this->render('diAlgo', ['message' => $message]); }
Le hemos dicho que renderice usando la plantilla diAlgo
y que le pase el mensaje indicado en $message
(o, si no le digo nada, por defecto pondrá “Hola”).
Nuestra primera plantilla
Vamos a crear la plantilla a la que estamos llamando. Para ello creamos un nuevo fichero diAlgo.php
en views/site/diAlgo.php
con este contenido:
<?php use yii\helpers\Html; ?> <?= Html::encode($message) ?>
Para evitar un posible ataque XSS no nos limitamos a mostrar el valor de $message
, sino que lo pasamos por el helper Html::encode
primero (que está definido en yii\helpers\Html
).
Ahora podemos acceder a http://unizaryii.docker.localhost:8000/index.php?r=site%2Fdi-algo&message=Hola+mundo y veremos nuestro Hello World en acción.
Añadiendo un nuevo enlace en la barra de menús
Vamos a añadir un nuevo enlace en nuestra barra de menú superior.
El layout del menú se controla en views/layout/main.php
. Modificamos el código para añadir al array el nuevo link, que quedará así…
... echo Nav::widget([ 'options' => ['class' => 'navbar-nav navbar-right'], 'items' => [ ['label' => 'Home', 'url' => ['/site/index']], ['label' => 'About', 'url' => ['/site/about']], ['label' => 'Contact', 'url' => ['/site/contact']], ['label' => 'Hola Mundo', 'url' => ['/site/di-algo']], Yii::$app->user->isGuest ? ( ['label' => 'Login', 'url' => ['/site/login']] ) : ( '
Y ya se muestra y funciona correctamente.
Haciendo URLs pretty en Yii2
En la ruta del ejemplo que hemos construido (http://unizaryii.docker.localhost:8000/index.php?r=site%2Fdi-algo&message=Hola+mundo o, lo que es lo mismo, http://unizaryii.docker.localhost:8000/index.php?r=site/di-algo&message=Hola+mundo) vemos que la URL tiene el sufijo /index.php?r=site/di-algo
Esto se corresponde con el fichero que atiende las peticiones (index.php
) seguido del nombre del controlador (site
) y después la ruta definida en ese controlador (di-algo
) y sus parámetros (&message=Hola+Mundo
).
Veamos cómo hacerla más bonita. Para ello tu servidor Apache deberá tener habilitado mod_rewrite. Esto ya viene así por defecto en el entorno que creamos con Docker.
Creamos un archivo .htaccess
en el webroot
(osea, dentro de la carpeta web
) con el siguiente contenido:
RewriteEngine on # If a directory or a file exists, use it directly RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d # Otherwise forward it to index.php RewriteRule . index.php
Y además modificamos config/web.php
. La parte del urlManager
quedará así:
'urlManager' => [ 'enablePrettyUrl' => true, // usar url's bonitas 'showScriptName' => false, // ocultar index.php 'rules' => [ '<action:(.*)>' => 'site/',, ], ],
Y ahora ya podemos visitar la URL http://unizaryii.docker.localhost:8000/di-algo que es mucho más bonita: