Curso Laravel
Curso Laravel
• Introducción
• Capítulo 1. Instalación
• Capítulo 2. PSR-4 y namespaces
• Capítulo 3. Conexión con base de datos
• Capítulo 4. Estructura de un proyecto en Laravel
• Capítulo 5. JSON
• Capítulo 6. Migraciones y Seeders
• Capítulo 7. Modelos y uso de Eloquent
• Capítulo 8. Model factories (Poblar base de datos con faker)
• Capítulo 9. Enrutamiento básico
• Capítulo 10. Vistas y motor de plantillas Blade
• Capítulo 11. Controladores
• Capítulo 12. Validaciones en Laravel
• Capítulo 13. Middlewares
• Anexo A. HTML5
• Anexo B. CSS
• Anexo C. CRUD con Laravel
• Anexo D. Componente Datatable
Introduction
Introducción a Laravel 5
Laravel es un framework para aplicaciones web con sintaxis expresiva y elegante. Creemos
que el desarrollo debe ser una experiencia agradable y creativa para que sea
verdaderamente enriquecedora. Laravel busca eliminar el sufrimiento del desarrollo
facilitando las tareas comunes utilizadas en la mayoría de los proyectos web, como la
autenticación, enrutamiendo, sesiones y almacenamiento en caché.
+
Laravel es un framework para el lenguaje de programación PHP. Aunque PHP es conocido
por tener una sintaxis poco deseable, es fácil de usar, fácil de desplegar y se le puede
encontrar en muchos de los sitios web modernos que usas día a día. Laravel no solo ofrece
atajos útiles, herramientas y componentes para ayudarte a conseguir el éxito en tus proyectos
basados en web, si no que también intenta arreglar alguna de las flaquezas de PHP.
Laravel tiene una sintaxis bonita, semántica y creativa, que le permite destacar entre la gran
cantidad de frameworks disponibles para el lenguaje. Hace que PHP sea un placer, sin
sacrificar potencia y eficiencia. Es sencillo de entender, permite mucho la modularidad de
código lo cuál es bueno en la reutilización de código.
Beneficios de Laravel
1. Incluye un ORM: A diferencia de CodeIgniter, Laravel incluye un ORM integrado. Por lo cual
no debes instalar absolutamente nada.
3. Programas de una forma elegante y eficiente: No más código basura o espaguetti que no
se entienden, aprenderás a programar ‘con clase’ y ordenar tu código de manera de que sea
lo más re-utilizable posible.
6. Rutas elegantes y seguras: Una misma ruta puede responder de distinto modo a un método
GET o POST.
9. Cuenta con una comunidad activa que da apoyo rápido al momento de que lo
necesitas.
Requerimientos iniciales
Para empezar a trabajar con Laravel es necesario cumplir con los siguientes requisitos
iniciales:
Composer usa un archivo dentro de tu proyecto de Laravel para poder administrar las
dependencias el cual se llama: composer.json. Este usa un formato JSON el cual se
explicará más adelante, un ejemplo de él se muestra e esta imagen:
Ahora, composer no se limita a su uso unicamente con proyectos Laravel, sino que en Laravel
el uso de composer nos facilita el control de dependencias y en la actualización de cada una
como se explicó anteriormente. Para este curso se trabajará con este archivo pues es el que
se va a crear al momento de instalar Laravel.
• "name": En esta sección se describe el nombre del usuario propietario del proyecto seguido
del nombre del repositorio que aloja el proyecto separados por una barra(/).
• "description": Sirve para facilitar una breve descripción del paquete. Debemos ser muy
claros y breves si deseamos colocar una descripción de nuestro paquete.
• "keywords": Estas palabras claves son una matriz de cadenas usadas para representar tu
paquete. Son similares a etiquetas en una plataforma de blogs y, esencialmente, sirven al
mismo propósito. Las etiquetas te ofrecen metadatos de búsqueda para cuando tu paquete
sea listado en un repositorio.
• "homepage": La configuración de la página es útil para paquetes que van a ser de código
libre. Puedes usar esta página para el proyecto o quizá para la URL del repositorio. Lo que
creas que es más informativo.
• "license": Si tu paquete está pensado para ser redistribuido, querrás ofrecer una licencia
con él. Sin una licencia muchos programadores no podrán usar el paquete por restricciones
legales. Escoge una licencia que se ajuste a tus requisitos, pero que no sea muy restrictiva
para aquellos que esperan usar tu código. El proyecto de Laravel usa la licencia MIT que
ofrece gran libertad.
• "authors": ofrece información sobre los autores del paquete, y puede ser útil para aquellos
usuarios que quieran contactar con el autor o autores. Ten en cuenta que la sección de
autores permite una matriz de autores para paquetes colaborativos.
Gestor de dependencias
composer install
Con esto le indicamos a composer que debe descargar nuestras dependencias y las
dependencias de estas dependencias para satisfacer las necesidades de nuestro proyecto.
Para más información sobre composer, sus campos y su forma de uso podemos consultar
su página oficial https://getcomposer.org/doc/ la cuál se encuentra en inglés.
Instalación de Laravel
Existen diferentes formas de instalar laravel en nuestra computadora.
• Usando composer:
• composer create-project laravel/laravel --prefer-dist Proyecto
Una vez instalado laravel es recomendable situarse en la raíz del proyecto y ejecutar:
composer update
php artisan key:generate
php artisan app:name Curso
PSR-4 y namespaces
¿Qué es PSR-4?
Es una especificación para la auto carga de clases desde la ruta de los archivos.
Describe dónde se encuentran ubicados los archivos que serán autocargados.
PSR-4 hace uso de namespaces para distinguir una clase de otra, esto es de gran
ayuda cuando ocupamos librerías de terceros porque en muchas ocaciones
existirán clases con el mismo nombre que las nuestras y podrían sobreescribirse
o usar una que no queremos.
PSR-4 fue creada por el grupo de interoperabilidad de PHP, ellos han trabajado
en la creación de especificaciones de desarrollo para este lenguaje para que
estandarizemos diferentes procesos, como es en este caso el como nombrar las
clases de nuestro proyecto y hacer uso de ellas.
¿Qué es un autoloader?
Aparecieron desde la versión de PHP5 y nos permite encontrar clases para PHP
cuando llamamos las funciones new() o class_exists(). De esta forma no tenemos
que seguir haciendo uso de require() o include().
PSR-4 nos permite definir namespaces de acuerdo a la ruta de los archivos de
las clases, es decir, si tenemos una clase "Pdf" en el directorio Clases/Templates/
, ese será su namespace. Podemos hacer un simil con el import de java.
{
"autoload":{
"psr-4":{
"Taller\\": "app/"
}
}
}
Para usar los namespaces dentro de nuestros archivos php basta con
referenciarlos de la siguiente forma:
use Taller\Clase;
¿Qué es classmap?
Es un autoloader que nos permite registrar nuestras clases para poder ocuparlas
sin necesidad de un namespace, la desventaja respecto a PSR-4 es la colisión
de clases con mismo nombre, la principal ventaja es la rápidez de autocarga de
clases. Otro inconveniente de usar classmap es que debemos ejecutar
constantente el comando "composer dump-autoload" por cada clase nueva en
el directorio que indiquemos o tengamos registrado en el
archivo "composer.json".
Ejemplo:
{
"classmap": [
"database"
],
}
• MySQL
• Postgresql
• SQLite3
• SQL Server
• migrations
• password_resets
• users
Si eres una persona curiosa habrás notado que el nombre de las tablas en Laravel
siempre son escritas en plural, esto no es por puro capricho, es parte de una
convención: Convención de la configuración , dicha convención le permite a
Laravel hacer magía por nosotros, nos evita realizar configuración y pasos extras
de la asociación de Modelos con tablas entre otras cosas.
• app/
• bootstrap/
• config/
• database/
• public/
• resources/
• storage/
• tests/
• vendor/
• .env
• .env.example
• .gitattributes
• .gitignore
• artisan
• composer.json
• composer.lock
• gulpfile.js
• package.json
• phpspec.yml
• phpunit.xml
• readme.md
• server.php
El directorio app
App es usado para ofrecer un hogar por defecto a todo el código personal de tu
proyecto. Eso incluye clases que puedan ofrecer funcionalidad a la aplicación,
archivos de configuración y más. Es considerado el directorio más importante de
nuestro proyecto ya que es en el que más trabajaremos.
El directorio app tiene a su vez otros subdirectorios importantes pero uno de los
más utilizados es el directorio Http en el cuál ubicaremos
nuestros Controllers, Middlewares y Requests en sus carpetas correspondientes,
además dentro del subdirectorio Http encontremos también el
archivo routes.phpdonde escribiremos las rutas de la aplicación.
A nivel de la raíz del directorio app encontraremos el modelo User.php, los
modelos comunmente se ubicarán a nivel de la raíz de la carpeta app aunque
igual es posible estructurarlos de la forma que queramos, por ejemplo, en una
carpeta llamada Models.
El directorio config
El directorio database
El directorio public
• assets: Aquí se ubican todos los archivos less de nuestra aplicación (útil para
desarrolladores front-end).
• lang: Aquí se encuentran todos los archivos de internacionalización, es decir, los
archivos para poder pasar nuestro proyecto de un idioma a otro. Normalmente
habrá una carpeta por cada idioma, ejemplo:
o en: idioma inglés
o es: idioma español
• views: Aquí ubicaremos nuestras vistas en formato php o php.blade, es
recomendable crear una carpeta por cada controlador, además agregar una
carpeta templates para las plantillas. Una plantilla es una vista general, que tiene
segmentos que pueden ser reemplazados mediante la herencia de plantillas, más
adelante se hablará de este tema.
El directorio storage
JSON
Por defecto, JSON se guarda sin espacios entre sus valores lo cual lo puede hacer
un poco más difícil de leer. Esto se hace normalmente para ahorrar ancho de
banda al transferir los datos, sin los espacios en blanco adicionales, la cadena
JSON será mucho más corta y por tanto habrá menos bytes que transferir.
Sin embargo, JSON no se inmuta con los espacios en blanco o saltos de linea
entre las claves y valores, así que podemos hacer uso de ellos para hacerlo un
poco más legible. JSON es un formato de transferencia de dato y no un lenguaje.
Debemos tener siempre en cuenta que en el formato JSON las cadenas siempre
van en comillas dobles, además, los elementos clave y valor debes estar
separadas con dos puntos (:), y las parejas clave-valor por una coma (,).
Por ejemplo:
{
"Frutas":[
{
"Nombre": "Manzana",
"Cantidad": 20,
"Precio": 10.50,
"Podrida": false
},
{
"Nombre": "Pera",
"Cantidad": 100,
"Precio": 1.50,
"Podrida": true
}
]
}
Los tipos de valores aceptados por JSON
Los tipos de valores que podemos encontrar en JSON son los siguientes:
Validación de JSON
Podemos ocupar JSONLint que es una muy buena opción, bastará con copiar y
pegar nuestro JSON en el área de texto y a continuación dar click en el botón
"Validate".
JSONLint nos informará si es correcto el formato o en caso contrario nos mostrará
los errores sintácticos de nuestro JSON.
Migraciones
Cuando creamos nuestras bases de datos solemos crear diagramas que nos
facilitan la abstracción de como se va a almacenar nuestra información, pero la
forma de llevarlo a la realidad en algun gestor de bases de datos, como por
ejemplo: MySQL, SQLite, PostgreSQL, SQL Server, etc., lo más comun es
meternos al lenguaje de script encargado de implementar nuestra idea de la BD
y ejecutar dicho script, o incluso ocupar programas más avanzados que nos sirven
como interfaz para crearlas de una forma más gráfica y sin la necesidad de
profundizar demasiado en el lenguaje, como Workbench o Navicat.
En Laravel se lleva a otro contexto esta situación, puesto que visto de la forma
tradicional si se requieren cambios en la base de datos tenemos que meternos ya
sea a otro programa para cambiar el diagrama de la base o a un archivo SQL con
una sintaxis usualmente complicada o difícil de leer y ejecutar los cambios para
reflejarlos en el proyecto, sin embargo, con esto no contamos con un control de
los cambios (control de versiones) sobre la base de datos, si necesitamos
consultar un cambio anterior o de repente la solución previa o inicial era la que se
necesita al momento debemos re-escribir todo otra vez, cosa que con
la migraciones se soluciona instantaneamente.
3. Después como la función down hace lo opuesto que la función up, dentro de esta
eliminaremos los campos recien agregados.
Beneficios
• Podemos con un simple comando ver reflejados los cambios de nuestra base de
datos.
• La ultima versión de nuestra base siempre estará actualizada para todos los
miembros del equipo de trabajo si usamos un control de versiones como GIT.
Seeders
Los Seeders por otra parte son archivos que nos van a permitir poblar nuestra
base de datos para no tener que perder el tiempo escribiendo de forma manual
todos los datos, un ejemplo, imagina llenar 15 tablas con 100 registros cada una
y piensa en que entre cada tabla deben existir registros que se relacionan entre
sí, eso suena de verdad horrible y tedioso, por lo cual Laravel nos salva con estos
archivos Seeders.
Cuando trabajamos con Migraciones y Seeder por primera vez puede parecer un
poco más complicado que a lo que estamos acostumbrados pero las ventajas que
nos da superan por mucho a la forma convencional, además de ser una forma
más profesional de trabajar.
Eloquent hace uso de los Modelos para recibir o enviar la información a la base
de datos, para esto analizaremos el modelo que viene por defecto en Laravel,
este es el modelo User que se ubica en la carpeta app/, los modelos hacen uso
de PSR-4 y namespaces, un modelo nos ayuda a definir que tabla, atributos se
pueden llenar y que otros se deben mantener ocultos.
Los modelos usan convenciones para que a Laravel se le facilite el trabajo y nos
ahorre tanto líneas de código como tiempo para relacionar más modelos, las
cuales son:
Y esto aplica para cuando queremos crear nuestros modelos, si tenemos una
tabla en la base de datos con la que queremos trabajar que se
llama user_profiles, vemos que se encuentra con las convenciones para tablas
de bases de datos (plural y underscore), entonces el modelo para esta tabla
cambiando las convenciones seria: UserProfile (singular y UpperCamelCase).
Retomando el ejemplo que vimos en el Capítulo 6 sobre la migracion de pasteles,
crearemos ahora un modelo para poder trabajar con esa tabla, el cual recibira el
nombre de Pastel y el comando para poder crear nuestro modelos es:
Bien una vez creado nuestro modelo pasaremos a crear una ruta de tipo get en
nuestro archivo routes.php, posteriormente estudiaremos el enrutamiento básico
en Laravel en el Capítulo 9, por el momento solo seguiremos el ejemplo, que
quedaria de la siguiente forma:
Route::get('pruebasPastel', function(){
});
Dentro de esta ruta de prueba vamos a usar nuestro modelo, pero como estamos
usando la especificacion PSR-4 debemos incluir el namespace del modelo al
inicio del archivo, que seria igual a esto:
use Curso\Pastel;
Con esto estamos diciendo que incluya la clase Pastel que es nuestro modelo, y
con esto podemos ya hacer consultas a nuestra BD y mapear a objetos PHP. En
la documentacion oficial de Laravel podemos ver todas las opciones que nos
permite Eloquent, unas de las instrucciones basicas de este son get()que nos
regresa todos los registros de la BD y first() que nos regresa el primer registro de
una seleccion.
A su vez podemos unir esto a más filtros de seleccion SQL, como por ejemplo
seleccionar el primer pastel de vainilla, la sintaxis de Eloquent seria la siguiente:
$pastel = Pastel::where('sabor','vainilla')->first();
Esto nos va a dar el primer pastel sabor vainilla, pero si quisieramos todos los
pasteles de vainilla cambiariamos el metodo first() por el metodo get() para
obtener todos.
Y si queremos ver el resultado de esto y que de verdad estamos haciendo lo
correcto podemos usar la funcion dd() para mostrar en pantalla el valor de una
variable, con esto entonces nuestra ruta le agregariamos lo siguiente:
Route::get('pruebasPastel', function(){
$pasteles = Pastel::where('sabor','vainilla')->get();
dd($pasteles);
});
Y en el navegador deberiamos ver algo como esto:
Esto es la función dd($pasteles) mostrando el contenido de la variable $pasteles.
Ahora bien si tuvieramos la necesidad de realizar siempre un mismo filtro,
Eloquent nos provee de una herramienta llamada scopes que lo que realizan son
consultas en especifico encapsulandolas dentro de funciones en el modelo, por
ejemplo si quisieramos que el modelo Pastel tuviera una funcion que me diera
todos los pasteles de vainilla, otra de chocolate y otra función mas para
cheesecake, entonces podria crear un scope para cada una.
Con el ejemplo de la ruta pruebasPastel para el sabor vainilla:
Route::get('pruebasPastel', function(){
$pasteles = Pastel::vainilla()->get();
dd($pasteles);
});
También podemos crear scopes dinámicos de la siguiente forma:
Route::get('pruebasPastel', function(){
$pasteles = Pastel::sabor('vainilla')->get();
dd($pasteles);
});
Además con Eloquent tambien podemos insertar, actualizar o eliminar registros,
por ejemplo:
$pastel->save();
Para actualizar seria la siguiente:
$pastel = Pastel::find(51);
$pastel->sabor = 'chocolate';
$pastel->save();
Para eliminar seria la siguiente:
$pastel = Pastel::find(51);
$pastel->delete();
o bien podriamos destruir el registro directamente con el modelo si tenemos su
ID:
Pastel::destroy(51);
Model Factories
Los model factories son una excelente forma de poblar nuestra base de datos con
datos de prueba generados automáticamente. Laravel en su versión 5.1 incorpora
este nuevo componente por defecto, en versiones anteriores a Laravel 5.1 era
necesario agregar el componente faker en nuestro composer.jsony realizar el
proceso de manera manual en los archivos seeders, para más información sobre
estre proceso puedes visitar el link de github del componente Faker.
Los model Factories en realidad también trabajan con el componente Faker, esto
lo podemos confirmar si miramos nuestro composer.json, sin embargo, nos
ofrecen una manera más elegante y ordenada de trabajar.
Laravel 5.1 trae un ejemplo de como usar este nuevo componente, lo podemos
encontrar en el archivodatabase/factories/ModelFactory.php.
El método $factory->define() regresa un array con los datos del modelo que se
va a poblar, recibe como primer parámetro el modelo con el que deseamos
trabajar y como segundo parámetro una función que recibe como parámetro un
objeto $faker.
Ejemplo:
Ejemplos:
factory('Curso\User',100)->create();
Enrutamiento básico
La siguiente imágen muestra el proceso que se realiza cuando ingresamos a una
URL. Además muestra la arquitectura del patrón MVC que utiliza laravel para el
desarrollo de proyectos.
Route::get('saludo', function () {
return "Bienvenido :)";
});
Lo que debería mostrar un mensaje similar a este:
Como verás, todas las peticiones realizadas por un navegador web contienen un
verbo. La mayoría de las veces, el verbo será GET , que es usado para solicitar
una página web. Se envía una petición GET cada vez que escribes una nueva
dirección web en tu navegador.
Aunque no es la única petición. También está POST , que es usada para hacer
una petición y ofrecer algunos datos. Normalmente se usa para enviar un
formulario en la que se necesita enviar los datos sin mostrarlo en la URL.
Hay otros verbos HTTP disponibles. He aquí algunos de los métodos que la clase
de enrutado tiene disponible para ti:
Route::get();
Route::post();
Route::any();
Route::delete();
Route::put();
Cualquier método de la clase Route recibe siempre dos argumentos, el primero
es la URI con la que queremos hacer coincidir la URL y el segundo es la función
a realizar que en este caso es un Clousure que no es otra cosa que una función
anonima, es decir, que no tiene un nombre.
Route::get('home', 'HomeController@index');
Lo segundo que vemos es el uso del método where el cúal nos permite establecer
expresiones regulares a las variables que usamos en la construcción de las URIs.
Vistas y Blade
Las vistas en Laravel son la parte pública que el usuario de nuestro sistema va a
poder ver, se escriben en HTML junto con un motor de plantillas llamado Blade.
Las vistas se encuentran ubicadas en la carpeta resources/views/ y Laravel por
defecto trabaja con la idea de que tenemos que escribir la menor cantidad de
código repetido, modularizar nuestro código en donde mas se pueda, y si esto lo
aplicamos en nuestros modelos, controladores y demás partes de nuestro
proyecto, entonces, ¿Por que no hacerlo tambien en las vistas?.
Laravel usa unos archivos que se llaman plantillas o templates que suelen ser
nuestros archivos principales, que tienen los segmentos de código que se repiten
en mas de una vista, como por ejemplo la barra de navegacion, un menú de
opciones, la estructura del acomodo de nuestro proyecto, etc. y como deben de
estar practicamente presentes en todos lados, no tiene sentido estarlos repitiendo
en todas las vistas. Por defecto Laravel contiene
un template llamado app.blade.php, usualmente los templatescontienen el
head del HTML, las ligas del CSS del sistema y una seccion exclusiva para los
archivos Javascript.
Además de los templates, se cuentan con archivos que se llaman partials, estos
archivos son pequeños segmentos de código que suelen ser usados comunmente
en partes del sistema en especifico, como los formularios o secciones de
mensajes, estos archivos surgen por el código que es mas pequeño que
repetimos mucho pero no es lo suficientemente grande como para considerarlo
un template.
Esto hace que las vistas de cada parte del proyecto, que suelen ser llamadas por
una ruta o controlador sean mucho mas pequeñas que usando otro tipo de
frameworks para desarrollo Web, y para poder unir todos estos archivos o piezas
del rompecabezas usamos el motor de plantillas de Laravel llamado BLADE.
Antes de ver mas sobre el motor de plantillas Blade, veremos como trabajar con
las Vistas y llamarlas desde una ruta, crearemos un vista simple con un archivo
nuevo en la carpeta resources/views/ llamado saludo.blade.php con el siguiente
código:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>Vista ejemplo</title>
</head>
<body>
<h1>Hola mundo desde Laravel</h1>
</body>
</html>
Es un HTML simple con un titulo 1, ahora vamos a crear una ruta que nos muestre
esta vista:
Route::get('saludo', function(){
return view('saludo');
});
De esta forma con la función view() le estamos diciendo a Laravel que busque
dentro de la carpeta resources/views/ la vista saludo.blade.php, por convension
las vistas Laravel no necesita que especifiquemos la extension .blade.php, sino
solo su nombre. Una vez hecho esto debemos ver este resultado o uno similar:
Continuando con el ejemplo de los Pasteles vamos a mandar a la vista el nombre
de un pastel, dentro de la ruta saludo vamos a obtener el primer Pastel de
chocolate de nuestra BD y a poner ese nombre en vez del mensaje. Para esto
podemos usar el scope de sabor para obtener los pasteles de chocolate y
despues decirle que con el metodo first() nos regrese el primer pastel y eso
guardarlo en una variable, dejando la ruta de la siguiente forma:
Route::get('saludo', function(){
$pastel = Pastel::sabor('chocolate')->first();
return view('saludo')->with('pastel', $pastel->nombre);
});
De esta forma estamos diciendo a la ruta que nos regrese la
vista saludo.blade.php con una variable llamada pastel, que es el nombre del
pastel, pero esto por si solo no lo va a mostrar el navegador, solo va a mandar la
variable, para que el navegador la muestre debemos agregar un titulo donde este
esa variable de esta forma:
Blade
Blade nos provee de muchas ventajas (asi como casi todo en Laravel), además
de modularizar nuestras vistas de una forma sorprendente, tambien nos permite
usar estructuras de control y variables de PHP directamente en ellas, aunque esto
ya era posible antes usando las etiquetas de php, por ejemplo:
{{ $pastel }}
Esto es el equivalente a <?= $pastel ?> y aunque con un ejemplo tan sencillo no
se ve demasiada diferencia, con lo siguiente podremos verificar la potencia de
este motor de plantillas.
Usualmente las estructuras de control que conocemos las usamos en los archivos
PHP dedicados al Back-end (lado del servidor), pero blade nos da una sintaxis
muy comoda para este tipo de estructuras que con PHP plano son muy sucias e
incomodas de usar.
Para cada una de estas estructuras como lo son If, else, elseif, for, foreach,
etc., se antepone un @para usar estas estructuras y listo!! eso en suficiente, pero
a diferencia de como estamos a costumbrados de encapsular un grupo de
sentencias o lineas de código con llaves { }, en blade definimos el fin de una
estructura con un @end seguido del nombre de la estructura que usamos, por
ejemplo:
<h1>Lista de pasteles</h1>
@foreach($pasteles as $pastel)
<h2>{{ $pastel->nombre }}</h2>
@endforeach
Entonces en la ruta donde regresamos solo un nombre de un pastel, podriamos
regresar todos los pasteles y escribir una lista de todo los pasteles de un cierto
sabor e imprimirla en la vista.
Esto aplica para todas las estructuras, su lógica es la misma pero solo cambia un
poco su sintaxis, pero hace que el HTML quede mas limpio que si incrustaramos
PHP plano dentro de nuestra vista.
Templates y Partials
Anteriormente hablabamos de templates y partials, describiremos un poco de
como se trabaja con esta estructuras de Blade y sus beneficios:
Templates
Estos archivos como se menciona al principio del capítulo son plantillas que nos
ahorran mucho código o leguaje HTML, y para usar un template se usa la
sentencia:
@extends('template')
Claramente se tendria que sustituir la palabra template dentro de la
sentencia extends por el nombre de la vista que va a funcionar
como template o plantilla.
Un template es una vista como las demás, simplemente que dentro de ella se
usan otras sentencias que nos va a permitir definir areas del archivo que se van
a poder sustituir mas adelante dentro de otra vista si es que lo deseamos. Para
esto se ocupa la sentencia:
@yield('nombre_seccion')
Para declarar una seccion que se va a rellenar en otro lugar:
@section('nombre_seccion')
que funciona de la misma forma que yield() con la diferencia que en la seccion
puedes definir HTML por defecto en caso de no definir la seccion con un nuevo
HTML.
@extends('app')
@section('content')
<h1>Lista de pasteles</h1><br>
@if( $pasteles->count() > 10 )
<h2>Hay muchos Pasteles</h2><br>
@endif
@foreach($pasteles as $pastel)
<h4>{{ $pastel->nombre }}</h4>
@endforeach
@stop
Ahora nuestra vista ya no tiene el encabezado HTML normal ni las
etiquetas <body> ni <html>, sino que estamos diciendo que vamos a extender del
template app y que el yield content lo vamos a sustituir por nuestro propio
contenido, cabe mencionar que aunque en el template se uso la
sentencia yield('content'), al momento de sustituirla la vamos a cambiar
por section('content'), por lo cual en todas las vistas hijas del template solo se
va a definir secciones y el fin de esa seccion se va a declarar con la
entencia @stop.
Ahora el resultado seria algo parecido a esto:
Nos podemos dar cuenta que cambiaron muchas cosas, ahora tenemos una barra
de navegacion en la parte superior de la ventana y el debugbar en la parte inferior,
además de que la tipografia ha cambiado. Esto es porque dentro del template app
se estan agregando hojas de estilo CSS.
Partials
Continuaremos con los partials, basicamente es lo mismo que ya hemos visto
pero con una sentencia mas que se llama include('nombre.partial'), la cual esta
incluyendo o incrustando un archivo de HTML, podemos hacer un simil con
los use de PSR-4 o los import de Java, a diferencia de que esto lo inlcuye justo
en el lugar donde lo definimos.
Vamos a verlo con un ejemplo practico.
Dentro la actual vista saludo.blade.php, vamos a quitar todo el HTML Blade que
definimos para crear esta lista pequeña de pasteles y lo vamos a guardar en
nuevo archivo, para esto vamos a crear una carpeta llamada pasteles y dentro
otra carpeta llamada partials, donde vamos a guardar la vista de nuestro nuevo
partial, quedando la ruta de la siguiente
forma: resources/views/pasteles/partials/.
Ahi vamos a crear un archivo llamado lista.blade.php y dentro de este archivo
vamos a cortar el código de nuestra vista saludo, quedando asi:
<h1>Lista de pasteles</h1><br>
@if( $pasteles->count() > 10 )
<h2>Hay muchos Pasteles</h2><br>
@endif
<ul>
@foreach($pasteles as $pastel)
<li>{{ $pastel->nombre }}</li>
@endforeach
</ul>
Y nuestra vista saludo.blade.php quedaria de esta forma una vez que ya
incluyamos nuestro partial:
@extends('app')
@section('content')
@include('pasteles.partials.lista')
@stop
Si todo lo hacemos bien nuestra vista en el navegador debe seguir viendose de
la misma manera, pero si se dan cuenta ahora se encuentra mucho mas modular
nuestro HTML, si la lista de Pasteles la necesitaramos en otra vista ahora solo
necesitamos hacer un @include('pasteles.partials.lista') y con eso ya
tendremos nuestra lista agregada en cualquier vista donde la necesitemos.
• @show: Esta sentencia se usa para decir donde termina el section definido en
el template.
• @stop: Esta sentencia nos permite decir donde termina un section cuando se
usa el section dentro de las vistas hijas.
Enrutamiento básico
La siguiente imágen muestra el proceso que se realiza cuando ingresamos a una
URL. Además muestra la arquitectura del patrón MVC que utiliza laravel para el
desarrollo de proyectos.
Route::get('saludo', function () {
return "Bienvenido :)";
});
Lo que debería mostrar un mensaje similar a este:
Como verás, todas las peticiones realizadas por un navegador web contienen un
verbo. La mayoría de las veces, el verbo será GET , que es usado para solicitar
una página web. Se envía una petición GET cada vez que escribes una nueva
dirección web en tu navegador.
Aunque no es la única petición. También está POST , que es usada para hacer
una petición y ofrecer algunos datos. Normalmente se usa para enviar un
formulario en la que se necesita enviar los datos sin mostrarlo en la URL.
Hay otros verbos HTTP disponibles. He aquí algunos de los métodos que la clase
de enrutado tiene disponible para ti:
Route::get();
Route::post();
Route::any();
Route::delete();
Route::put();
Cualquier método de la clase Route recibe siempre dos argumentos, el primero
es la URI con la que queremos hacer coincidir la URL y el segundo es la función
a realizar que en este caso es un Clousure que no es otra cosa que una función
anonima, es decir, que no tiene un nombre.
Route::get('home', 'HomeController@index');
En la imagen anterior podemos ver dos conceptos nuevos, el uso de valores por
default lo cúal logramos con el simbolo (?) despues del nombre de la variable y
en la función asignandole un valor por defecto, en este caso el entero 1.
Lo segundo que vemos es el uso del método where el cúal nos permite establecer
expresiones regulares a las variables que usamos en la construcción de las URIs.
Vistas y Blade
Las vistas en Laravel son la parte pública que el usuario de nuestro sistema va a poder ver,
se escriben en HTML junto con un motor de plantillas llamado Blade. Las vistas se
encuentran ubicadas en la carpeta resources/views/ y Laravel por defecto trabaja con la idea
de que tenemos que escribir la menor cantidad de código repetido, modularizar nuestro
código en donde mas se pueda, y si esto lo aplicamos en nuestros modelos, controladores y
demás partes de nuestro proyecto, entonces, ¿Por que no hacerlo tambien en las vistas?.
Laravel usa unos archivos que se llaman plantillas o templates que suelen ser nuestros
archivos principales, que tienen los segmentos de código que se repiten en mas de una vista,
como por ejemplo la barra de navegacion, un menú de opciones, la estructura del acomodo
de nuestro proyecto, etc. y como deben de estar practicamente presentes en todos lados, no
tiene sentido estarlos repitiendo en todas las vistas. Por defecto Laravel contiene
un template llamado app.blade.php, usualmente los templatescontienen el head del
HTML, las ligas del CSS del sistema y una seccion exclusiva para los archivos Javascript.
Además de los templates, se cuentan con archivos que se llaman partials, estos archivos
son pequeños segmentos de código que suelen ser usados comunmente en partes del
sistema en especifico, como los formularios o secciones de mensajes, estos archivos surgen
por el código que es mas pequeño que repetimos mucho pero no es lo suficientemente
grande como para considerarlo un template.
Esto hace que las vistas de cada parte del proyecto, que suelen ser llamadas por una ruta o
controlador sean mucho mas pequeñas que usando otro tipo de frameworks para desarrollo
Web, y para poder unir todos estos archivos o piezas del rompecabezas usamos el motor de
plantillas de Laravel llamado BLADE.
Antes de ver mas sobre el motor de plantillas Blade, veremos como trabajar con las Vistas y
llamarlas desde una ruta, crearemos un vista simple con un archivo nuevo en la
carpeta resources/views/ llamado saludo.blade.php con el siguiente código:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>Vista ejemplo</title>
</head>
<body>
<h1>Hola mundo desde Laravel</h1>
</body>
</html>
Es un HTML simple con un titulo 1, ahora vamos a crear una ruta que nos muestre esta vista:
Route::get('saludo', function(){
return view('saludo');
});
De esta forma con la función view() le estamos diciendo a Laravel que busque dentro de la
carpeta resources/views/ la vista saludo.blade.php, por convension las vistas Laravel no
necesita que especifiquemos la extension .blade.php, sino solo su nombre. Una vez hecho
esto debemos ver este resultado o uno similar:
Route::get('saludo', function(){
$pastel = Pastel::sabor('chocolate')->first();
return view('saludo')->with('pastel', $pastel->nombre);
});
De esta forma estamos diciendo a la ruta que nos regrese la vista saludo.blade.php con una
variable llamada pastel, que es el nombre del pastel, pero esto por si solo no lo va a mostrar
el navegador, solo va a mandar la variable, para que el navegador la muestre debemos
agregar un titulo donde este esa variable de esta forma:
Ahora si bien usamos los caracteres de las dobles llaves y no sabemos bien que son, esto
es parte de la sintaxis que ahora veremos con Blade.
Blade
Blade nos provee de muchas ventajas (asi como casi todo en Laravel), además de
modularizar nuestras vistas de una forma sorprendente, tambien nos permite usar estructuras
de control y variables de PHP directamente en ellas, aunque esto ya era posible antes usando
las etiquetas de php, por ejemplo:
{{ $pastel }}
Esto es el equivalente a <?= $pastel ?> y aunque con un ejemplo tan sencillo no se ve
demasiada diferencia, con lo siguiente podremos verificar la potencia de este motor de
plantillas.
Usualmente las estructuras de control que conocemos las usamos en los archivos PHP
dedicados al Back-end (lado del servidor), pero blade nos da una sintaxis muy comoda para
este tipo de estructuras que con PHP plano son muy sucias e incomodas de usar.
Para cada una de estas estructuras como lo son If, else, elseif, for, foreach, etc., se
antepone un @para usar estas estructuras y listo!! eso en suficiente, pero a diferencia de
como estamos a costumbrados de encapsular un grupo de sentencias o lineas de código con
llaves { }, en blade definimos el fin de una estructura con un @end seguido del nombre de la
estructura que usamos, por ejemplo:
<h1>Lista de pasteles</h1>
@foreach($pasteles as $pastel)
<h2>{{ $pastel->nombre }}</h2>
@endforeach
Esto aplica para todas las estructuras, su lógica es la misma pero solo cambia un poco su
sintaxis, pero hace que el HTML quede mas limpio que si incrustaramos PHP plano dentro
de nuestra vista.
Templates y Partials
Anteriormente hablabamos de templates y partials, describiremos un poco de como se
trabaja con esta estructuras de Blade y sus beneficios:
Templates
Estos archivos como se menciona al principio del capítulo son plantillas que nos ahorran
mucho código o leguaje HTML, y para usar un template se usa la sentencia:
@extends('template')
Claramente se tendria que sustituir la palabra template dentro de la sentencia extends por
el nombre de la vista que va a funcionar como template o plantilla.
Un template es una vista como las demás, simplemente que dentro de ella se usan otras
sentencias que nos va a permitir definir areas del archivo que se van a poder sustituir mas
adelante dentro de otra vista si es que lo deseamos. Para esto se ocupa la sentencia:
@yield('nombre_seccion')
Para declarar una seccion que se va a rellenar en otro lugar:
@section('nombre_seccion')
que funciona de la misma forma que yield() con la diferencia que en la seccion puedes definir
HTML por defecto en caso de no definir la seccion con un nuevo HTML.
Definiremos nuestra vista recien creada saludo.blade.php para que use un template, por
defecto Laravel trae uno que se llama app.blade.php, ese es el que usaremos para este
ejemplo.
El template app por defecto tiene definida un yield llamado content que significa contenido,
por lo cual la lista de pasteles que tenemos la vamos a agregar en esta parte y la vista
quedaria de la siguiente forma:
@extends('app')
@section('content')
<h1>Lista de pasteles</h1><br>
@if( $pasteles->count() > 10 )
<h2>Hay muchos Pasteles</h2><br>
@endif
@foreach($pasteles as $pastel)
<h4>{{ $pastel->nombre }}</h4>
@endforeach
@stop
Ahora nuestra vista ya no tiene el encabezado HTML normal ni las etiquetas <body> ni <html>,
sino que estamos diciendo que vamos a extender del template app y que el yield content lo
vamos a sustituir por nuestro propio contenido, cabe mencionar que aunque en el template
se uso la sentencia yield('content'), al momento de sustituirla la vamos a cambiar
por section('content'), por lo cual en todas las vistas hijas del template solo se va a definir
secciones y el fin de esa seccion se va a declarar con la entencia @stop.
Ahora el resultado seria algo parecido a esto:
Nos podemos dar cuenta que cambiaron muchas cosas, ahora tenemos una barra de
navegacion en la parte superior de la ventana y el debugbar en la parte inferior, además de
que la tipografia ha cambiado. Esto es porque dentro del template app se estan agregando
hojas de estilo CSS.
Partials
Continuaremos con los partials, basicamente es lo mismo que ya hemos visto pero con una
sentencia mas que se llama include('nombre.partial') , la cual esta incluyendo o incrustando
un archivo de HTML, podemos hacer un simil con los use de PSR-4 o los import de Java, a
diferencia de que esto lo inlcuye justo en el lugar donde lo definimos.
Vamos a verlo con un ejemplo practico.
Dentro la actual vista saludo.blade.php, vamos a quitar todo el HTML Blade que definimos
para crear esta lista pequeña de pasteles y lo vamos a guardar en nuevo archivo, para esto
vamos a crear una carpeta llamada pasteles y dentro otra carpeta llamada partials, donde
vamos a guardar la vista de nuestro nuevo partial, quedando la ruta de la siguiente
forma: resources/views/pasteles/partials/ .
Ahi vamos a crear un archivo llamado lista.blade.php y dentro de este archivo vamos a
cortar el código de nuestra vista saludo, quedando asi:
<h1>Lista de pasteles</h1><br>
@if( $pasteles->count() > 10 )
<h2>Hay muchos Pasteles</h2><br>
@endif
<ul>
@foreach($pasteles as $pastel)
<li>{{ $pastel->nombre }}</li>
@endforeach
</ul>
Y nuestra vista saludo.blade.php quedaria de esta forma una vez que ya incluyamos
nuestro partial:
@extends('app')
@section('content')
@include('pasteles.partials.lista')
@stop
Si todo lo hacemos bien nuestra vista en el navegador debe seguir viendose de la misma
manera, pero si se dan cuenta ahora se encuentra mucho mas modular nue stro HTML, si la
lista de Pasteles la necesitaramos en otra vista ahora solo necesitamos hacer
un @include('pasteles.partials.lista') y con eso ya tendremos nuestra lista agregada en
cualquier vista donde la necesitemos.
Como recordatorio listaremos algunas de las sentencias de Blade junto con su funcion:
• @extends('nombre_template'): Esta sentencia nos ayuda a decirle a una vista cual va a ser
el template que se va a usar.
• @yield('nombre'): Esta sentencia nos permite declarar un futuro section de nuestro HTML
que se definira en las vistas que son heredadas y no puede agregarse algun tipo de contenido
por defecto, este sólo se usa en archivos que toman el rol de Template .
• @section('nombre'): Esta sentencia tiene dos usos dependiendo de que queremos declarar,
el primero es que nos permite declarar como su nombre lo dice una sección dentro del
template que puede tener un contenido por defecto que si no es redefinido en la vista que
herede el template entonces aparecera; el segundo nos permite asignar el contenido en una
seccion que fue declarada en nuestro template, es decir esta palabra section se usa tanto
en el template como en las vistas hijas, una diferencia mas es que si se usa en
el template entonces la seccion temina con un @show, pero si se usa en una vista hija
entonces termina la seccion con un @stop.
• @show: Esta sentencia se usa para decir donde termina el section definido en el template.
• @parent: Esta sentencia nos ayuda a cargar el contenido por defecto de un section del
template, esto podemos usarlo cuando queremos agregar mas contenido dentro pero sin
alterar el contenido por defecto, es decir agregarle mas HTML, esta sentencia se usa dentro
de un section, podemos hacer un simil con el super() de Java que sirve para llamar al
contructor de la superclase de la que se hereda.
• @stop: Esta sentencia nos permite decir donde termina un section cuando se usa el section
dentro de las vistas hijas.
• @include('ruta.nombre'): Esta sentencia nos agrega en el lugar donde sea usada un archivo
blade.php que contiene un partial o fragmento parcial de HTML, si ese partial se encuentra
en la raíz de las vistas no necesita mas que el nombre sin la extension blade.php, pero si
esta dentro de, por ejemplo, la carpeta "views/admin/users/" llamado table.blade.php para
poder ser incluido se usaría la ruta junto con el nombre quedando
como @include('admin.users.table') , views no se contempla pues es la raiz de las vistas.
• GET.
• POST.
• PUT.
• DELETE.
• PATCH.
Los controladores nos ayudan a agrupar estas peticiones en una clase que se liga
a las rutas, en el archivo app/Http/routes.php, para esto usamos un tipo de ruta
llamana resource:
Route::resource('pasteles', 'PastelesController');
Esta ruta nos creara un grupo de rutas de recursos con las peticiones que estas
mencionadas arriba: index, create, show, edit, store, update, destroy. Estas
son las operaciones mas usadas en una clase y para no tener que crear una ruta
para cada método es que Laravel agrupa todo esto con una ruta de tipo resource
que se liga a un controlador.
• create: Este método lo podemos usar para direccionar el sistema a la vista donde
se van a recolectar los datos(probablemente con un formulario) para después
almacenarlos en un registro nuevo, usualmente redirige al index.
• edit: Este método es similar al de create porque lo podemos usar para mostrar
una vista que recolecta los datos pero a diferencia de create es con el fin de
actualizar un registro.
• update: Al igual que el store, solo que en vez de provenir de create proviene
de edit y en vez de crear un nuevo registro, busca un existente y lo modifica,
tambien suele redirigir al index.
aqui podemos ver el nombre de nuestras rutas, de que tipo son, si es que reciben
parametros y como se llaman, esta información es muy util para poder asociar los
métodos del controlador con las rutas y tambien como es que las vamos a usar
en el navegador.
Validaciones en Laravel
Existen varias formas de validar nuestra aplicación para cubrir aspectos de
seguridad como SQL Injection, ataques XSS o CSRF, algunas de ellas son:
• text
• search
• url
• tel
• email
• password
• data pickers
• number
• checkbox
El atributo pattern
• Bootstrap
• Foundation
• Pure
• Semantic UI
• Otros
Smoke es el más completo plugin JQuery diseñado para trabajar con bootstrap 3,
además es open source e incluye las siguientes características:
• Validación de formularios.
• Sistema de notificaciones.
• Progressbar.
• Soporte para fullscreen.
• Agregar funcionalidad extra a los paneles de bootstrap.
• Helpers para conversión de tipos.
Para incluir smoke en nuestro proyecto sólo tenemos que descargar el plugin
de aquí.
Extraer los archivos del zip, y colocar los archivos CSS y JS dentro de la carpeta
public/assets de nuestro proyecto en Laravel:
public/
assets/
css/
smoke.css
smoke.min.css
js/
smoke.js
smoke.min.js
lang/
es.js
es.min.js
Una vez hecho esto, debemos hacer referencia a los estilos y scripts desde
nuestro documento html en la sección de head y body:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Ejemplo Smoke</title>
{!! Html::style('assets/css/smoke.css') !!}
</head>
<body>
Ejemplo:
app/Http/Request/CrearPastelesRequest
Su contenido es el siguiente:
<?php
namespace Curso\Http\Requests;
use Curso\Http\Requests\Request;
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
//
];
}
}
Lo siguiente que haremos será cambiar el valor que regresa el
método authorize() de false a true para permitir que el Request lo pueda ocupar
cualquier usuario.
<?php
namespace Curso\Http\Requests;
use Curso\Http\Requests\Request;
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'nombre' => 'required|string|max:60',
'sabor' => 'required|in:chocolate,vainilla,cheesecake'
];
}
}
De igual forma crearemos el Request para el método update de
PastelesController.
<?php
namespace Curso\Http\Requests;
use Curso\Http\Requests\Request;
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'nombre' => 'required|string|size:60',
'sabor' => 'required|in:chocolate,vainilla,cheesecake'
];
}
}
Las reglas de validación ocupadas en el ejemplo anterior las podemos encontrar
explicadas con mayor detalle en la página de Validaciones de Laravel.
use Curso\Http\Requests\CrearPastelesRequest;
use Curso\Http\Requests\EditarPastelesRequest;
En el modelo Pastel agregaremos una propiedad $fillable para indicar que
atributos de la tabla pasteles podrán ser ocupados con el método $request->all().
El modelo pasteles quedaría así:
<?php
namespace Curso;
use Illuminate\Database\Eloquent\Model;
<?php
namespace Curso\Http\Controllers;
use Illuminate\Http\Request;
use Curso\Http\Requests;
use Curso\Http\Controllers\Controller;
use Curso\Pastel;
use Curso\Http\Requests\CrearPastelesRequest;
use Curso\Http\Requests\EditarPastelesRequest;
class PastelesController extends Controller
{
/**
* Display a listing of the resource.
*
* @return Response
*/
public function index()
{
$pasteles = Pastel::get();
return view('pasteles.index')->with('pasteles', $pasteles);
}
/**
* Show the form for creating a new resource.
*
* @return Response
*/
public function create()
{
return view('pasteles.create');
}
/**
* Store a newly created resource in storage.
*
* @return Response
*/
public function store(CrearPastelesRequest $request)
{
$pastel = Pastel::create($request->all());
return redirect()->route('pasteles.index');
}
/**
* Display the specified resource.
*
* @param int $id
* @return Response
*/
public function show($id)
{
//
}
/**
* Show the form for editing the specified resource.
*
* @param int $id
* @return Response
*/
public function edit($id)
{
$pastel = Pastel::find($id);
return view('pasteles.edit')->with('pastel',$pastel);
}
/**
* Update the specified resource in storage.
*
* @param int $id
* @return Response
*/
public function update(EditarPastelesRequest $request, $id)
{
$pastel = Pastel::find($id);
$pastel->fill($request->all());
$pastel->save();
return redirect()->route('pasteles.index');
}
/**
* Remove the specified resource from storage.
*
* @param int $id
* @return Response
*/
public function destroy($id)
{
$pastel = Pastel::find($id);
$pastel->delete();
Pastel::destroy($id);
return redirect()->route('pasteles.index');
}
}
Si te interesa ver el proceso con el cual se completaron los métodos te
recomendamos ir al Anexo C. CRUD con Laravel para mayor información y así
poder probar adecuadamente los Request.
Middlewares
En este punto debemos tener nuestro CRUD para la clase Pasteles, en caso de
no tenerlo recomiendo ver el Anexo C. CRUD con Laravel para poder continuar.
Ahora bien si ya podemos realizar las operaciones básicas no podemos pensar
en llevar a un ambiente real o comercial un proyecto en este nivel. Aun si funciona
correctamente no hemos contemplado todos los posibles casos o amenazas que
se encuentran afuera en la Web, tales como son hackers, estafadores o incluso
las fallas usuales de los usuarios finales.
Para solucionar esto Laravel utiliza los Middleware, que nos permiten proteger las
rutas de accesos no autorizados, como su nombre lo indica (middle) se ubica en
el medio de la peticion (Request), entonces si deseamos agregar un nuevo nivel
de seguridad a nuestro sistema los Middleware son la respuesta.
Primero vamos a analizar un Middleware para la autenticacion o logueo de los
usuarios en nuestras rutas. Por defecto en nuestro proyecto de Laravel debemos
de contar con un middleware llamado auth, este middleware de lo que se encarga
es de ver que el usuario se encuentre con una sesion activa, recuerden que en
Laravel ya tenemos por defecto el manejo de sesiones junto con las tablas de la
base de datos. Para decirle a nuestro proyecto que las rutas de nuestro
controlador de pasteles van a estar protegidas por el middleware auth usamos el
método middleware('name'); dentro del constructor de nuestra clase de la
siguiente forma:
Con este cambio se daran cuenta de que si ingresan a las rutas en las cuales ya
antes podiamos ver nuestro crud los redirige al login, si crean una cuenta de
usuario y lo intentan nuevamente veran que el acceso ya se les va a conceder,
además el nombre y usuario con el que accedan se vera en la barra superior de
navegacion al lado derecho, comprobando las sesiones que Laravel nos da como
un regalo.
Preparativos
<?php
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::drop('users');
}
}
Pero en el modelo de Users que viene por defecto con Laravel 5 se definen los
campos que se pueden llenar y los ocultos, vamos a decirle al modelo que
tambien puede llenar el campo type de esta forma:
@section('content')
<div class="container">
<div class="row">
<div class="col-md-6 col-md-offset-3">
<div class="panel panel-default">
<div class="panel-heading">Sign Up</div>
<div class="panel-body">
{!! Form::open(['route' => 'auth/register', 'class' =>
'form']) !!}
<div class="form-group">
<label>Name</label>
{!! Form::input('text', 'name', '', ['class'=>
'form-control']) !!}
</div>
<div class="form-group">
<label>Email</label>
{!! Form::email('email', '', ['class'=> 'form-
control']) !!}
</div>
<div class="form-group">
<label for="type"> Type</label>
<select name="type" class="form-control">
<option value="" disabled selected>Elige una
opcion...</option>
<option value="admin">Administrador</option>
<option value="user">Usuario normal</option>
</select>
</div>
<div class="form-group">
<label>Password</label>
{!! Form::password('password', ['class'=> 'form-
control']) !!}
</div>
<div class="form-group">
<label>Password confirmation</label>
{!! Form::password('password_confirmation',
['class'=> 'form-control']) !!}
</div>
<div>
{!! Form::submit('send',['class' => 'btn btn-
primary']) !!}
</div>
{!! Form::close() !!}
</div>
</div>
</div>
</div>
</div>
@endsection
namespace Curso\Http\Middleware;
use Illuminate\Contracts\Auth\Guard;
use Closure;
class IsAdmin
{
protected $auth;
return $next($request);
}
}
Para la lógica podemos emular lo que pasa en el Middleware de Authenticate,
vamos a preguntar el tipo de usuario y vamos a preguntar si la peticion es AJAX
para dirigir la ruta de la peticion a donde sea el caso, si el usuario es de tipo admin
entonces vamos a redirigir la peticion al siguiente Middleware, sino entonces
vamos a cerrar la sesion y preguntaremos si la peticion es AJAX, en caso de ser
AJAX vamos a denegarla, si no entonces vamos a mandar al login. Usaremos la
función ->to(); porque si nos quedamos con la función guest() eso guarda la ruta
de destino a la que queremos llegar y nunca vamos a poder iniciar sesion con
usuarios normales.
Ahora vamos a registrar nuestro middleware para poder usarlo ya que por si
mismo no lo vamos a poder integrar al controlador, para esto tenemos que
modificar el Kernel.php, lo unico aqui es agregar en el $routeMiddleware un
nombre para nuestro Middleware y la ubicacion del mismo, asi es como se veria:
protected $routeMiddleware = [
'auth' => \Curso\Http\Middleware\Authenticate::class,
'auth.basic' =>
\Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'guest' => \Curso\Http\Middleware\RedirectIfAuthenticated::class,
'is_admin' => \Curso\Http\Middleware\IsAdmin::class,
];
Entonces con esto ya podemos ligarlo al controlador dentro de su constructor y
para cada función dentro de este se va a mandar a llamar el
Middleware is_admin:
HTML5 nos permite crear documentos HTML de una forma más simplificada y
sencilla que sus versiones anteriores.
<!DOCTYPE html>
La codificación de caracteres se hace de la siguiente manera:
<meta charset="UTF-8">
Nuevas API's
• HTML Geolocation
• HTML Drag and Drop
• HTML Local Storage
• HTML Application Cache
• HTML Web Workers
• HTML SSE
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Título de la página</title>
</head>
<body>
Cuerpo del documento
</body>
</html>
En la sección de la cabecera <head> escribiremos:
• Barrá de navegación
• Encabezados
• Secciones
• Parrafos
• Elementos multimedia : audio, video, img
• Texto en negritas, cursiva y subrayado.
• Tablas
• Listas
• Formularios
• Hipervínculos
• etc.
Encabezados
Los encabezados en html tienen 6 tamaños diferentes y se escriben de la
siguiente forma:
HTML Resultado
Secciones (divisiones)
Podemos dividir nuestro documento en secciones distintas con la
etiqueta <div> para tener un mayor orden sobre nuestro documento y aplicar
diferentes estilos según la sección.
HTML Resultado
Formato de texto
HTML Resultado
<p> Parrafo
<p> Parrafo
Podemos definir diferentes el formato del texto como: negrita, cursiva, subrayado,
tipo de letra, tamaño de fuente, saltos de línea, párrafos, citas, etc.
Formularios
HTML Resultado
<input>
<table>
<thead>
<tr>
<th>cabecera</th>
<th>cabecera</th>
<th>cabecera</th>
</tr>
</thead>
<tfoot>
<tr>
<td>celda</td>
<td>celda</td>
<td>celda</td>
</tr>
</tfoot>
<tbody>
<tr>
<td>celda</td>
<td>celda</td>
<td>celda</td>
</tr>
</tbody>
</table>
Las tablas se escriben con la etiqueta <table>, dentro de la tabla tendremos filas
y columnas, la etiqueta <tr> define las filas y la etiqueta <td> define las columas.
Hipervínculos e imágenes
Las imágenes pueden ser de formato png, jpg o gif y se escriben con la
etiqueta <img> entre sus principales atributos tenemos:
• src : La URI a la imágen.
• alt: Texto que se desplegará en caso de que la imagen no sea desplegada.
• width : Ancho de la imagen, puede ser escrita en pixeles o en porcentaje.
• height: Alto de la imagen, puede ser escrita en pixeles o en porcentaje.
Ejemplo:
Ejemplo de un link:
<a href="https://www.facebook.com/oca159">Facebook</a>
Dentro de las etiquetas <a> puede ir un texto o una imagen.
<a href="default.asp">
<img src="smiley.gif" alt="HTML tutorial">
</a>
Los hipervínculos también pueden redireccionar a un segmento específico de la
página web.
Sintaxis
Una hoja de estilo se compone de una lista de reglas. Cada regla o conjunto de
reglas consiste en uno o más selectores y un bloque de declaración (o «bloque
de estilo») con los estilos a aplicar para los elementos del documento que
cumplan con el selector que les precede. Cada bloque de estilos se define entre
llaves, y está formado por una o varias declaraciones de estilo con el
formato propiedad:valor; .
En el CSS, los selectores marcarán qué elementos se verán afectados por cada
bloque de estilo que les siga, y pueden afectar a uno o varios elementos a la vez,
en función de su tipo, nombre (name), ID, clase (class), posición dentro del
Document Object Model, etcétera.
Abajo puede verse un ejemplo de una parte de una hoja de estilos CSS:
/* comentarios */
Un conjuno de reglas consiste en un selector y un bloque de declaraciones.
Una hoja de estilos interna puede ser usada si una única página tiene un único
estilo.
h1 {
color: maroon;
margin-left: 40px;
}
</style>
</head>
Estilos inline
Un estilo inline puede ser usado para aplicar un úncio estilo para un único
elemento de una página.
Comentarios en CSS
Los comentarios son una forma de explicar y documentar el código, pueden ser
de utilidad cuando queremos editar el código tiempo después. Los comentarios
son ignorados por el navegador.
/* This is
a multi-line
comment */
Selectores
CSS3 puede aplicar diferentes estilos a un grupo de elementos HTML
dependiendo el tipo de selector que ocupemos, veremos cada uno de ellos.
Por ejemplo para seleccionar todos los elementos <p> de una página y aplicarles
el estilo: texto alineado al centro y de color rojo.
p {
text-align: center;
color: red;
}
Selector por id
Cada id es un valor único dentro de una página HTML, por lo cuál la selección
sólo se aplicará sobre un único elemento en particular.
h1 {
text-align: center;
color: red;
}
h2 {
text-align: center;
color: red;
}
p {
text-align: center;
color: red;
}
Podemos reducir el código agrupando los selectores separando cada selector por
una coma.
h1, h2, p {
text-align: center;
color: red;
}
Creacion del CRUD con Laravel desde 0
Este anexo del libro de Laravel 5 esta pensado para resumir el contenido de una forma
aplicada, de modo que se puedan ver en conjunto todos los conocimientos adquiridos durante
el curso.
Nota. Para ver la lista de comandos de escribe en la terminal php artisan y nos da la lista de
comandos
<?php
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::drop('pasteles');
}
}
Ahora crearemos el seeder con el comando:
<?php
use Illuminate\Database\Seeder;
use Faker\Factory as Faker;
Con esto Laravel nos creara el archivo Pastel.php en la carpeta app/, si seguimos las
convenciones de Laravel por defecto esto seria lo unico necesario, pero debido a que nuestro
lenguaje no convierte las palabras a plural de la misma forma que el ingles entonces debemos
definir al modelo con que tabla va a estar trabajando. Agregaremos dentro del modelo el
atributo protected $table = 'pasteles';, y eso seria todo para el modelo, quedando de la
siguiente manera:
<?php
namespace Curso;
use Illuminate\Database\Eloquent\Model;
Ahora vamos a terminar de llenar nuestro controlador, debemos importar la clase Pastel a
nuestro controlador para poder hacer uso del Modelo y asi trabajar con la base de datos, esto
con la ayuda de Eloquent, como vimos durante el curso para crear un nuevo registro con
Eloquent basta con definir una variable de un new Modelo, en este caso Pastel, segun se
describe en el capitulo 11 los metodos responden a una ruta en especifico de la ruta resource
que agregamos en routes.php, para este caso vamos a definir cada uno de ellos en orden:
Este metodo es muy sencillo puesto que solo va a devolver una vista sin ninguna variable ni
uso de Eloquent, por lo cual queda de la siguiente manera:
Este metodo es donde despues de haber entrado a create se reciben los datos y se guardan
en la base de datos, para poder recibir la informacion en este ejemplo vamos a usar la
clase Request que significa peticion y es una clase que Laravel agrega por nosotros cuando
creamos el controlador, vamos a pasar por parametro la peticion en el metodo definiendo
que es una variable de la clase Request y despues de eso podemos recuperar por el nombre
del campo del formulario(atributo name) la informacion enviada, entonces el metodo
quedaria de la siguiente forma:
$pastel->save();
return redirect()->route('pasteles.index');
}
En la funcion estamos creando una instancia de un nuevo Pastel y asignando los atributos
de la clase que se llaman igual que los campos de la BD los valores del formulario con la
variable request y el metodo input('name'); que recibe como parametro el nombre del campo
del formulario, para mas detalle revise la seccion del Anexo A de HTML que habla sobre los
atributos de los formularios.
Despues de asignar los valores de la peticion a la variable $pastel, se usa el
metodo save(); para que el modelo se encargue de guardar los datos en la BD y finalmente
redireccionar al index con los metodos encadenados: redirect()->route('pasteles.index'); .
La funcion de edit es similar a la de create pues solo muestra una vista, con una pequeña
diferencia, la cual es que se va a buscar el pastel que se quiere editar y se va a mandar a la
vista, esto es obio pues debemos poder ver la informacion que vamos a editar. La funcion
quedaria de la siguiente forma:
Bien, despues de entrar en la pagina de edit vamos a poder editar la informacion y regresarla
al controlador para que efectue los cambios, dentro del metodo update vamos a recuperar
nuevamente el Pastel por medio de su id que tambien va en la url y se recibe como parametro
de la funcion, ademas vamos a agregar otro parametro que sera el Request al igual que en
la funcion create para recuperar la informacion del lado del cliente en el controlador, dejando
la funcion de esta forma:
Esta funcion es similar a la de create lo unico que cambia es que en vez de crear un nuevo
pastel vamos a recuperar uno existente y cambiar sus atributos.
Este metodo tiene la funcion de eliminar el registro de la BD, pero para efectuarlo tenemos
dos opciones, la primer forma: crear una variable $pastel y despues usar el
metodo delete() de Eloquent. o bien la segunda: directamente del modelo usar el metodo
de Eloquent destroy($id), que se encarga de directamente buscar y eliminar el registro,
finalmente vamos a redirigir al index, el metodo al final quedara de la siguiente forma:
// Esta es la primer opcion
public function destroy($id)
{
$pastel = Pastel::find($id);
$pastel->delete();
return redirect()->route('pasteles.index');
}
resources/
views/
pasteles/
partials/
fields.blade.php
table.blade.php
create.blade.php
edit.blade.php
index.blade.php
Usaremos el template por defecto de Laravel llamado app.blade.php que fuimos modificando
durante el curso por lo cual solo deberemos crear los archivos restantes.
Ahora en el archivo app.blade.php vamos a modificarlo para que el contenido este mejor
acomodado usando Bootstrap y vamos a agregar los estilos y scripts para quela tabla donde
vamos a mostrar el contenido funcione como un DataTable, dejando el archivo app de la
siguiente forma:
Template App
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Laravel</title>
@section('styles_laravel')
{!! Html::style('assets/css/bootstrap.css') !!}
{!! Html::style('assets/css/datatable-bootstrap.css') !!}
<!-- Fonts -->
<link href='//fonts.googleapis.com/css?family=Roboto:400,300' rel='stylesheet'
type='text/css'>
@show
@yield('my_styles')
</head>
<body>
@include('partials.layout.navbar')
@include('partials.layout.errors')
<div class="container">
<div class="row">
<div class="col-md-10 col-md-offset-1">
@yield('content')
</div>
</div>
</div>
<!-- Scripts -->
{!! Html::script('assets/js/jquery.js') !!}
{!! Html::script('assets/js/jquery.dataTables.js') !!}
{!! Html::script('assets/js/bootstrap.min.js') !!}
{!! Html::script('assets/js/datatable-bootstrap.js') !!}
<script>
$(document).ready(function(){
$('#MyTable').dataTable();
});
</script>
@yield('my_scripts')
</body>
</html>
Los cambios mas notorios que podemos observar es que el @yield('content') se metio
dentro de una columna con un offset, eso dentro de una fila y todo dentro de un contenedor.
Asi nuestro contenido no lo vamos a tener todo pegado a la izquierda de nuestro navegador.
Nota: para poder hacer esto soN necesarios los archivos que se incluyen con blade, si no
los agregan la tabla se vera mas sencilla pero esto no quiere decir que no va a funcionar, ya
solo es cuestion de estilo, si quieren obtener los archivos dejamos los links a continuacion
para que los descarguen y los guarden dentro de la carpeta respectiva, es decir
los CSS en public/assets/css/ y los JS dentro de public/assets/js/:
• Estilos para el DataTable: datatable-bootstrap.css.
Nota: tambien les invito a ver el anexo de DataTable para mayor informacion.
Vista Index
@section('content')
<a class="btn btn-success pull-right" href="{{ url('/pasteles/create') }}"
role="button">Nuevo pastel</a>
@include('pasteles.partials.table')
@endsection
Recuerden que gracias a blade nuestras vistas quedan de tamaños pequeños mas faciles de
entender, aqui solo estamos heredando la plantilla app y definiendo la seccion content con
un link que le daremos estilo de boton con la ruta para mostrar la vista de crear pasteles,
ademas de importar nuestra tabla, el archivo partial lo definiremos ahora.
Table
Estos archivos los trabajaremos en partials por comodidad y porque son componentes de un
sistema Web que suelen repetirse constantemente, empezaremos por el table.
Entonces vamos a usar un foreach con blade, para llenar el contenido de la tabla con los
atributos de los pasteles, dejando el archivo asi:
<td class="text-center">
<button type="submit" class="btn btn-danger btn-xs">
<span class="glyphicon glyphicon-remove" aria-hidden="true"></span>
</button>
<a href="{{ url('/pasteles/'.$pastel->id.'/edit') }}" class="btn btn-info
btn-xs">
<span class="glyphicon glyphicon-edit" aria-hidden="true"></span>
</a>
</td>
</tr>
@endforeach
</tbody>
<tfoot>
<tr>
<th class="text-center">ID</th>
<th class="text-center">Nombre</th>
<th class="text-center">Sabor</th>
<th class="text-center">Fecha</th>
<th class="text-center">Acciones</th>
</tr>
</tfoot>
</table>
La estructura de la tabla la pueden ver en este link, pero lo importante esta dentro del <tbody>,
en donde con BLADE vamos a usar un foreach diciendo que para cada pastel dentro de la
variable $pasteles que llego del controlador se van a vaciar sus datos dentro de la fila de la
tabla, primero vamos a agregar su id, nombre y fecha de creacion, pero se va a agregar una
columna de acciones que contenga dos botones, uno para eliminar ese registro y otro para
editarlo, el boton de eliminar debe ser de tipo submit para enviar la peticion DELETE y para
esto es que se abre un formulario con la clase Form:: de Laravel, para que asi que de sintaxis
mas legible, agregamos los campos necesarios que son la ruta y el metodo del formulario;
para el boton de edit basta con un link <a> que con la funcion url()de Laravel la vamos a
dirigir con el ID de cada pastel.
Nota: Bootstrap nos permite tener a disposicion iconos para que los botones de nuestras
acciones se vean mas profesionales, por lo cual es lo que se agrega el tag <span>, para mas
informacion ir a la pagina oficial de Bootstrap.
Con esto debemos ser capaces de poder ver ahora nuestra tabla como un DataTable(en caso
de haber agregado lo necesario) llena con la informacion de pasteles:
Fields
Ahora vamos a crear un partials con los campos que va a requerir nuestro proyecto, si bien
sabemos es necesario pedir al usuario el nombre y sabor del pastel, pero la fecha de creacion
y ultima actualizacion son campos que Laravel pone automaticamente cuando se ejecuta el
metodo save() en el controlador, por lo cual nuestro partial solo debera tener dos campos de
entrada y un boton para enviar la solicitud.
Entonces para este archivo solo vamos a agregar como su nombre lo indica los campos de
entrada para un paste, dejandolo de la siguiente forma:
<div class="form-group">
{!! Form::label('nombre', 'Nombre', ['for' => 'nombre'] ) !!}
{!! Form::text('nombre', null , ['class' => 'form-control', 'id' => 'nombre',
'placeholder' => 'Escribe el nombre del pastel...' ] ) !!}
</div>
<div class="form-group">
{!! Form::label('sabor', 'Sabor', ['for' => 'sabor'] ) !!}
<select name="sabor" class="form-control">
<option value="" disabled selected>Elige un sabor...</option>
<option value="chocolate">Chocolate</option>
<option value="vainilla">Vainilla</option>
<option value="cheesecake">Cheesecake</option>
</select>
</div>
Si bien la clase Form:: no se ha explicado detalladamente dejo el link de la documentacion
oficial de Laravel, aunque se encuentra en su version 4.2 es debido a que para las versiones
mas actuales no se encuentra explicada, pero sigue siendo completamente compati ble con
Laravel 5 y 5.1.
Con este partial vamos a poder llamar los campos de entrada para crear o editar un pastel.
Vista Create
@extends('app')
@section('content')
{!! Form::open([ 'route' => 'pasteles.store', 'method' => 'POST']) !!}
@include('pasteles.partials.fields')
<button type="submit" class="btn btn-success btn-block">Guardar</button>
{!! Form::close() !!}
@endsection
Extendemos del template app, definimos el contenido abriendo un formulario pero como se
trata de un almacenamiento el metodo se va a trabajar con store y POST, dentro vamos a
incluir el partial de fieldspara tener los campos de texto, el menu de opciones y un boton de
tipo submit para mandar la peticion.
Al tener ya listos nuestros archivos HTML la vista de edit se crea de la misma forma que la
de create con la diferencia de que en vez de abrir un formulario vamos a abrir un modelo, es
deir vamos a abrir el objeto que se envio del controlador a la vista para poder editar los
campos, como observacion podran notar cuando lo ejecuten en el navegador que un s elect
no se asigna automaticamente en valor anterior, por el momento vamos a ver como quedaria
la vista:
@extends('app')
@section('content')
<h4 class="text-center">Editar Pastel: {{ $pastel->nombre }}</h4>
{!! Form::model($pastel, [ 'route' => ['pasteles.update', $pastel], 'method' => 'PUT'])
!!}
@include('pasteles.partials.fields')
<button type="submit" class="btn btn-success btn-block">Guardar cambios</button>
{!! Form::close() !!}
@endsection
Al igual que las demas vistas se esta heredadndo de app y se agrega un titulo para saber
que pastel se esta editando, pero el Form::model() abre nuestra variable $pastel que
enviamos desde el controlador y crea un formulario lleno a partir de los valores del modelo,
claro que esto solo para los campos que coincidan con los nombres de los atributos del
modelo.
El resultado seria algo similar a esto:
Y con esto quedarian nuestras vistas del sistema terminadas y el CRUD basico de
los Pastelesfinalizado tambien, para mas informacion pueden retomar los capitulos de este
libro para analizar las diferentes opciones que tenemos para resolver este ejemplo pues esta
es solo una propuesta, no una solucion definitiva.
nota: La seccion de show no se ha contemplado para este anexo con una vista, disculpen
las molestias.
DataTable
Los DataTables son un plug-in para la librería JQuery de Javascript. Nos permiten
un mayor control sobre un elemento <table> de HTML. Algunas de sus
caracteristicas principales son:
• Paginación automática
• Búsqueda instantánea
• Ordenamiento multicolumna
• Soporta una gran cantidad de datos fuente.
o DOM (Convertir un elemento HTML <table> en un DataTable).
o Javascript (Un arreglo de arreglos en Javascript puede ser el dataset de un DataTable).
o AJAX (Un DataTable puede leer los datos de una tabla de un json obtenido vía AJAX, el
json puede ser servido mediante un Web Service o mediante un archivo.txt que lo
contenga).
o Procesamiento del lado del servidor (Un DataTable puede ser creado mediante la
obtención de datos del procesamiento de un script en el lado del servidor, este script
comúnmente tendrá interacción con la base de datos).
• Habilitar temas CSS para el DataTable fácilmente.
o Crear un tema
o Tema JQuery UI
o Tema Bootstrap
o Tema Foundation
• Amplia variedad de extensiones.
• Altamente internacionalizable.
• Es open source (Cuenta con una licencia MIT).
Antes que nada debemos tener descargado jquery, el cuál podemos descargar
de aquí. Una vez que hemos descargado los archivos css y js de DataTables de
este link debemos extraer el contenido y ubicar los archivos en la carpeta css y js
correspondiente dentro del directorio public de Laravel.
Ejemplo:
public/
assets/
css/
datatable-bootstrap.css
js/
datatable-bootstrap.js
jquery.dataTables.js
jquery.js
Lo siguiente será hacer una referencia de los script y archivos css dentro de
nuestro documento HTML.
Los script los ubicaremos dentro de la etiqueta <body> pero hasta el final de la
misma.
<body>
<!-- Contenido -->
Crear un DataTable
Existen diversas formas de llenar un DataTable con datos, veremos algunas de
las más usadas.
• HTML de la tabla
$(document).ready(function() {
$('#example').dataTable();
} );
Una vez definido el dataset bastará con ejecutar la siguiente función para crear
una table en un div con id="demo" en nuestro HTML.
$(document).ready(function() {
$('#demo').html( '<table cellpadding="0" cellspacing="0" border="0"
class="display" id="example"></table>' );
$('#example').dataTable( {
"data": dataSet,
"columns": [
{ "title": "Engine" },
{ "title": "Browser" },
{ "title": "Platform" },
{ "title": "Version", "class": "center" },
{ "title": "Grade", "class": "center" }
]
} );
} );
El código HTML es el siguiente:
<html>
<head>
</head>
<body>
<div id="demo">
</div>
</body>
</html>
Ocupando AJAX
Un DataTable puede leer los datos de una tabla de un json obtenido vía AJAX, el
json puede ser servido mediante un Web Service o mediante un json.txt que lo
contenga.
• El archivo JSON
$(document).ready(function() {
$('#example').dataTable( {
"ajax": 'json.txt'
} );
} );
El archivo HTML contiene una tabla con un id="example".
<tfoot>
<tr>
<th>Name</th>
<th>Position</th>
<th>Office</th>
<th>Extn.</th>
<th>Start date</th>
<th>Salary</th>
</tr>
</tfoot>
</table>
Internacionalizar un dataTable
Es posible cambiar el idioma de las etiquetas de un datatable si bajamos el archivo
de la traducción en el siguiente link.
Ejemplo:
• Para buscar un administrador cuyo nombre empiece con la letra O y su teléfono sea
extensión 228, podemos poner administrador O 228
Notas
href="{{asset(“assets/$theme/bower_components/font-awesome/css/font-
awesome.min.css")}}”>
//
}
Notas Finales