Laravel 5 - Construire une application CRUD

1 1 1 1 1 1 1 1 1 1 Rating 4.20 (5 Votes)
Submit to DeliciousSubmit to DiggSubmit to FacebookSubmit to Google PlusSubmit to StumbleuponSubmit to TechnoratiSubmit to TwitterSubmit to LinkedIn

Dans ce tutoriel, nous allons construire une application CRUD simple à partir de zéro en utilisant Laravel 5. Les sources de l'application sont sur GitHub.

Créer le projet Laravel 5

Via l'installeur Laravel, dans un premier temps, il faut le déclarer en global :

# Déclaration globale de Laravel
composer global require "laravel/installer=~1.1"

Faire un ajout de variable d'environnement :

# Ajouter la variable au fichier
echo "export PATH=~/.composer/vendor/bin:$PATH"  >> ~/.bash_profile
 
# Recharger le fichier
source ~/.bash_profile

Créer un nouveau projet :

# Création du projet
laravel new tasks
 
# Mettre les droit en écriture du répertoire
cd tasks/
chmod 777 -R storage/

Vous pouvez maintenant aller à l'adresse http://localhost/local/tasks/public/ pour voir que tout c'est bien passé (la page affiche Laravel 5).

Créer la base de données

Dans un terminal :

# Se connecter à MySQL
mysql -u root -p
 
# Créer la base de données local.tasks
CREATE DATABASE `local.tasks`;
 
# Quitter les commande de MySQL
exit;

Configurer vos paramètres de la base de données (DB_HOST, DB_DATABASE, DB_USERNAME, DB_PASSWORD) dans le fichier .env comme dans mon cas un exemple ci-dessous :

APP_ENV=local
APP_DEBUG=true
APP_KEY=g8LzGs1JjEPmxSXIMvYAl7tqYVuduJKg

DB_HOST=localhost
DB_DATABASE=local.tasks
DB_USERNAME=root
DB_PASSWORD=root

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
MAIL_ENCRYPTION=null

Apache2 hôtes virtuels

Maintenant nous allons configurer les hôtes virtuels.

Ajouter le fichier local.tasks.conf dans le répertoire /etc/apache2/sites-available/ :

sudo vi /etc/apache2/sites-available/local.tasks.conf

Ajouter les informations ci-dessous dans le fichier :

<VirtualHost *:80>
    ServerAdmin local_AT_tasks
    ServerName local.tasks
    ServerAlias www.local.tasks
    DocumentRoot /home/debian/public_html/local/tasks/public
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

Puis :

# Utiliser l'outil a2ensite pour qu'Apache2 prenne en compte l'ajout du vhost
sudo a2ensite local.tasks.conf
 
# Redémarrer Apache2
sudo service apache2 restart
 
# Ajouter l'adresse dans /etc/hosts
sudo -s
sudo echo "127.0.0.1   local.tasks" >> /etc/hosts
exit

Pour finir, allez à la page : http://local.tasks

Si vous avez une erreur, vous pouvez regarder les logs Apache :

tail -f /var/log/apache2/error.log

Dans mon cas, j'ai du commenter la ligne commançant par "Options" du fichier public/.htaccess comme ci-dessous :

<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        # Options -MultiViews
    </IfModule>
 
    RewriteEngine On
 
    # Redirect Trailing Slashes If Not A Folder...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)/$ /$1 [L,R=301]
 
    # Handle Front Controller...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]
</IfModule>

Allez à la page : http://local.tasks

Debugbar

Nous allons maintenant installer Laravel Debugbar qui est l'un des packages les plus utiles de Laravel.

Debugbar permet le déboguer les éléments suivants :

  • exceptions
  • views
  • messages
  • queries
  • mails
  • auth
  • routes
  • ajax
  • and more

Pour cela suivez l'article Laravel 5 - Debugbar.

Une fois l'application rafraichit, vous aurez la barre de debug qui ressemblerea à la barre ci-dessous :

