Crud con Laravel 5: Create

laravel

Vamos a hacer 4 tutoriales para crear un ejemplo de crud con Laravel 5 utilizando una tabla de posts.

En esta primera ocasión vamos a crear el formulario desde donde podremos crear posts, cómo ya sabemos en Laravel 5 cambian bastantes cosas, y aquí veremos muchas de ellas para poder disipar dudas, espero que te guste y te sea útil.

Crear el proyecto con Laravel 5

Colócate en el directorio donde desees tener tu proyecto desde la terminal y escribe el siguiente comando, si no tienes Laravel 5 instalado te recomiendo este tutorial.

laravel new crud
Una vez hemos creado el proyecto vamos a hacer una pequeña configuración para poder utilizar nuestro archivo de entorno, así que renombra el archivo .env.example de la raíz por .env y déjalo cómo el siguiente (o utiliza tus propias credenciales).
APP_ENV=local
APP_DEBUG=true
APP_KEY=eYIGjwZ4xEepwIFVZF4EcIYSGWnvRBOv
 
DB_HOST=localhost
DB_DATABASE=laracrud
DB_USERNAME=root
DB_PASSWORD=
 
CACHE_DRIVER=file
SESSION_DRIVER=file
QUEUE_DRIVER=sync
 
MAIL_DRIVER=smtp
MAIL_HOST=mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=null
MAIL_PASSWORD=null
Ahora ya estamos utilizando estos datos para el debug y nuestra conexión entre otras cosas, pero estas son las más importantes ahora mismo.

Ahora vamos a crear el modelo Post, de esta forma también se creará nuestra migración, así que ejecuta el siguiente comando en la terminal.

php artisan make:model Post
Recibiremos un mensaje conforme el modelo Post se ha creado correctamente y conjuntamente una migración, así que abre el archivo de migración alojado en database/migrations llamado xxxxxxxxx_create_posts_table.php y déjalo cómo el siguiente.
<?php
 
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
 
class CreatePostsTable extends Migration {
 
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('posts', function(Blueprint $table)
        {
            $table->increments('id');
            $table->string('title');
            $table->text('body');
            $table->timestamps();
        });
    }
 
    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::drop('posts');
    }
}
Si has seguido correctamente todos los pasos y los datos de conexión con tu base de datos en el archivo .env son correctos ejecuta las migraciones con el siguiente comando, una vez hecho ya tendremos nuestras tablas creadas.
    php artisan migrate
Ahora es momento de crear el controlador PostController, para ello escribe en la terminal el siguiente comando, el cuál nos creará un controlador restful llamado PostController.php en el directorio app/Http/Controllers.
    php artisan make:controller PostController
Cómo ya sabemos, en Laravel 5 no podemos utilizar las clases html y form de forma nativa, tenemos que instalarlas, para ello abre tu archivo composer.json y añade la siguiente línea en la clave require.
    "illuminate/html": "5.*"
Ahora simplemente ejecuta el siguiente comando.
    composer update
Ya las tenemos instaladas, pero para poder utilizarlas debemos hacer un par de cosas más, abre el archivo config/app.php y en el array providers añade la siguiente línea.
    'Illuminate\Html\HtmlServiceProvider',
Ahora haz lo mismo pero esta vez con el array aliases.
'Html'      => 'Illuminate\Html\HtmlFacade',
'Form'      => 'Illuminate\Html\FormFacade',
Ahora que ya tenemos lo más importante configurado, vamos a crear nuestro archivo para validar el formulario de Post, así que ejecuta el siguiente comando desde tu terminal.
    php artisan make:request PostForm
Ahora tendremos un archivo en el directorio app/Http/Requests llamado PostForm.php, si lo abrimos, veremos que tiene dos métodos.
<?php namespace App\Http\Requests;
 
use App\Http\Requests\Request;
 
class PostForm extends Request {
 
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return false;
    }
 
    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            //
        ];
    }
}
Esto así no hace nada, es más, si lo utilizamos, no podremos ni siquiera enviar el formulario al devolver false el método authorize, así que lo vamos a modificar un poco y de paso vamos a ver cómo podemos crear nuestros propios mensajes de error personalizados, lo dicho, modifica el código por el siguiente.
<?php namespace App\Http\Requests;
 
use App\Http\Requests\Request;
 
