Ir al curso vía Edutin
Ir al curso vía Youtube
Crear un proyecto laravel desde composer:
$ composer create-project laravel/laravel nombre_del_proyecto --prefer-dist
NOTA: --prefer-dist instala la ultima versión de laravel.
Crear un proyecto laravel desde composer con una versión específica:
$ composer create-project laravel/laravel miproyecto "5.1.*"
Crear un proyecto laravel desde el instalador de proyectos laravel:
- Instalación del instalador:
$ composer global require "laravel/installer"
NOTA: Este proceso se ejecuta solo una vez.
- Luego ya se puede crear proyectos con:
$ laravel new nombre_del_proyecto
NOTA: con este segundo método es un poco más rapido.
Crear un host virtual:
- Ejecutar Bloc de notas en modo administrador.
- Abrir archivo: C:\Windows\System32\drivers\etc\hosts.
- Agregar al final del archivo:
127.0.0.1 mihostvirtual.com www.mihostvirtual.com
- Abrir archivo: C:\xampp\apache\conf\extra\httpd-vhosts.conf
- Agregar al final del archivo:
<VirtualHost *:80>
DocumentRoot "C:/xampp/htdocs/cursos/01laravel/laravel-curso/public"
ServerName mihostvirtual.com
ServerAlias www.mihostvirtual.com
</VirtualHost>
- Abrir archivo: C:\xampp\apache\conf\httpd.conf
- Verificar las líneas:
# Virtual hosts
Include conf/extra/httpd-vhosts.conf
NOTA: la línea Include conf/extra/httpd-vhosts.conf no debe estar comentada con #.
- Verifacar la línea:
LoadModule rewrite_module modules/mod_rewrite.so
NOTA: no debe estar comentada con #.
- Reiniciar el servidor Apache.
Renombrar aplicación:
$ php artisan app:name Cine
Para purgar la cache de config:
$ php artisan config:clear
Colocar la aplicación en modo de mantenimiento:
php artisan down
Colocar la aplicación en modo de producción:
php artisan up
Generar controlador:
$ php artisan make:controller NameController
Generar controlador con métodos preestablecidos:
$ php artisan make:controller NameController --resource
Mostrar todas las rutas que se encuentran en la aplicación:
$ php artisan route:list
Para migrar bd:
$ php artisan migrate
Para crear una migración:
$ php artisan make:migration create_migration_name_table --create=name
NOTA: el name debe ser en plural
Ejm: $ php artisan make:migration create_books_table --create=books
Comandos para restablecer migraciones:
$ php artisan migrate:rollback --step=n
NOTA: retrocede n número de versiones.
$ php artisan migrate:reset
NOTA: elimina todas las tablas menos migration, pero le elimina todos sus registros.
$ php artisan migrate:refresh
NOTA: ejecuta un reset y luego un migrate.
Añadir columnas a tablas:
$ php artisan make:migration add_fields_to_migration_name_table --table=name
Ejm: $ php artisan make:migration add_pag_to_books_table --table=books
Para crear modelo:
$ php artisan make:model NombreDelModelo
NOTA: se recomienda nombrarlos en inglés y en singular.
Para crear modelo, migración y controlador:
$ php artisan make:model NombreDelModelo -m -c -r
NOTA: -m para la migración, -c para el controlador, -r para que el controlador se cree con métodos preestablecidos (--resource).
Para crear sistmea de autenticación:
$ php artisan make:auth
Proyecto introductorio:$ composer create-project laravel/laravel pruebas "5.4.*"
routes/web.php
<?php
/*
*** BLA BLA BLA ***
*/
Route::get('/', function () {
return view('welcome');
});
Route::get('/test', 'TestController@index');
Route::get('/user/{name}', 'TestController@user');
Route::get('edad/{name}/{age}', 'TestController@age');
Route::resource('task', 'TaskController');
Route::get('demo', function () {
return view('demo');
});
Route::get('usuario/{user}', 'UserController@show');
.env
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=cursos
DB_USERNAME=root
DB_PASSWORD=
config/database.php
*** BLA BLA BLA ***
'mysql' => [
'driver' => 'mysql',
'url' => env('DATABASE_URL'),
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'unix_socket' => env('DB_SOCKET', ''),
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
'prefix_indexes' => true,
'strict' => true,
'engine' => null,
'options' => extension_loaded('pdo_mysql') ? array_filter([
PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
]) : [],
],
*** BLA BLA BLA ***
resources/views/layouts/master.blade.php
<!DOCTYPE html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>@yield('title')</title>
*** BLA BLA BLA ***
<style>
*** BLA BLA BLA ***
</style>
</head>
<body>
<div class="flex-center position-ref full-height">
*** BLA BLA BLA ***
<div class="content">
<p>Soluciones++</p>
@yield('content')
</div>
</div>
@yield('footer-script')
</body>
</html>
resources/views/demo.blade.php
@extends('layouts.master')
@section('title', 'Título de la plantilla demo')
@section('content')
*** BLA BLA BLA ***
@endsection
@section('footer-script')
@endsection
resources/views/user.blade.php
@extends('layouts.master')
@section('title')
Perfil de {{$usuario->name}}
@endsection
@section('content')
<p><strong>Correo: </strong>{{$usuario->email}}</p>
<p><strong>Password: </strong>{{$usuario->password}}</p>
@endsection
$ php artisan make:migration create_books_table --create=books
database/migration/2021_01_08_133008_create_books_table.php
*** BLA BLA BLA ***
public function up()
{
Schema::create('books', function (Blueprint $table) {
$table->bigIncrements('id');
$table->string('name');
$table->timestamps();
});
}
*** BLA BLA BLA ***
$ php artisan make:migration create_authors_table --create=authors
$ php artisan make:migration add_pag_to_books_table --table=books
database/migration/2021_01_08_141052_add_pag_to_books_table.php
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class AddPagToBooksTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('books', function (Blueprint $table) {
$table->integer('pags')->unsigned()->after('name');
$table->string('isbn')->after('pags');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('books', function (Blueprint $table) {
$table->dropColum(['pags','isbn']);
});
}
}
$ php artisan make:model Task -m -c -r
app\Http\Controllers\TestController.php
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class TestController extends Controller
{
public function index(){
return 'Hola++';
}
public function user($name){
return 'Hola++ ' . ucfirst($name);
}
public function age($name, $age){
if($age < 18){
return 'Hola-- ' . ucfirst($name) . ' eres menor a 18.';
}else{
return 'Hola++ ' . ucfirst($name) . ' eres mayor a 18.';
}
}
}
app\Http\Controllers\UserController.php
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\User;
class UserController extends Controller
{
public function show($user){
$usuario = User::find($user);
//dd($usuario);
//dd($usuario->name);
return view('user', compact('usuario'));
}
}
Proyecto CRUD básico:
CREACIÓN DE UN NUEVO PROYECTO:
01. $ composer create-project laravel/laravel crud_laravel "5.4.*"
BASE DE DATOS
02. Crear BD en MySQL de nombre: cursos.
03. Configurar BD en archivo .env:
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=cursos
DB_USERNAME=root
DB_PASSWORD=
04. Establecer juego de caracteres en config\database.php:
***
'mysql' => [
'driver' => 'mysql',
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'unix_socket' => env('DB_SOCKET', ''),
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
'strict' => true,
'engine' => null,
],
***
05. Ejecutar migración:
$ php artisan migrate
AUTENTIFICACIÓN
06. Crear sistema de autenticación:
$ php artisan make:auth
07. Registrarse para ingresar en la aplicación.
PASAR MENSAJES LARAVEL AL ESPAÑOL
08. Crear copia de resources\lang\en y renombrarla como resources\lang\es
09. Traducir al español los mensajes de los archivos de resources\lang\es
10. En config\app.php cambiar:
'locale' => 'en',
por
'locale' => 'es',
MODELO, MIGRACIÓN Y CONTROLADOR
11. $ php artisan make:model Task -m -c -r
12. Modificar archivo para la migración database\migrations\2021_01_09_002402_create_tasks_table.php:
***
class CreateTasksTable extends Migration
{
***
public function up()
{
Schema::create('tasks', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->text('description');
$table->integer('user_id')->unsigned();
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade')->onUpdate('cascade');
$table->timestamps();
});
}
***
public function down()
{
Schema::dropIfExists('tasks');
}
}
13. Ejecutar migración:
$ php artisan migrate
14. Modificar la clase Task en app\Task.php
class Task extends Model
{
// A que tabla hace referencia este modelo
protected $table = 'tasks'; // Esta línea de código realmente
// no es necesaria ya que estamos
// siguiendo la convención de laravel
// Campos que son asignables masivamente
protected $fillable = [
'name',
'description',
'user_id'
];
public function user(){
$this->belengsTo('App\User');
}
}
15. Agregar el método tasks en la clase User en app\User.php
public function tasks(){
$this->hasMany('App\Task');
}
16. Modificar método create en app\Http\Controllers\TaskController.php
public function create()
{
return view('task.create');
}
17. Crear carpeta resources\views\task
18. Crear resources\views\task\create.blade.php
NOTA: se puede utilizar como base a resources\views\auth\register.blade.php
@extends('layouts.app')
@section('content')
<div class="container">
<div class="row">
<div class="col-md-8 col-md-offset-2">
<div class="panel panel-default">
<div class="panel-heading">Crear tarea</div>
<div class="panel-body">
<form class="form-horizontal" method="POST" action="{{ route('task.store') }}">
{{ csrf_field() }}
<div class="form-group{{ $errors->has('name') ? ' has-error' : '' }}">
<label for="name" class="col-md-4 control-label">Nombre de la tarea</label>
<div class="col-md-6">
<input id="name" type="text" class="form-control" name="name" value="{{ old('name') }}" required autofocus>
@if ($errors->has('name'))
<span class="help-block">
<strong>{{ $errors->first('name') }}</strong>
</span>
@endif
</div>
</div>
<div class="form-group{{ $errors->has('description') ? ' has-error' : '' }}">
<label for="description" class="col-md-4 control-label">Descripción</label>
<div class="col-md-6">
<input id="description" type="text" class="form-control" name="description" value="{{ old('description') }}" required>
@if ($errors->has('description'))
<span class="help-block">
<strong>{{ $errors->first('description') }}</strong>
</span>
@endif
</div>
</div>
<div class="form-group">
<div class="col-md-6 col-md-offset-4">
<button type="submit" class="btn btn-primary">
Crear tarea
</button>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
@endsection
19. Añadir ruta a routes\web.php
Route::resource('task', 'TaskController');
20. Agregar:
use Auth;
en app\Http\Controllers\TaskController.php
21. Modificar método store en app\Http\Controllers\TaskController.php
public function store(Request $request)
{
//dd($request);
// Validación
$this->validate($request, [
'name' => 'required|string',
'description' => 'required|string'
]);
// Almacenamiento
$task = new Task;
$task->name = $request->name;
$task->description = $request->description;
$task->user_id = Auth::user()->id;
$task->save();
//$task = Task::create($request->all());
// Redirección
return redirect()->route('task.show', $task);
}
22. Modificar método show en app\Http\Controllers\TaskController.php
public function show(Task $task)
{
//dd($task);
return view('task.show', compact('task'));
}
23. Crear resources\views\task\show.blade.php
NOTA: utilizar como base resources\views\home.blade.php
@extends('layouts.app')
@section('content')
<div class="container">
<div class="row">
<div class="col-md-8 col-md-offset-2">
<div class="panel panel-default">
<div class="panel-heading">{{ $task->name }}</div>
<div class="panel-body">
<strong>Descripción: </strong>
<p>{{ $task->description }}</p>
</div>
<div class="panel-footer clearfix">
<p class="pull-right">
<a href="{{ route('task.edit', $task->id) }}">Editar</a>
<a href="#" style="color:red" onclick="enviar_formulario()">Eliminar</a>
</p>
</div>
</div>
</div>
</div>
</div>
<form method="post" action="{{ route('task.destroy', $task) }}" name="delete_form">
{{ csrf_field() }}
{{ method_field('DELETE') }}
</form>
@endsection
@section('foot')
<script>
function enviar_formulario(){
document.delete_form.submit();
}
</script>
@endsection
GENERAR DATOS DE PRUEBA EN TABLA TASK Y USER
24. Agregar función que genere registros de prueba en database\factories\ModelFactory.php
$factory->define(App\Task::class, function (Faker\Generator $faker) {
return [
'name' => $faker->name,
'description' => $faker->text,
//'user_id' => 1,
'user_id' => function(){
return factory(App\User::class)->create()->id;
}
];
});
25. Añadir las instrucciones al método run de database\seeds\DatabaseSeeder.php
factory(App\User::class, 50)->create();
factory(App\Task::class, 50)->create();
26. Ejecutar:
$ php artisan db:seed
LISTAR REGISTROS
27. Modificar el método index de app\Http\Controllers\TaskController.php
public function index()
{
//$tasks = Task::all();
$tasks = Task::paginate(10);
return view('task.index', compact('tasks'));
}
28. Crear resources\views\task\index.blade.php
NOTA: utilizar como base resources\views\task\show.blade.php
@extends('layouts.app')
@section('content')
<div class="container">
<div class="row">
<div class="col-md-8 col-md-offset-2">
@foreach($tasks as $task)
<div class="panel panel-default">
<div class="panel-heading"><a href="{{ route('task.show', $task) }}">{{ $task->name }}</a></div>
</div>
@endforeach
{{ $tasks->links() }}
</div>
</div>
</div>
@endsection
EDITAR, ACTUALIZAR Y ELIMINAR
29. Modificar el método edit de app\Http\Controllers\TaskController.php
public function edit(Task $task)
{
//dd($task);
return view('task.edit', compact('task'));
}
30. Crear resources\views\task\edit.blade.php
NOTA: utilizar como base resources\views\task\create.blade.php
public function edit(Task $task)
{
//dd($task);
return view('task.edit', compact('task'));
}
31. Modificar el método update de app\Http\Controllers\TaskController.php
public function update(Request $request, Task $task)
{
$this->validate($request, [
'name' => 'required|string',
'description' => 'required|string'
]);
//dd($request);
$task->name = $request->name;
$task->description = $request->description;
$task->save();
return redirect()->route('task.show', $task);
}
32. En el archivo resources\views\layouts\app.blade.php agregar al final de body la línea:
@yield('foot')
33. Modificar el método destroy de app\Http\Controllers\TaskController.php
public function destroy(Task $task)
{
//dd('Se ha enviado el formulario');
$task->delete();
return redirect()->route('task.index');
}
Comentarios
Publicar un comentario