193 laravel 5 construire une application crud 11

Routes et Contrôleurs

Modifiez le fichier app/Http/routes.php comme ci-dessous :

<?php

/*
|--------------------------------------------------------------------------
| Application Routes
|--------------------------------------------------------------------------
|
| Here is where you can register all of the routes for an application.
| It's a breeze. Simply tell Laravel the URIs it should respond to
| and give it the controller to call when that URI is requested.
|
*/

Route::get('/', [
    'as' => 'home',
    'uses' => 'PagesController@home'
]);

Route::resource('tasks', 'TasksController');

Nous pouvons maintenant créer nos deux contrôleurs via la ligne de commande :

php artisan make:controller PagesController
php artisan make:controller TasksController

La première ligne crée le fichier app/Http/Controllers/PagesController.php et la seconde ligne le fichier app/Http/Controllers/TasksController.php.

Dans app/Http/Controllers/PagesController.php supprimez toutes les méthodes puis ajoutez :

    public function home()
    {
        return 'Welcome!';
    }

Ce qui donne :

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Requests;
use App\Http\Controllers\Controller;

class PagesController extends Controller
{
    public function home()
    {
        return 'Welcome!';
    }
}

Ensuite allez sur http://local.tasks/ une page avec Welcome home! apparait.

Si vous voulez créer un contrôleur à l'aide de php artisan, et vous voulez qu'il n'y ait pas de méthodes par défaut, vous pouvez ajouter le drapeau --plain à la commande comme ceci :

php artisan make:controller YourController --plain

Les vues

Créez les fichiers :

  • resources/views/layouts/master.blade.php
  • resources/views/pages/home.blade.php

Modifiez le fichier resources/views/layouts/master.blade.php comme ci-dessous :

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Tasks</title>
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css">
</head>
<body>

<nav class="navbar navbar-default">
    <div class="container-fluid">
        <div class="navbar-header">
            <a class="navbar-brand" href="#">Tasks</a>
        </div>
        <div class="nav navbar-nav navbar-right">
            <li><a href="#">Home</a></li>
            <li><a href="#">Tasks</a></li>
        </div>
    </div>
</nav>

<main>
    <div class="container">
        @yield('content')
    </div>
</main>

</body>
</html>

Puis modifiez le fichier resources/views/layouts/master.blade.php comme ci-dessous :

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Tasks</title>
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css">
</head>
<body>

<nav class="navbar navbar-default">
    <div class="container-fluid">
        <div class="navbar-header">
            <a class="navbar-brand" href="#">Tasks</a>
        </div>
        <div class="nav navbar-nav navbar-right">
            <li><a href="#">Home</a></li>
            <li><a href="#">Tasks</a></li>
        </div>
    </div>
</nav>

<main>
    <div class="container">
        @yield('content')
    </div>
</main>

</body>
</html>

Le fichier resources/views/pages/home.blade.php :

@extends('layouts.master')

@section('content')

    <h1>Welcome</h1>
    <p class="lead">
        Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent vulputate mauris non velit eleifend, ac congue odio feugiat. Duis vitae urna interdum, sodales magna quis, condimentum mauris. In id tortor erat. Proin libero dolor, interdum a auctor sed, auctor ut neque. Vivamus sed libero magna. Sed at purus lobortis, accumsan neque sed, facilisis nibh. Proin quis congue lectus, vel mollis lectus. In ligula risus, semper ut libero id, rutrum lobortis lorem. Aenean lacus elit, viverra nec lacinia ac, elementum vitae ex. Cras non ante sit amet libero pharetra tincidunt. Pellentesque massa purus, iaculis sed dictum et, rutrum nec quam.
    </p>
    <hr>

    <a href="/{{ route('tasks.index') }}" class="btn btn-info">View Tasks</a>
    <a href="/{{ route('tasks.create') }}" class="btn btn-primary">Add New Task</a>

@stop

Le fichier app/Http/Controllers/PagesController.php :

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Requests;
use App\Http\Controllers\Controller;