class PostForm extends Request {
 
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true;
    }
 
    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            "title"    =>    "required|min:5|max:45",
            "body"     =>    "required|min:5|max:500"
        ];
    }
 
    public function messages()
    {
        return [
            'title.required' => 'El campo title es requerido!',
            'title.min' => 'El campo title no puede tener menos de 5 carácteres',
            'title.min' => 'El campo title no puede tener más de 45 carácteres',
            'body.required' => 'El campo body es requerido!',
            'body.min' => 'El campo body no puede tener menos de 5 carácteres',
            'body.min' => 'El campo body no puede tener más de 500 carácteres',
        ];
    }
}
Así de simple es crear nuestro propio validador de formularios en Laravel 5, veremos cómo utilizarlo en el controlador PostController cuando recibamos el formulario en el método store.

Ahora debemos rutear el controlador PostController desde nuestro archivo routes.php alojado en el directorio app/Http, así que añade el siguiente código.

    Route::resource('post', 'PostController');
Ahora sí, ya tenemos configurado todo lo necesario para crear y guardar nuestros posts, sólo nos queda trabajar en el modelo, el controlador y la vista.

Vamos a empezar por lo más sencillo, el modelo Post que está alojado en el directorio app por defecto, ábrelo y modifica el código para que quede de la siguiente forma.

<?php namespace App;
 
use Illuminate\Database\Eloquent\Model;
 
class Post extends Model {
 
    protected $table = 'posts';
 
    protected $fillable = ['title', 'body'];
 
    protected $guarded = ['id'];
}

Simplemente definimos el nombre de la tabla, los campos que pueden ser asignamos manualmente y los que no ($fillable / $guarded).

En Laravel 5 al igual que en versiones anteriores los controladores restful ya definen para que sirve cada método, para mostrar el formulario para crear nuevos posts es el método create, así que abre el controlador PostController y agrega la siguiente porción al método create.

/**
 * Show the form for creating a new resource.
 *
 * @return Response
 */
public function create()
{
    return view("posts.create");
}
Simplemente le decimos que en el directorio resources/views tendremos un directorio llamado posts con un archivo create.blade.php o create.php, en nuestro caso crea el directorio posts y dentro el archivo create.blade.php y añade el siguiente código.
    @extends('app')
 
@section('content')
<div class="container">
    <div class="row">
        <div class="col-md-10 col-md-offset-1">
            <div class="panel panel-default">
                <div class="panel-heading">Home</div>
 
                @if($errors->has())
                <div class='alert alert-danger'>
                    @foreach ($errors->all('<p>:message</p>') as $message)
                    {!! $message !!}
                    @endforeach
                </div>
                @endif
 
                @if (Session::has('message'))
                <div class="alert alert-success">{{ Session::get('message') }}</div>
                @endif
 
                <div class="panel-body">
                    {!! Form::open(['route' => 'post.store']) !!}
 
                    <div class="form-group">
                        {!! Form::text('title', null, ["class" => "form-control"]) !!}
                    </div>
 
                    <div class="form-group">
                        {!! Form::textarea('body', null,
                        ['class'=>'form-control', 'placeholder'=>'Body'])
                        !!}
                    </div>
 
                    <div class="form-group">
                        {!! Form::submit('Send', ["class" => "btn btn-success btn-block"]) !!}
                    </div>
 
                    {!! Form::close() !!}
                </div>
            </div>
        </div>
    </div>
</div>
@endsection

Cómo ya sabemos, en Laravel 5 para que el html no sea escapado necesitamos utilizar la sintaxis {!! !!}, el resto es un sencillo formulario que apunta a la ruta post.store (donde se reciben las peticiones post) y los mensajes de error y success si el formulario ha sido procesado correctamente.

Volviendo al controlador PostController lo primero que debemos hacer es incluir el formRequest que hemos creado para nuestro formulario al principio de la clase.

use App\Http\Requests\PostForm;

Ahora modifica el método store para que quede de la siguiente forma.
/**
 * Store a newly created resource in storage.
 *
 * @return Response
 */
public function store(PostForm $postForm)
{
    $post = new \App\Post;
 
    $post->title = \Request::input('title');
 
    $post->body = \Request::input('body');
 
    $post->save();
 
    return redirect('post/create')->with('message', 'Post saved');
}

Eso es todo, creamos una nueva instancia del modelo Post, obtenemos los campos del formulario, guardamos y redirigimos con un mensaje conforme todo ha ido bien.

Si ahora te diriges a la ruta post/create verás el formulario, y si lo envías con los campos vacíos verás los errores de validación que hemos creado, en cambio, si llenas los campos y lo envías verás un mensaje conforme todo ha ido bien.

Espero que te haya gustado y si es así te agradezco que compartas mi trabajo en las redes sociales.

Comentarios

Comentarios