Apuntes de Curso de Laravel 5.4



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',
    NOTA: https://github.com/Laraveles/spanish (contiene las traducciones para la versión 5.4).

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::classfunction (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 $requestTask $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

Entradas más populares de este blog

Algunas páginas de cursos online recopiladas por Soluciones++

Soluciones++ para Laravel