class PagesController extends Controller
{
    public function home()
    {
        return view('pages.home');
    }
}

Allez à la page http://local.tasks/ et vous trouverez la page ci-dessous :

193 laravel 5 construire une application crud 01

Grâce à la commande ci-dessous vous allez pouvoir afficher la liste des routes :

# Lister les routes
php artisan route:list

Le retour de la commande :

+--------+----------+--------------------+---------------+----------------------------------------------+------------+
| Domain | Method   | URI                | Name          | Action                                       | Middleware |
+--------+----------+--------------------+---------------+----------------------------------------------+------------+
|        | GET|HEAD | /                  | home          | App\Http\Controllers\PagesController@home    |            |
|        | GET|HEAD | tasks              | tasks.index   | App\Http\Controllers\TasksController@index   |            |
|        | POST     | tasks              | tasks.store   | App\Http\Controllers\TasksController@store   |            |
|        | GET|HEAD | tasks/create       | tasks.create  | App\Http\Controllers\TasksController@create  |            |
|        | DELETE   | tasks/{tasks}      | tasks.destroy | App\Http\Controllers\TasksController@destroy |            |
|        | PATCH    | tasks/{tasks}      |               | App\Http\Controllers\TasksController@update  |            |
|        | GET|HEAD | tasks/{tasks}      | tasks.show    | App\Http\Controllers\TasksController@show    |            |
|        | PUT      | tasks/{tasks}      | tasks.update  | App\Http\Controllers\TasksController@update  |            |
|        | GET|HEAD | tasks/{tasks}/edit | tasks.edit    | App\Http\Controllers\TasksController@edit    |            |
+--------+----------+--------------------+---------------+----------------------------------------------+------------+

Modifiez le fichier resources/views/layouts/master.blade.php :

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Tasks</title>
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css">
</head>
<body>

<nav class="navbar navbar-default">
    <div class="container-fluid">
        <div class="navbar-header">
            <a class="navbar-brand" href="/{{ route('home') }}">Tasks</a>
        </div>
        <div class="nav navbar-nav navbar-right">
            <li><a href="/{{ route('home') }}">Home</a></li>
            <li><a href="/{{ route('tasks.index') }}">Tasks</a></li>
        </div>
    </div>
</nav>

<main>
    <div class="container">
        @yield('content')
    </div>
</main>

</body>
</html>

Migration de la base de données

Exécutez la commande ci-dessous :

# Créer la migration create_tasks_table
php artisan make:migration create_tasks_table --create=tasks

