Laravel

A propos

  • Développé par Taylor Otwell en 2011 
  • Première LTS (5.1 en 2015)
  • Privilégie la simplicité du code
  • Framework "tout en un"
    • Laravel Lumen pour une version micro

Injection de dépendance

<?php

namespace App\Http\Controllers;

use App\Users\Repository as UserRepository;

class UserController extends Controller
{
    /**
     * The user repository instance.
     */
    protected $users;

    /**
     * Create a new controller instance.
     *
     * @param  UserRepository  $users
     * @return void
     */
    public function __construct(UserRepository $users)
    {
        $this->users = $users;
    }

    /**
     * Show the user with the given ID.
     *
     * @param  int  $id
     * @return Response
     */
    public function show($id)
    {
        //
    }
}

Service Container

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class MyServiceProvider extends ServiceProvider
{
    /**
     * Register bindings in the container.
     *
     * @return void
     */
    public function register()
    {
        $this->app->singleton(Connection::class, function ($app) {
            return new Connection('API_KEY'));
        });
    }
}

L'enregistrement des dépendances se fait au travers de ServiceProvider

Base de données

Eloquent ORM, utilisé par laravel est interne au framework et se nomme.

 

Il est basé sur le pattern Active Record. Il y a pas de séparation entre model et repository (par défaut).

<?php
$post = new Post();
$post->name = "Mon article";
$post->save();
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Post extends Model
{

    protected $fillable = ['name'];

    public function category()
    {
        return $this->belongsTo('App\Category')
    }

    public function tags()
    {
        return $this->belongsToMany('App\Role');
    }

    public function scopeActive($query)
    {
        return $query->where('online', 1);
    }

}
<?php
// Query builder
$posts = App\Post::where('online', 1)
               ->orderBy('created_at', 'desc')
               ->take(10)
               ->get();

// Manipulation
$post = $posts[0];
$post->online = false;
$post->save();

// Relations
$comment = new App\Comment(['message' => 'A new comment.']);
$post->comments()->save($comment);

// Suppression
$post->delete();

<html>
    <head>
        <title>Mon app - @yield('title')</title>
    </head>
    <body>
        @section('sidebar')
            La sidebar principale
        @show

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

Templating : Blade


@extends('layouts.app')

@section('title', 'Titre de la page')

@section('sidebar')
    @parent

    <p>Le contenu de la sidebar</p>
@endsection

@section('content')
    <h2>Liste des utilisateurs</h2>
    @forelse ($users as $user)
        <a href="{{ route('user', $user->id) }}">{{ $user->name }}</a>
    @empty
        <div>Aucun utilisateur</div>
    @endforelse
@endsection

Formulaire

Laravel n'intègre aucun système pour "représenter" les formulaire

Validation

<?php
$validator = Validator::make($request->all(), [
    'title' => 'required|unique:posts|max:255',
    'body' => ['required', new Uppercase()],
]);

if ($validator->fails()) {
    return redirect('post/create')
                ->withErrors($validator)
                ->withInput();
}

La validation peut se faire manuellement pour traiter les données.

<?php

// Côté controller
public function store(StoreBlogPost $request)
{
    $validated = $request->validated();
}

La validation peut se faire automatiquement gràce au type-hinting et à un objet Request spécifique

<?php

// Dans le StoreBlogPost.php
public function rules()
{
    return [
        'title' => 'required|unique:posts|max:255',
        'body' => 'required',
    ];
}

Module tiers

{
    "extra": {
        "laravel": {
            "providers": [
                "Barryvdh\\Cors\\ServiceProvider"
            ]
        }
}

Laravel peut être étendu grâce à l'ajout de ServiceProvider qui sont exécutés au démarrage de l'application.

Cet ajout peut se faire automatiquement via une information dans le composer.json

Laravel

By Jonathan Boyer

Laravel

  • 940