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
- 1,023