Regarder dans le répertoire database/migrations, le fichier database/migrations/2015_10_09_143137_create_tasks_table.php a été créé (chez vous, 2015_10_09_143137 est remplacé par la date de l'exécution de la commande).

Modifiez le fichier database/migrations/2015_10_09_143137_create_tasks_table.php comme ci-dessous :

<?php

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateTasksTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('tasks', function (Blueprint $table) {
            $table->increments('id');
            $table->string('title');
            $table->text('description');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::drop('tasks');
    }
}

Maintenant, nous allons exécuter notre migration pour obtenir notre base de données mis en place :

php artisan migrate

Quand on regadre la base de données local.tasks, nous pouvons constater que la table tasks a bien été créé.

Créer un jeu de données exemple

Il faut maintenant créer un "seeder" qui est un jeu de données qui va permettre de peupler la base de données :

# Seeder pour la table tasks
php artisan make:seeder TaskTableSeeder

Si tout c'est bien passé, vous allez avoir le fichier TaskTableSeeder.php dans le répertoire database > seeds, il faut maintenant modifier les méthodes run() de chaque fichier :

<?php

use Illuminate\Database\Seeder;

class TaskTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        $now = date('Y-m-d H:i:s');

        DB::table('tasks')->insert(
            [
                'title' => 'Task 1',
                'description' => 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut lacinia ante metus, ut congue sem facilisis et. Sed convallis leo malesuada, lobortis nulla eu, scelerisque ipsum. Pellentesque vel sapien justo. Sed in augue mollis, sagittis urna non, tincidunt lectus. Interdum et malesuada fames ac ante ipsum primis in faucibus. In sed diam vitae lectus tempus dictum non nec est. Aliquam dignissim nibh vel fringilla finibus. Sed rhoncus tempus ante nec interdum. Proin ac nibh euismod, molestie arcu sit amet, sagittis ante. Aliquam a vestibulum leo.',
                'created_at' => $now,
                'updated_at' => $now,
            ]
        );
        DB::table('tasks')->insert(
            [
                'title' => 'Task 2',
                'description' => 'Duis faucibus tellus nec odio auctor, quis pulvinar lorem gravida. Aliquam sed turpis volutpat, aliquam nisl sed, maximus leo. Ut sollicitudin tincidunt augue, a pulvinar nunc porta vitae. Nunc molestie auctor magna, eleifend imperdiet turpis laoreet maximus. Vestibulum dapibus tortor nec lorem euismod, ut ultrices tortor tristique. Morbi eget dolor malesuada, tincidunt diam eget, dictum tellus. Donec eget tellus sem. Donec volutpat est dignissim pharetra accumsan. Donec condimentum massa massa, ac imperdiet sapien accumsan at. Sed posuere odio in magna sodales egestas. Ut mauris massa, luctus ut lacus et, fermentum volutpat velit.',
                'created_at' => $now,
                'updated_at' => $now,
            ]
        );
        DB::table('tasks')->insert(
            [
                'title' => 'Task 3',
                'description' => 'Integer ultricies semper nisl, ut consectetur nunc consectetur sed. Nunc sodales ac lectus pulvinar volutpat. Integer vestibulum tristique leo. Cras pellentesque gravida dolor iaculis tincidunt. Pellentesque vehicula mi at volutpat varius. Duis ultricies congue nulla, in vulputate neque gravida non. Donec justo diam, euismod ac gravida quis, varius at eros. Morbi ornare orci nec ligula tempus scelerisque. Cras convallis pharetra sollicitudin. Phasellus iaculis risus id risus blandit fermentum. Donec felis diam, facilisis vel accumsan non, eleifend nec nisi. Sed felis lorem, condimentum eu venenatis at, lacinia a elit. Donec condimentum tellus felis, non rhoncus est pellentesque non. Nam nec metus quis leo tempor sodales non eget metus. Interdum et malesuada fames ac ante ipsum primis in faucibus. Aenean varius magna sed mattis posuere.',
                'created_at' => $now,
                'updated_at' => $now,
            ]
        );
    }
}

Pour terminer, il faut modifier le fichier database > seeds > DatabaseSeeder.php :

<?php

use Illuminate\Database\Seeder;
use Illuminate\Database\Eloquent\Model;

class DatabaseSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        Model::unguard();

        $this->call(TaskTableSeeder::class);

        Model::reguard();
    }
}

Ensuite exécutez la commande ci-dessous :

# Permet de rafraîchir la migration et d'envoyer les seeder
php artisan migrate:refresh --seed

Les données sont maintenant insérées dans la table tasks.

Documentation : http://laravel.com/docs/5.1/seeding

Modèles et ORM Eloquent

Maintenant que notre base de données est mise en place, il est temps de parler de Modèles et ORM Eloquent. Vous pouvez consulter la documentation concernant Eloquent.

Exécutez la ligne de commande pour créer le modèle Task :

php artisan make:model Task

Ensuite, ouvrez le fichier app/Task.php qui vient d'être généré et modifiez le comme ci-dessous :

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Task extends Model
{
    protected $table = 'tasks';

    protected $fillable = [
        'title',
        'description',
    ];

    public $timestamps = true;
}

Lister les enregistrements

Modifier la fonction index() du fichier app/Http/Controllers/TasksController.php :

    public function index()
    {
        $tasks = Task::latest('updated_at')->get();

        return view('tasks.index', compact('tasks'));
    }

