
TAW-ES 8A
El alumnos será capaz de integrar los sistemas y tecnologías Web adecuadas, considerando bases de datos, seguridad, interacción humano computadora, y el uso de metodologías de ingeniería de software para satisfacer las necesidades de información de la organización.
La tendencia actual en cuanto al tipo de tecnologías que darán solución a los problemas de administración de la información en las organizaciones es lo que se conoce como la nube. Esta idea se basa en el concepto de centralizar la información y tenerla al alcance en cualquier momento. La solución es desarrollar toda una infraestructura que permita a los usuarios tener su información en algún servidor especializado y remoto, e inclusive se habla de que los sistemas de información no serán cargados en las PC si no que ahora correrán sobre los servidores. La tecnología sobre la cual se soporta la nube es precisamente la tecnología web.
El incremento exponencial de información esparcida y almacenada en una infinidad de sitios Web, ha venido a impulsar una gran cantidad de aplicaciones específicas, encargadas de gestionar dicha información. En la asignatura de “Tecnología y Aplicaciones Web”, se abordan temas especializados como el uso de nuevas metodologías de Ingeniería de Software, para el desarrollo de aplicaciones Web, considerando aspectos esenciales como la seguridad, interacción humano computadora y el manejo de bases de datos; todo ello con el objetivo de satisfacer necesidades específicas de una organización, cuya plataforma de información se encuentra en la Web.
Building PHP Applications with Symfony, CakePHP, and Zend Framework Bartosz Porebski, Karol Przystalski, Leszek Nowak 2011 Wrox Estados Unidos de America,1ra edición 2011 978-0470887349
El gran libro de HTML 5, CSS3 y Javascript Juan Diego Gauchat 2012 Marcombo España, 2012 978-84-267-1770-2
HTML Goodies Joe Bruns 2011 Mc Millian Estados Unidos de America, 2a edición 2011 978-0789726117
Complementaria Murach's PHP and MySQL Joel Murach, Ray Harris. 2010 Mike Murach & Associates Estados Unidos de America,1ra edición 2011 978-1890774561
ADO.NET Entity Framework 4.1 - Aplicaciones y servicios centrados en datos Unai Zorrilla Castro 2011 Krasis Press España, 1ra edición 2011 978-8493903633
Windows Communication Foundation 4 Step by Step John Sharp 2010 Microsoft Press Estados Unidos de America, 1ra edición 2010 978-0735645561
Todas las rutas de Laravel se definen en sus archivos de ruta, que se encuentran en el directorio routes. Estos archivos se cargan automáticamente por el marco. El archivo define rutas que son para su interfaz web. A estas rutas se les asigna el grupo de middleware, que proporciona funciones como el estado de la sesión y la protección CSRF. Las rutas son sin estado y están asignadas al grupo de middleware.
CONFIGURACIÓN DE RUTASVamos a simular que queremos crear un sitio web con sus respectivas vistas, pero en lugar de mandar a las vistas utilizaremos las rutas.
1. Abre el directorio routes y ahí abre el archivo web.php, después en el archivo web.php declara las siguientes lineas de código:
Route::get('inicio', function () { return 'este es el inicio'; });
Ahora ejecuta laravel con el comando php artisan serve y en el navegador escribe la dirección 127.0.0.1/inicio para que te mande a la ruta de inicio declarada anteriormente.
2. Ahora vamos a definir las siguientes rutas con sus respectivas vistas:
Con el primer caso quedaría:
Route::get('electrodomesticos', function () { return 'este es la vista de los electrodomésticos'; });
Ahora tu crea las otras rutas.
3. Para redirigir a otra ruta, ósea cuando escriba en el navegador 127.0.0.1/pag1, me va a mandar a 127.0.0.1/pag2:
Route::redirect('/pag1', '/pag2');
Ahora crea las siguientes rutas paara redirigir:
4. Ahora dentro de la carpeta resources en la carpeta views creamos las siguientes vistas:
Después, agrega un breve diseño a cada vista, luego crea una ruta para cada vista y en return retorna el nombre de la vista como en el siguiente ejemplo:
Route::get('electronica', function () { return view('electronica'); });
5. Ahora otro ejemplo de ruta a la vista videojuegos.php:
Route::get('videojuegos', function () { return view('videojuegos'); });
6. Ahora para pasar parametros en las rutas se hace de la siguiente manera:
Route::get('/ven/{numero}', function ($numero) { return 'el número es:'.$numero; });
Entonces en el navegador tendríamos que especificar un número:
127.0.0.1/ven/23 ------------------------ el número es: 23
7. Para agregar múltiples parámetros en una ruta:
Route::get('/ven/{numero}/{nombre}', function ($numero,$nombre) { return 'el número es:'.$numero.' y el nombre es: '.$nombre; });
Ahora en el navegador:
------------------------ 127.0.0.1/ven/23/aaron ------------------------ el número es: 23 y el nombre es: aaron
Se tiene que configurar el archivo .env ubicado en la raíz del proyecto. IMPORTANTE: Si se trabaja con MySQL se debe encender el servicio de MySQL de XAMPP.
DB_HOST=localhost DB_DATABASE=pruebabd DB_USERNAME=root DB_PASSWORD=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.
Las migraciones son archivos que se encuentran el la ruta database/migrations/ de nuestro proyecto Laravel, por defecto en la instalación de Laravel 5 se encuentran dos migraciones ya creadas, create_users_table y create_password_resets_table.
Para crear nuestras migraciones en Laravel se usa el siguiente comando:
php artisan make:migration nombre_migracion
que nos crea el archivo limpio para escribir nuestra migración, o bien el comando:
php artisan make:migration nombre_migracion --create=nombre_tabla
que nos agrega una plantilla de trabajo básica para empezar a trabajar.
Como ejemplo se tomará este comando:
php artisan make:migration crear_tabla_pasteles --create=pasteles
el cual nos dará este resultado:
Created Migration: 2015_06_23_054801_crear_tabla_pasteles
Y nos creará además el siguiente archivo:
Para correr o iniciar nuestras migraciones usamos el comando:
php artisan migrate
Con esto si es la primera vez que se ejecuta este comando se creará en nuestra base de datos la tabla migrations que es la encargada de llevar el control de que migraciones que ya han sido ejecutadas, con el fin de no correr el mismo archivo más de una vez si el comando se usa nuevamente.
Entonces si creamos nuestra migración crear_tabla_pasteles y usamos el comando php artisan migrate como resultado en nuestra base de datos se agregará la tabla pasteles y en la tabla migrations se añadirá el registro de la migración recien ejecutada.
Pero, ¿si quisiera eliminar la tabla con la función down de la migración crear_tabla_pasteles?
Esto se puede resolver de dos formas básicamente:
Nota: Un comando extra que nos permite actualizar las migraciones es el comando php artisan migrate:refresh , el cual es equivalente a usar php artisan migrate:reset y después php artisan migrate .
En el dado caso que necesitaramos agregar más campos a la tabla pasteles, podríamos simplemente ir a la migración crear_tabla_pasteles y en la función up poner la nueva columna, pero con esto perderiamos la primer versión de la tabla, entonces para poder ejeplificar como se agregan columnas con las migraciones crearemos una nueva que se llame agregar_campos_tabla_pasteles con los comandos que ya hemos visto:
Ahora el archivo resultante quedaría así:
Para poder agregar más columnas a las tablas desde Laravel en vez de llamar al método create llamamos al método table de la clase Schema pasandole como primer parámetro a que tabla se va a agregar los campos y como segundo parámetro la función anónima donde definimos que columnas se agregaran.
Y en la función down para eliminar columnas que vendría siendo lo opuesto de agregarlas, se llama al método table y dentro de la función anónima del objeto $table se usa el método dropColumn() que recibe como parámetro ya sea el nombre de una sola columna o un arreglo con todas las columnas que se desean eliminar.
Y ¡listo!, con esto podemos tener una idea inicial de como usar las migraciones, lo que para este ejemplo podría continuar sería agregar más columnas a la tabla pasteles y probar los comandos necesarios para poder deshacer los cambios de la primera vez que se corrio la migración con una nueva versión, ya sea sobre el mismo archivo o sobre otro nuevo.
BENEFICIOSElabora las siguientes migraciones (una por cada tabla que aparece en la siguiente ilustración) definiendo sus campos y utilizando los comandos php artisan migrate y verifica en la base de datos que se hayan creado. Elabora un reporte con capturas de pantalla donde describas cada una de ellas.
Podemos añadir una restricción de clave foranea a nuestro campo utilizando el método foreign():
Schema::create('users', function (Blueprint $table) { // ... $table->unsignedInteger('profession_id'); $table->foreign('profession_id')->references('id')->on('professions'); // ... });
En este caso indicamos que el campo profession_id va a hacer referencia al campo id en la tabla professions.
Aquí es importante que el tipo del campo profession_id coincida con el campo id en la tabla professions. Es decir el campo profession_id debe ser definido como un entero positivo, para ello usamos el método:
$table->unsignedInteger('nombre_del_campo_aqui'); o $table->integer('nombre_del_campo')->unsigned();Claves primarias
Cuando diseñamos una base de datos, suele ser importante tener un campo (o combinación de campos) que pueda identificar de manera única a cada fila. Así como tienes un número de pasaporte que es único, cada usuario o profesión va a tener un identificador (id) único. En esta base de datos usaremos identificadores de tipo auto-incremento, es decir la primera fila obtendrá el identificador 1, la segunda 2, y así sucesivamente. Estos identificadores serán generados por el motor de la base de datos.
clave foráneasPara asociar una tabla con otra, vamos a utilizar una clave foránea. Por ejemplo en la tabla de usuarios, utilizaremos el campo profession_id, cuyo valor va a ser un identificador (id) válido de uno de los registros de la tabla de profesiones. De esta manera asociaremos un registro (fila) la tabla usuarios con un registro (fila) de la tabla de profesiones. En este tipo de relaciones solemos decir que un Usuario pertenece a una Profesión. También podemos decir que una Profesión tiene muchos Usuarios. Puesto que pueden existir 100 usuarios que sean desarrolladores back-end o 50 usuarios que sean desarrolladores front-end, cada profesión va a tener asignada muchos usuarios. Por otro lado cada usuario solo puede tener asignada una profesión (aunque en la vida real hay personas que tienen más de una profesión, en nuestro sistema esto no es relevante).
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 que se relacionan entre sí, eso suena de verdad horrible y tedioso, por lo cual laravel nos salva con estos archivos Seeders. Un Seeder se ubica en la carpeta database/seeds/ de nuestro proyecto de Laravel y para poder crear un nuevo Seeder se usa el comando:
php artisan make:seeder nombre_seeder
Esto nos creará un archivo en la carpeta database/seeds/ que tendrá el nombre que le demos en el comando, por ejemplo crearemos uno retomando el ejemplo anterior de las migraciones, se llamará PastelesSeeder, por lo cual el comando quedaria de la siguiente forma:
php artisan make:seeder PastelesSeeder
Con esto ya tenemos el archivo pero no es todo lo que necesitamos para poder trabajar con datos autogenerados, para ello usaremos un componente llamado Faker el cual se encargará de generar estos datos, por defecto el boilerplate del proyecto de Laravel 5.1 en adelante viene ya con Faker dentro del composer.json por lo cual ya debe estar instalado dentro de nuestro proyecto, ahora bien si estamos trabajando con una instalación Laravel 5.0 sin el componente Faker basta con ir al archivo composer.json y agregar en el "require-dev" las dependencias y para tener una idea más clara podemos ir a la página de Packagist donde se encuetra Faker o a su Repositorio en Github y ahí nos muestra que es lo que se debe agregar. Al final solo se ocupa el comando composer update para actualizar las dependencias y descargar Faker al proyecto.
Una vez ya teniendo Faker iremos a nuestro archivo PastelesSeeder y dentro podremos observar que se encuentra una función llamada run() que es donde nosotros vamos a usar Faker para poblar, ahora bien antes de todo debemos agregar la clase de Faker a nuestro Seeder, para esto agregamos al inicio del archivo la linea:
use Faker\Factory as Faker;
Quedando el archivo de la siguiente forma:
Archivo PastelesSeeder.php ----------------------------------- < ? php use Illuminate\Database\Seeder; use Faker\Factory as Faker; class PastelesSeeder extends Seeder { /** * Run the database seeds. * * @return void */ public function run() { // } }
Después crearemos una variable llamada $faker que nos servira para poblar la base de datos, ahora bien usando la clase DB, si bien dentro del ejemplo queremos crear 50 pasteles vamos a crear un for para que ejecute nuestro código de inserción 50 veces y el componente de Faker en cada pasada cambiará los valores del registro que se va a agregar, quedando de esta forma:
$faker = Faker::create(); for ($i=0; $i < 50; $i++) { \DB::table('pasteles')->insert(array( 'nombre' => $faker->firstNameFemale, 'sabor' => $faker->randomElement(['chocolate','vainilla','cheesecake']), 'created_at' => date('Y-m-d H:m:s'), 'updated_at' => date('Y-m-d H:m:s') )); }
Creamos nuestro objeto Faker, el cual puede generar información falsa para nuestra base de datos y ahora usamos la clase DB el método table para llamar la tabla donde se va a insertar la información y se le concatena el método insert() el cual recibe por parametro un arreglo clave => valor con los campos de la tabla.
Faker tiene muchas variedades de datos, los cuales podemos consultar en su Repositorio de Github así como su uso básico.
En este ejemplo usamos una propiedad que se llama firstNameFemale para darle nombre al pastel y la propiedad randomElement que de un arreglo que se le da asigna un elemento de ese arreglo aleatoriamente.
$this->call('PastelesSeeder');
Que en si mandará a llamar nuestro seeder recien creado y para ejecutar este archivo se usa el comando:
php artisan db:seed
Y con esto queda poblada la tabla pasteles y lo puedes verificar en tu gestor de base de datos.
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. Unos comandos extras que nos pueden ser utiles son:
php artisan migrate --seed
El comando anterior lo que hace es realizar una combinacón entre los comandos php artisan migrate y php artisan db:seed:
php artisan migrate:refresh --seed
El comando anterior lo que hace es realizar una combinación entre los comandos php artisan migrate:refresh y php artisan db:seed.
En Laravel podemos hacer uso de un ORM llamado Eloquent, un ORM es un Mapeo Objeto-Relacional por sus siglas en ingles (Object-Relational mapping), que es una forma de mapear los datos que se encuentran en la base de datos almacenados en un lenguaje de script SQL a objetos de PHP y viceversa, esto surge con la idea de tener un codigo portable con el que no tengamos la necesidad de usar lenguaje SQL dentro de nuetras clases de PHP.
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:
Estas convenciones nos ayudan a detectar automaticamente las tablas, por ejemplo: el modelo User se encuentra en singular y con notacion UpperCamelCase y para Laravel poder definir que tabla es la que esta ligada a este modelo le es suficiente con realizar la conversion a notacion underscore y plural, dando como resultado la tabla: users.
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 tema 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:
php artisan make:model Pastel
Con esto se generara el archivo en donde ya se encuentra el modelo User en la carpeta app/ y dentro de el vamos a definir la tabla que se va a usar con esta linea:
protected $table = 'pasteles';¿Pero no se suponia que Laravel identificaba automáticamente que tabla usar?
Si lo hace pero si cambiamos las convenciones del modelo Pastel el resultado seria pastels y nuestra tabla se llama pasteles, esto es un problema para nosotros por el hecho del uso del lenguaje español porque la conversion de singular a plural no es la misma que la forma en que se hace en ingles, debido a esto nos vemos forzados a definir el nombre de la tabla.
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 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); });
Observemos los resultados en el navegador, una Collection de pasteles.
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 pruebaPastel para el sabor vainilla:
public function scopeVainilla($query){ return $query->where('sabor','vainilla'); }
Los scopes en la función se debe iniciar el nombre de la función con la palabra scope y seguido en notacion camelCase el nombre con el cual se va a llamar el scope. Y su equivalente dentro de la ruta seria la siguiente:
Route::get('pruebasPastel', function(){ $pasteles = Pastel::vainilla()->get(); dd($pasteles); });
También podemos crear scopes dinámicos de la siguiente forma:
public function scopeSabor($query, $sabor){ return $query->where('sabor',$sabor); }
Esto nos daria una función genérica para obtener los pasteles de cierto sabor y su implementación sería asi:
Route::get('pruebasPastel', function(){ $pasteles = Pastel::sabor('vainilla')->get(); dd($pasteles); });
Además con Eloquent tambien podemos insertar, actualizar o eliminar registros, por ejemplo:
Para insertar la sintaxis seria la siguiente:
$pastel = new Pastel; $pastel->nombre = 'Pastel Richos Style'; $pastel->sabor = 'chessecake'; $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);
Terminal ------------------- C:\Users\Your Name > composer create-project --prefer-dist laravel/laravel movie_projectPaso2. Configuración de la base de datos
Inicia el servicio de MySQL en XAMPP y después en Workbench, crea una base de datos llamada moviesbd. Después localiza el archivo .env y configura el host, password y database según tu configuración:
DB_HOST=localhost DB_DATABASE=moviesbd DB_USERNAME=root DB_PASSWORD=Paso3. Crea la tabla Movie y su modelo
Crea una migración y un modelo para Movie con el siguiente comando:
Terminal ----------------- C:\Users\Your Name\blog > php artisan make:migration crear_tabla_movies --create=movies C:\Users\Your Name\blog > php artisan make:model Movie -m
En la ruta /database/migrations/2020_07_07_100722_create_movies_table.php declara los siguientes campos:
< ? php use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; class CreateMoviesTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('movies', function (Blueprint $table) { $table->increments('id'); $table->string('name'); $table->text('description'); $table->timestamps(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists('movies'); } }
Después ejecuta los campos en el modelo Movie localizado en la carpeta app:
< ? php namespace App; use Illuminate\Database\Eloquent\Model; class Movie extends Model { protected $fillable = [ 'name','description' ]; }
Ejecuta las migraciones y verifica en la base de datos si se han creado:
Terminal ----------------- C:\Users\Your Name\blog > php artisan migratePaso4. Crea la ruta
En el archivo routes/web.php define una ruta para poder controlar movies y gestionar la tabla movies:
Route::resource('movies','MovieController');Paso5. Crea un controlador
Con el siguiente comando crea un controlador Movie para poder realizar acciones con la tabla de movies:
Terminal ----------------- C:\Users\Your Name\blog > php artisan make:controller MovieController
En el siguiente controlador se encontrarán los siguientes métodos necesarios para controlar la tabla. La ruta del controlador es /app/Http/Controllers/MovieController.php:
< ? php namespace App\Http\Controllers; use Illuminate\Http\Request; use Yajra\Datatables\Datatables; use App\Movie; class MovieController extends Controller { /** * Display a listing of the resource. * * @return \Illuminate\Http\Response */ public function index() { $movies = Movie::latest()->paginate(5); return view('index',compact('movies')) ->with('i', (request()->input('page', 1) - 1) * 5); } /** * Show the form for creating a new resource. * * @return \Illuminate\Http\Response */ public function create() { return view('create'); } /** * Store a newly created resource in storage. * * @param \Illuminate\Http\Request $request * @return \Illuminate\Http\Response */ public function store(Request $request) { $request->validate([ 'name' => 'required', 'description' => 'required', ]); Movie::create($request->all()); return redirect()->route('movies.index') ->with('success','Movie created successfully.'); } /** * Display the specified resource. * * @param \App\Movie $Movie * @return \Illuminate\Http\Response */ public function show(Movie $Movie) { return view('show',compact('Movie')); } /** * Show the form for editing the specified resource. * * @param \App\Movie $Movie * @return \Illuminate\Http\Response */ public function edit(Movie $Movie) { return view('edit',compact('Movie')); } /** * Update the specified resource in storage. * * @param \Illuminate\Http\Request $request * @param \App\Movie $Movie * @return \Illuminate\Http\Response */ public function update(Request $request, Movie $Movie) { $request->validate([ 'name' => 'required', 'description' => 'required', ]); $Movie->update($request->all()); return redirect()->route('movies.index') ->with('success','Movie updated successfully'); } /** * Remove the specified resource from storage. * * @param \App\Movie $Movie * @return \Illuminate\Http\Response */ public function destroy(Movie $Movie) { $Movie->delete(); return redirect()->route('movies.index') ->with('success','Movie deleted successfully'); } }Paso6. Crear las vistas
En este paso se debe crear cinco vistas dentro de la carpeta resources/views/, cada una de ellas corresponde a un método del controlador que nos ayudará a gestionar la base de datos. Las vistas de deberán llamar así:
En la vista /resources/views/layout.blade.php declaramos lo siguiente:
< !DOCTYPE html > < html > < head > < title >CRUD con Laravel 7 title > < link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.1.3/css/bootstrap.min.css" / > < /head > < body class="bg-dark" > < div class="container" > < div class="row" > < div class="col-md-12" > @yield('content') < /div > < /div > < /div > < /body> < /html>
/resources/views/index.blade.php:
@extends('layout') @section('content') < div class="card mt-5"> < div class="card-header"> < div class="col-md-12"> < h4 class="card-title"> CRUD con Laravel 7 < a class="btn btn-success ml-5" href="{{ route('movies.create') }}" id="createNewMovie"> Create New Movie< /a> < /h4> < /div> < /div> < div class="card-body"> @if ($message = Session::get('success')) < div class="alert alert-success"> < p>{{ $message }}< /p> < /div> @endif < table class="table table-bordered"> < tr> < th width="5%">No< /th> < th>Name< /th> < th>Description< /th> < th width="20%">Action< /th> < /tr> @foreach ($movies as $Movie) < tr> < td>{{ ++$i }}< /td> < td>{{ $Movie->name }}< /td> < td>{{ $Movie->description }}< /td> < td> < form action="{{ route('movies.destroy',$Movie->id) }}" method="POST"> < a class="btn btn-info btn-sm" href="{{ route('movies.show',$Movie->id) }}">Show< /a> < a class="btn btn-primary btn-sm" href="{{ route('movies.edit',$Movie->id) }}">Edit< /a> @csrf @method('DELETE') < button type="submit" class="btn btn-danger btn-sm">Delete< /button> < /form> < /td> < /tr> @endforeach < /table> < /div> @endsection
/resources/views/create.blade.php:
@extends('layout') @section('content') < div class="card mt-5"> < div class="card-header"> < div class="col-md-12"> < h4 class="card-title">< strong>Create Page< /strong> CRUD con Laravel 7 < a class="btn btn-success ml-5" href="{{ route('movies.index') }}">Back< /a> < /h4> < /div> < /div> < div class="card-body"> @if ($errors->any()) < div class="alert alert-danger"> < strong>Whoops!< /strong> There were some problems with your input.< br>< br> < ul> @foreach ($errors->all() as $error) < li>{{ $error }}< /li> @endforeach < /ul> < /div> @endif < form action="{{ route('movies.store') }}" method="POST"> @csrf < div class="row"> < div class="col-xs-12 col-sm-12 col-md-12"> < div class="form-group"> < strong>Name:< / strong> < input type="text" name="name" class="form-control" placeholder="Name"> < / div> < / div> < div class="col-xs-12 col-sm-12 col-md-12"> < div class="form-group"> < strong>Description:< / strong> < textarea class="form-control" style="height:150px" name="description" placeholder="Description">< / textarea> < / div> < / div> < div class="col-xs-12 col-sm-12 col-md-12 text-center"> < button type="submit" class="btn btn-primary">Submit< /button> < / div> < / div> < / form> < / div> @endsection
/resources/views/edit.blade.php:
@extends('layout') @section('content') < div class="card mt-5"> < div class="card-header"> < div class="col-md-12"> < h4 class="card-title">< strong>Edit Page< / strong> CRUD con Laravel 7 < a class="btn btn-success ml-5" href="{{ route('movies.index') }}">Back< / a> < / h4> < / div> < / div> < div class="card-body"> @if ($errors->any()) < div class="alert alert-danger"> < strong>Whoops!< / strong> There were some problems with your input.< br>< br> < ul> @foreach ($errors->all() as $error) < li>{{ $error }}< / li> @endforeach < / ul> < / div> @endif < form action="{{ route('movies.update',$Movie->id) }}" method="POST"> @csrf @method('PUT') < div class="row"> < div class="col-xs-12 col-sm-12 col-md-12"> < div class="form-group"> < strong>Name:< / strong> < input type="text" name="name" value="{{ $Movie->name }}" class="form-control" placeholder="Name"> < / div> < / div> < div class="col-xs-12 col-sm-12 col-md-12"> < div class="form-group"> < strong>Description:< / strong> < textarea class="form-control" style="height:150px" name="description" placeholder="Description">{{ $Movie->description }}< / textarea> < / div> < / div> < div class="col-xs-12 col-sm-12 col-md-12 text-center"> < button type="submit" class="btn btn-primary">Submit< / button> < / div> < / div> < / form> < / div> @endsection
/resources/views/show.blade.php:
@extends('layout') @section('content') < div class="card mt-5"> < div class="card-header"> < div class="col-md-12"> < h4 class="card-title">< strong>Show Page< / strong> CRUD con Laravel 7 < a class="btn btn-success ml-5" href="{{ route('movies.index') }}">Back< / a> < / h4> < / div> < / div> < div class="card-body"> < div class="row"> < div class="col-xs-12 col-sm-12 col-md-12"> < div class="form-group"> < strong>Name:< / strong> {{ $Movie->name }} < / div> < / div> < div class="col-xs-12 col-sm-12 col-md-12"> < div class="form-group"> < strong>Description:< / strong> {{ $Movie->description }} < / div> < / div> < / div> < / div> @endsectionPaso7. Inicia laravel
Inicia tu aplicación con el comando:
Terminal ----------------- C:\Users\Your Name\blog > php artisan servePaso8. Ver en el navegador
Abre el navegador e ingresa la siguiente url:
Navegador: x|-|D --------------------------------------------------- http://localhost:8000/movies ---------------------------------------------------Resultado final
Lo primero que necesitamos hacer es instalar nuestro proyecto de laravel con el comando de instalación:
Terminal -------------------- C:\Users\Your Name > composer create-project --prefer-dist laravel/laravel crud_vue_project