php artisan make:auth php artisan make:migration create_posts_table php artisan make:seeder PostsTableSeeder php artisan make:model Post php artisan make:controller PostController
public function up() { Schema::create('posts', function (Blueprint $table) { $table->bigIncrements('id'); $table->string('title'); $table->text('content'); $table->timestamps(); }); }
Nouveauté ⇒ utilisation de Faker pour créer des données aléatoires
use Illuminate\Database\Seeder; use Faker\Generator as Faker; class PostsTableSeeder extends Seeder { /** * Run the database seeds. * * @return void */ public function run(Faker $faker) { for ($i=0; $i < 10; $i++) { DB::table('posts')->insert([ 'title' => $faker->sentence(2), 'content' => $faker->realText, ]); } } }
php artisan migrate php artisan db:seed --class=PostsTableSeeder
namespace App; use Illuminate\Database\Eloquent\Model; class Post extends Model { protected $fillable = ['title', 'content']; }
Création de la méthode Index() pour aller chercher les articles de blogue dans la base de données et les afficher dans la vue Welcome.blade.php
On va utiliser la class Post
, donc il faut mettre au début du fichier
use App\Post;
public function index() { $posts = Post::orderBy('created_at', 'desc')->paginate(4); return View('welcome', compact('posts')); }
Route::get('/', 'PostController@index')->name('post');
Configuration de la page accueil
@extends('layouts.app') @section('content') <div class="container"> <div class="row justify-content-center"> <div class="col-md-12"> @foreach ($posts as $post) <h2> <a href="{{ url("/posts/{$post->id}") }}">{{ $post->title }}</a> </h2> <p>{{ $post->content }}</p> @endforeach {{ $posts->links() }} </div> </div> </div> @endsection
Ajout de la méthode pour voir un article de blogue
public function view($id) { $post = Post::find($id); return View('post', compact('post')); }
Route::get('/posts/{id}', 'PostController@view');
Création de post.blade.php
@extends('layouts.app') @section('content') <div class="container"> <div class="row justify-content-center"> <div class="col-md-12"> <h2> {{ $post->title }} </h2> <p>{{ $post->content }}</p> </div> </div> </div> @endsection
public function delete($id) { $post = Post::destroy($id); return redirect('/'); }
On va créer le bouton dans une vue différente afin d'organiser un peu le code.
Créer un dossier /ressouces/views/inc
Puis créer le fichier delete.blade.php
dans ce dossier
Dans le fichier welcome.blade.php, on ajoute le include dans la boucle @foreach
@foreach ($posts as $post) <h2> <a href="{{ url("/posts/{$post->id}") }}">{{ $post->title }}</a> </h2> <p>{{ $post->content }}</p> @include('inc.delete') @endforeach
Puis dans la vue delete.blade.php
@auth <form action="{{ url('posts/'.$post->id) }}" method="POST"> {{ csrf_field() }} {{ method_field('DELETE') }} <button type="submit" class="btn btn-danger"> Supprimer </button> </form> @endauth
Le bouton sera afficher seulement aux utilisateurs connecté car on ajoute au début @auth
Route::delete('/posts/{id}', 'PostController@delete');
On ajoute les routes pour afficher le formulaire et faire l'enregistrement
Route::get('/post_add', 'PostController@create')->middleware('auth'); Route::post('/post_add', 'PostController@store')->middleware('auth');
On ajoute la méthode create() pour afficher le formulaire La méthode validator() pour valider le formulaire
La méthode store() pour enregistrer les informations dans la base de données
Comme on va utiliser la class Validator, il faut l'ajouter au début du fichier
use Illuminate\Support\Facades\Validator;
public function create() { return View('add_post'); } protected function validator(array $data) { return Validator::make($data, [ 'title' => 'bail|required', 'content' => 'bail|required' ]); } public function store(Request $request) { $this->validator($request->all())->validate(); $post = $request->all(); Post::create($post); return redirect('/'); }
@extends('layouts.app') @section('content') <div class="container"> <div class="row justify-content-center"> <div class="col-md-12"> <form action="{{ url("post_add") }}" method="POST" class="form-horizontal"> @csrf @if ($errors->any()) <div class="alert alert-danger" role="alert"> Verifiez les informations </div> @endif <div class="form-group"> <label for="task" class="col-sm-3 control-label">Titre</label> <div class="col-sm-6"> <input type="text" name="title" id="task-name" class="form-control {{ $errors->has('title') ? 'is-invalid' : '' }}"> @if($errors->has('title')) <div class="invalid-feedback">{{ $errors->first('title') }}</div> @endif </div> </div> <div class="form-group{{ $errors->has('content') ? ':invalid' : '' }}"> <label for="task" class="col-sm-3 control-label">Texte</label> <div class="col-sm-6"> <textarea type="text" name="content" id="task-name" class="form-control {{ $errors->has('content') ? 'is-invalid' : '' }}"></textarea> @if($errors->has('content')) <span class="invalid-feedback">{{ $errors->first('content') }}</span> @endif </div> </div> <div class="form-group"> <div class="col-sm-offset-3 col-sm-6"> <button type="submit" class="btn btn-default"> Validez </button> </div> </div> </form> </div> </div> </div> @endsection
Dans le fichier app.blade.php, dans la navbar, ajouter le lien seulement pour les utilisateurs connectés
<li class="nav-item"> <a class="nav-link" href="{{ url("post_add") }}">Écrire article</a> </li>