Ensuite il faut créer la vue resources/views/tasks/index.blade.php avec le code ci-dessous :

@extends('layouts.master')

@section('content')

    <h1>Task List</h1>
    <p class="lead">Here's a list of all your tasks. <a href="/{{ route('tasks.create') }}">Add a new one?</a></p>
    <hr>

    @if(Session::has('flash_message'))
        <div class="alert alert-success fade in">
            <button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button>
            {{ Session::get('flash_message') }}
        </div>
    @endif

    @foreach($tasks as $task)
        <h3>{{ $task->title }}</h3>
        <p>{{ $task->description}}</p>

        <div class="row">
            <div class="col-md-6">
                <a href="/{{ route('tasks.show', $task->id) }}" class="btn btn-info">View Task</a>
                <a href="/{{ route('tasks.edit', $task->id) }}" class="btn btn-primary">Edit Task</a>
            </div>
            <div class="col-md-6 text-right">
                {!! Form::open([
                    'method' => 'DELETE',
                    'route' => ['tasks.destroy', $task->id]
                ]) !!}
                {!! Form::submit('Delete this task?', ['class' => 'btn btn-danger']) !!}
                {!! Form::close() !!}
            </div>
        </div>
        <hr>
    @endforeach

@stop

Allez à http://local.tasks/tasks pour voir la liste des enregistrements :

193 laravel 5 construire une application crud 12

Lire un enregistrement

Modifier la fonction show() du fichier app/Http/Controllers/TasksController.php :

    public function show($id)
    {
        $task = Task::findOrFail($id);

        return view('tasks.show', compact('task'));
    }

Ensuite il faut créer la vue resources/views/tasks/show.blade.php avec le code ci-dessous :

@extends('layouts.master')

@section('content')

    <h1>{{ $task->title }}</h1>
    <p class="lead">{{ $task->description }}</p>
    <hr>

    <div class="row">
        <div class="col-md-6">
            <a href="/{{ route('tasks.index') }}" class="btn btn-info">Back to all tasks</a>
            <a href="/{{ route('tasks.edit', $task->id) }}" class="btn btn-primary">Edit Task</a>
        </div>
        <div class="col-md-6 text-right">
            {!! Form::open([
                'method' => 'DELETE',
                'route' => ['tasks.destroy', $task->id]
            ]) !!}
            {!! Form::submit('Delete this task?', ['class' => 'btn btn-danger']) !!}
            {!! Form::close() !!}
        </div>
    </div>

@stop

Allez à http://local.tasks/tasks/1 pour lire l'enregistrement :

193 laravel 5 construire une application crud 17

Ajouter un enregistrement

Modifier la fonction create() du fichier app/Http/Controllers/TasksController.php :

    public function create()
    {
        return view('tasks.create');
    }

Ensuite il faut créer la vue resources/views/tasks/create.blade.php avec le code ci-dessous :

@extends('layouts.master')

@section('content')

    <h1>Add a New Task</h1>
    <p class="lead">Add to your task list below.</p>
    <hr>
    {!! Form::open([
        'route' => 'tasks.store'
    ]) !!}

    <div class="form-group">
        {!! Form::label('title', 'Title:', ['class' => 'control-label']) !!}
        {!! Form::text('title', null, ['class' => 'form-control']) !!}
    </div>

    <div class="form-group">
        {!! Form::label('description', 'Description:', ['class' => 'control-label']) !!}
        {!! Form::textarea('description', null, ['class' => 'form-control']) !!}
    </div>

    {!! Form::submit('Create New Task', ['class' => 'btn btn-primary']) !!}

    {!! Form::close() !!}
@stop

Pour créer ce formulaire, nous devons uttiliser le package Illuminate/Html. Pour cela exécuter la commande ci-dessous :

composer require illuminate/html

Puis modifiez le fichier config/app.php en ajoutant dans "Autoloaded Service Providers" :

Illuminate\Html\HtmlServiceProvider::class,

Et dans "Class Aliases" :

        'Form'      => Illuminate\Html\FormFacade::class,
        'Html'      => Illuminate\Html\HtmlFacade::class,

Le résultat final :

<?php

return [

    /*
    |--------------------------------------------------------------------------
    | Application Debug Mode
    |--------------------------------------------------------------------------
    |
    | When your application is in debug mode, detailed error messages with
    | stack traces will be shown on every error that occurs within your
    | application. If disabled, a simple generic error page is shown.
    |
    */

    'debug' => env('APP_DEBUG', false),

    /*
    |--------------------------------------------------------------------------
    | Application URL
    |--------------------------------------------------------------------------
    |
    | This URL is used by the console to properly generate URLs when using
    | the Artisan command line tool. You should set this to the root of
    | your application so that it is used when running Artisan tasks.
    |
    */

    'url' => 'http://localhost',

    /*
    |--------------------------------------------------------------------------
    | Application Timezone
    |--------------------------------------------------------------------------
    |
    | Here you may specify the default timezone for your application, which
    | will be used by the PHP date and date-time functions. We have gone
    | ahead and set this to a sensible default for you out of the box.
    |
    */

    'timezone' => 'UTC',

    /*
    |--------------------------------------------------------------------------
    | Application Locale Configuration
    |--------------------------------------------------------------------------
    |
    | The application locale determines the default locale that will be used
    | by the translation service provider. You are free to set this value
    | to any of the locales which will be supported by the application.
    |
    */

    'locale' => 'en',

    /*
    |--------------------------------------------------------------------------
    | Application Fallback Locale
    |--------------------------------------------------------------------------
    |
    | The fallback locale determines the locale to use when the current one
    | is not available. You may change the value to correspond to any of
    | the language folders that are provided through your application.
    |
    */

    'fallback_locale' => 'en',

    /*
    |--------------------------------------------------------------------------
    | Encryption Key
    |--------------------------------------------------------------------------
    |
    | This key is used by the Illuminate encrypter service and should be set
    | to a random, 32 character string, otherwise these encrypted strings
    | will not be safe. Please do this before deploying an application!
    |
    */

    'key' => env('APP_KEY', 'SomeRandomString'),

    'cipher' => 'AES-256-CBC',

    /*
    |--------------------------------------------------------------------------
    | Logging Configuration
    |--------------------------------------------------------------------------
    |
    | Here you may configure the log settings for your application. Out of
    | the box, Laravel uses the Monolog PHP logging library. This gives
    | you a variety of powerful log handlers / formatters to utilize.
    |
    | Available Settings: "single", "daily", "syslog", "errorlog"
    |
    */

    'log' => 'single',

    /*
    |--------------------------------------------------------------------------
    | Autoloaded Service Providers
    |--------------------------------------------------------------------------
    |
    | The service providers listed here will be automatically loaded on the
    | request to your application. Feel free to add your own services to
    | this array to grant expanded functionality to your applications.
    |
    */

    'providers' => [

        /*
         * Laravel Framework Service Providers...
         */
        Illuminate\Foundation\Providers\ArtisanServiceProvider::class,
        Illuminate\Auth\AuthServiceProvider::class,
        Illuminate\Broadcasting\BroadcastServiceProvider::class,
        Illuminate\Bus\BusServiceProvider::class,
        Illuminate\Cache\CacheServiceProvider::class,
        Illuminate\Foundation\Providers\ConsoleSupportServiceProvider::class,
        Illuminate\Routing\ControllerServiceProvider::class,
        Illuminate\Cookie\CookieServiceProvider::class,
        Illuminate\Database\DatabaseServiceProvider::class,
        Illuminate\Encryption\EncryptionServiceProvider::class,
        Illuminate\Filesystem\FilesystemServiceProvider::class,
        Illuminate\Foundation\Providers\FoundationServiceProvider::class,
        Illuminate\Hashing\HashServiceProvider::class,
        Illuminate\Mail\MailServiceProvider::class,
        Illuminate\Pagination\PaginationServiceProvider::class,
        Illuminate\Pipeline\PipelineServiceProvider::class,
        Illuminate\Queue\QueueServiceProvider::class,
        Illuminate\Redis\RedisServiceProvider::class,
        Illuminate\Auth\Passwords\PasswordResetServiceProvider::class,
        Illuminate\Session\SessionServiceProvider::class,
        Illuminate\Translation\TranslationServiceProvider::class,
        Illuminate\Validation\ValidationServiceProvider::class,
        Illuminate\View\ViewServiceProvider::class,
        Illuminate\Html\HtmlServiceProvider::class,

        /*
         * Application Service Providers...
         */
        App\Providers\AppServiceProvider::class,
        App\Providers\AuthServiceProvider::class,
        App\Providers\EventServiceProvider::class,
        App\Providers\RouteServiceProvider::class,

    ],

    /*
    |--------------------------------------------------------------------------
    | Class Aliases
    |--------------------------------------------------------------------------
    |
    | This array of class aliases will be registered when this application
    | is started. However, feel free to register as many as you wish as
    | the aliases are "lazy" loaded so they don't hinder performance.
    |
    */

    'aliases' => [

        'App'       => Illuminate\Support\Facades\App::class,
        'Artisan'   => Illuminate\Support\Facades\Artisan::class,
        'Auth'      => Illuminate\Support\Facades\Auth::class,
        'Blade'     => Illuminate\Support\Facades\Blade::class,
        'Bus'       => Illuminate\Support\Facades\Bus::class,
        'Cache'     => Illuminate\Support\Facades\Cache::class,
        'Config'    => Illuminate\Support\Facades\Config::class,
        'Cookie'    => Illuminate\Support\Facades\Cookie::class,
        'Crypt'     => Illuminate\Support\Facades\Crypt::class,
        'DB'        => Illuminate\Support\Facades\DB::class,
        'Eloquent'  => Illuminate\Database\Eloquent\Model::class,
        'Event'     => Illuminate\Support\Facades\Event::class,
        'File'      => Illuminate\Support\Facades\File::class,
        'Gate'      => Illuminate\Support\Facades\Gate::class,
        'Hash'      => Illuminate\Support\Facades\Hash::class,
        'Input'     => Illuminate\Support\Facades\Input::class,
        'Inspiring' => Illuminate\Foundation\Inspiring::class,
        'Lang'      => Illuminate\Support\Facades\Lang::class,
        'Log'       => Illuminate\Support\Facades\Log::class,
        'Mail'      => Illuminate\Support\Facades\Mail::class,
        'Password'  => Illuminate\Support\Facades\Password::class,
        'Queue'     => Illuminate\Support\Facades\Queue::class,
        'Redirect'  => Illuminate\Support\Facades\Redirect::class,
        'Redis'     => Illuminate\Support\Facades\Redis::class,
        'Request'   => Illuminate\Support\Facades\Request::class,
        'Response'  => Illuminate\Support\Facades\Response::class,
        'Route'     => Illuminate\Support\Facades\Route::class,
        'Schema'    => Illuminate\Support\Facades\Schema::class,
        'Session'   => Illuminate\Support\Facades\Session::class,
        'Storage'   => Illuminate\Support\Facades\Storage::class,
        'URL'       => Illuminate\Support\Facades\URL::class,
        'Validator' => Illuminate\Support\Facades\Validator::class,
        'View'      => Illuminate\Support\Facades\View::class,
        'Form'      => Illuminate\Html\FormFacade::class,
        'Html'      => Illuminate\Html\HtmlFacade::class,
    ],

];

Allez à http://local.tasks/tasks/create pour voir le formulaire :

193 laravel 5 construire une application crud 03

Maintenant nous allons effectuer la validation des données, pour cela, il faut modifier la fonction store(Request $request) du fichier app/Http/Controllers/TasksController.php :

    public function store(Request $request)
    {
        $this->validate($request, [
            'title' => 'required',
            'description' => 'required'
        ]);

        $input = $request->all();

        Task::create($input);

        Session::flash('flash_message', 'Task successfully added!');

        return redirect()->back();
    }

Allez à http://local.tasks/tasks/create puis cliquez sur le bouton "Create New Task", vous allez avoir l'écran ci-dessous :

193 laravel 5 construire une application crud 04

Si le formulaire ne comporte pas d'erreur, un message flash s'affiche dans la liste des enregistrements :

193 laravel 5 construire une application crud 16

Modifier un enregistrement

Modifier la fonction edit() du fichier app/Http/Controllers/TasksController.php :

    public function edit($id)
    {
        $task = Task::findOrFail($id);

        return view('tasks.edit', compact('task'));
    }

Modifier la fonction update() du fichier app/Http/Controllers/TasksController.php :

    public function update(Request $request, $id)
    {
        $task = Task::findOrFail($id);

        $this->validate($request, [
            'title' => 'required',
            'description' => 'required'
        ]);

        $input = $request->all();

        $task->fill($input)->save();

        Session::flash('flash_message', 'Task successfully modified!');

        return redirect()->route('tasks.index');
    }

Ensuite il faut créer la vue resources/views/tasks/edit.blade.php avec le code ci-dessous :

@extends('layouts.master')

@section('content')

    <h1>Edit Task - Task Name </h1>
    <p class="lead">Edit this task below. <a href="/{{ route('tasks.index') }}">Go back to all tasks.</a></p>
    <hr>

    {!! Form::model($task, [
    'method' => 'PATCH',
    'route' => ['tasks.update', $task->id]
]) !!}

    <div class="form-group @if ($errors->get('title')): has-error @endif">
        {!! Form::label('title', 'Title:', ['class' => 'control-label']) !!}
        {!! Form::text('title', null, ['class' => 'form-control']) !!}
        @if ($errors->has('title'))
            <p class="help-block">{{ $errors->first('title') }}</p>
        @endif
    </div>

    <div class="form-group @if ($errors->get('description')): has-error @endif">
        {!! Form::label('description', 'Description:', ['class' => 'control-label']) !!}
        {!! Form::textarea('description', null, ['class' => 'form-control']) !!}
        @if ($errors->has('description'))
            <p class="help-block">{{ $errors->first('description') }}</p>
        @endif
    </div>

    {!! Form::submit('Update Task', ['class' => 'btn btn-primary']) !!}

    {!! Form::close() !!}

@stop

Allez à http://local.tasks/tasks/1/edit puis cliquez sur le bouton "Create New Task", vous allez avoir l'écran ci-dessous :

193 laravel 5 construire une application crud 13.resized

Si le formulaire comporte des erreurs :

193 laravel 5 construire une application crud 14 

Si le formulaire ne comporte pas d'erreur, un message flash s'affiche dans la liste des enregistrements :

193 laravel 5 construire une application crud 15

Supprimer un enregistrement

Modifier la fonction destroy() du fichier app/Http/Controllers/TasksController.php :

    public function destroy($id)
    {
        $task = Task::findOrFail($id);

        $task->delete();

        Session::flash('flash_message', 'Task successfully deleted!');

        return redirect()->route('tasks.index');
    }

Vous avez deux façons de supprimer un enregistrement dans :

  • la liste des enregistrement

193 laravel 5 construire une application crud 18

  • la visualisation de l'enregistrement

193 laravel 5 construire une application crud 19

Dans tous les cas, lors de la suppression, un message flash apparaît dans la liste des enregistrements :

193 laravel 5 construire une application crud 20

Conclusion

Grâce à ce tutoriel, vous savez maintenant créer une application CRUD à l'aide de Laravel 5.

Submit to DeliciousSubmit to DiggSubmit to FacebookSubmit to Google PlusSubmit to StumbleuponSubmit to TechnoratiSubmit to TwitterSubmit to LinkedIn