Laravel: Yet another Framework
@lahaxe_arnaud 1
Présentation (1/3)
- Créé par Taylor Otwell
- En 2011
- Inspiré de Django, Ruby on rails, python, Symfony 2…
2
@taylorotwell
Trust me I'm an
engineer
Présentation (2/3)
- Composant Symfony 2 (13/28)
BrowserKit, Console, CssSelector, Debug, DomCrawler, EventDispatcher, Filesystem,
Finder,
HttpFoundation, HttpKernel, Process, PropertyAccess, Routing, Translation
- Les composants sont wrappés pour fournir une API simple et intuitive
3
Présentation (2/3)
- Le meilleur de PHP:
- Namespace
- Closure
- Méthodes magiques
- Interface
- Trait
- Respect des standards de la FIG
https://github.com/php-fig/fig-standards
4
Popularité
5V4V3 V5
Framework - IoC (1/4)
Inversion Of Control container
Le principe est de découpler les liens de dépendances entre objets. Ainsi les dépendances entre
composants logiciels ne sont plus exprimées dans le code de manière statique mais déterminées
dynamiquement à l'exécution.
Wikipedia
6
Framework - IoC (2/4)
7
class Car
{
public function start()
{
$engine = new Engine();
$engine->vroom();
}
}
$car = new Car();
$car->start();
Framework - IoC (3/4)
8
class Car
{
protected $engine;
public function __construct(Engine $engine)
{
$this->engine = $engine;
}
public function start()
{
$this->engine->vroom();
}
}
$car = App::make('Car');
$car->start();
Le container va par défaut lui-même créer et
injecter l’instance de Engine
Framework - IoC (4/4)
Ok et alors ?
9
App::bind('Engine', function () {
return new MockEngine();
});
Framework - Facade
10
Design Pattern Facade:
- Config
- Request
- Response
- Queue
- Cache
- ...
Basé sur l’IoC
Abstraction / l’implémentation
Migration (1/2)
class CreateUserTable extends Migration
{
public function up() {
Schema::create('users', function ($table) {
$table->increments('id');
$table->string('username');
$table->string('email')->unique();
$table->string('password');
$table->string('remember_token')
->nullable()->default(null);
$table->timestamps();
});
}
public function down() {
Schema::drop('users');
}
} 11
● Table schema versioning
● Migration rollback
● Compatible Mysql/Sqlite/PgSQL…
● Gestion des index, foreign key, cascade,
default…
Migration (2/2)
12
Eloquent
13
ORM
- Active record
- Gestion des relations hasMany, belongTo…
- Pagination
- Chunk
- Gestion lazy and eager loading
- Soft delete
- ...
class Beer extends Eloquent {
public function brand()
{
return $this->belongsTo('Brand');
}
}
$collection = Beer::where('alcohol', '>', 5)->take(10)->get();
$paginator = Beer::where('alcohol', '<', 10)->paginate();
$beer = Beer::with('brand')->find(1); // eager
$brand = Beer::find(1)->brand; // brand() return
Collection
$beer->name = "Unicorn";
$beer->save();
$beer->delete();
Cache
14
Les classiques get, put, flush…
Mais aussi des fonctionnalités plus
avancées:
- remember
- forever
- tags
- increment / decrement
Support natif de redis, memcached, apc,
fichiers et base de données
$value = Cache::remember('posts', $minutes, function()
{
return Post::all();
});
Cache::tags('people', 'authors')->put('John', $john, $minutes);
Cache::tags('authors')->flush();
Post::cacheTags('post')->remember(5)->where(['author_id' => 2]);
Queues
15
Diminution du temps de réponse
Api simple et unique
Plusieurs services en build-in:
- Beanstalkd
- Iron.ion
- Simple Amazon Queue
- Redis
Queue::push('SendEmail', array('message' => $message));
Queue::bulk(array('SendEmail', 'NotifyUser'), $payload);
Queue::later($date, 'SendEmail@send', array('message' => $message));
class SendEmail {
public function fire($job, $data)
{ /* … */ }
}
php artisan queue:work
php artisan queue:listen /* Works with supervisor */
Autres Goodies
16
Routeur RestFull et ressource
Events
Mails
Authentification
Configuration / environnement
Moteur de template (Blade)
Database migration
Facturation / paiement …
…
Whoops
17
filp/whoops
Supprimé dans Laravel 5
Laravel 5
18
● PSR 4
● Ajout des “Contacts”
● Middelware
● Amélioration de “l’injecteur” de dépendances
● Laravel Socialize
● Form Request
Laravel 5
19
● Annotations pour routage / middleware
○ désactivé par défaut
● Cache des routes
/**
* @Get("/")
*/
/**
* @Middleware("guest", except={"logout"})
*/
Laravel 5
20
● Suppression de certains composants purement web
● OAuth
● Less
Laravel 4 vs Laravel 5
21
● Contrôle simplifié des accès
● global.php moins fourre tout
● Formalisation de la validation des forms
● Handlers pour éviter la duplication de code
○ Bus
● Générateurs
Capitaliser le code
22
● Développement modulaire
● OpenSource ou non
● Installable via composer
"require": {
"lahaxearnaud/laravel-token": "~0.5",
...
},
Capitaliser le code
23
Un workbench peux contenir:
- des migrations
- des modèles
- des contrôleurs
- …
Mais surtout des tests
;(
Ressources utiles
24
● Ubuntu 14.04
● PHP 5.6
● HHVM
● Nginx
● MySQL
● Postgres
● Node (With Bower, Grunt, and Gulp)
● Redis
● Memcached
● Beanstalkd
● …
laravel/homestead
Ressources utiles
25
barryvdh/laravel-debugbar
Ressources utiles
26
laravelbook/ardent
class User extends LaravelBookArdentArdent {
public static $rules = array(
'name' => 'required|between:4,16',
'email' => 'required|email',
'password' =>
'required|alpha_num|between:4,8|confirmed',
'password_confirmation' => 'required|alpha_num|between:4,8',
);
}
Ressources utiles
27
Former::horizontal_open()
->id('MyForm')
->secure() // token CSRF
->populate($user)
->rules(User::$rules) // ardent rules
->method('POST');
Former::xlarge_text('name')
->class('myclass')
->value('Joseph');
Former::textarea('bio')
->rows(10)->columns(20)
->autofocus();
Former::actions()
->large_primary_submit('Submit')
->large_inverse_reset('Reset');
Former::close();
Anahkiasen/former
Ressources utiles
28
JeffreyWay/Laravel-4-Generators
Intégré dans Laravel 5
Ressources utiles
29
barryvdh/laravel-ide-helper
/**
* User
*
* @property integer $id
* @property string $username
* @property string $email
* @property string $password
* ...
* @property CarbonCarbon $updated_at
* @method static IlluminateDatabaseQueryBuilder|User whereId($value)
* ...
*/
Laravel Vs Symfony
30
http://systemsarchitect.net/
ab -c 20 -n 50 http://site.dev
Laravel 135.9 req/s
Symfony2 39.22 req/s
Laravel Vs Symfony
31
Laravel Vs Symfony
32
Symfony 2 Laravel 4
Phpmetrics
Laravel Vs Symfony
33
Laravel Symfony
Forge eZ Publish
Snappy Composer
October CMS Magento
Invoice Ninja Drupal
Conclusion
34
- Bâti sur de bonnes bases
- Bonne communauté
- Construit pour être testable
- Popularité grandissante
- Plus mature dans sa version 5
35
Questions
?>

[2015] Laravel yet another framework

  • 1.
    Laravel: Yet anotherFramework @lahaxe_arnaud 1
  • 2.
    Présentation (1/3) - Créépar Taylor Otwell - En 2011 - Inspiré de Django, Ruby on rails, python, Symfony 2… 2 @taylorotwell Trust me I'm an engineer
  • 3.
    Présentation (2/3) - ComposantSymfony 2 (13/28) BrowserKit, Console, CssSelector, Debug, DomCrawler, EventDispatcher, Filesystem, Finder, HttpFoundation, HttpKernel, Process, PropertyAccess, Routing, Translation - Les composants sont wrappés pour fournir une API simple et intuitive 3
  • 4.
    Présentation (2/3) - Lemeilleur de PHP: - Namespace - Closure - Méthodes magiques - Interface - Trait - Respect des standards de la FIG https://github.com/php-fig/fig-standards 4
  • 5.
  • 6.
    Framework - IoC(1/4) Inversion Of Control container Le principe est de découpler les liens de dépendances entre objets. Ainsi les dépendances entre composants logiciels ne sont plus exprimées dans le code de manière statique mais déterminées dynamiquement à l'exécution. Wikipedia 6
  • 7.
    Framework - IoC(2/4) 7 class Car { public function start() { $engine = new Engine(); $engine->vroom(); } } $car = new Car(); $car->start();
  • 8.
    Framework - IoC(3/4) 8 class Car { protected $engine; public function __construct(Engine $engine) { $this->engine = $engine; } public function start() { $this->engine->vroom(); } } $car = App::make('Car'); $car->start(); Le container va par défaut lui-même créer et injecter l’instance de Engine
  • 9.
    Framework - IoC(4/4) Ok et alors ? 9 App::bind('Engine', function () { return new MockEngine(); });
  • 10.
    Framework - Facade 10 DesignPattern Facade: - Config - Request - Response - Queue - Cache - ... Basé sur l’IoC Abstraction / l’implémentation
  • 11.
    Migration (1/2) class CreateUserTableextends Migration { public function up() { Schema::create('users', function ($table) { $table->increments('id'); $table->string('username'); $table->string('email')->unique(); $table->string('password'); $table->string('remember_token') ->nullable()->default(null); $table->timestamps(); }); } public function down() { Schema::drop('users'); } } 11 ● Table schema versioning ● Migration rollback ● Compatible Mysql/Sqlite/PgSQL… ● Gestion des index, foreign key, cascade, default…
  • 12.
  • 13.
    Eloquent 13 ORM - Active record -Gestion des relations hasMany, belongTo… - Pagination - Chunk - Gestion lazy and eager loading - Soft delete - ... class Beer extends Eloquent { public function brand() { return $this->belongsTo('Brand'); } } $collection = Beer::where('alcohol', '>', 5)->take(10)->get(); $paginator = Beer::where('alcohol', '<', 10)->paginate(); $beer = Beer::with('brand')->find(1); // eager $brand = Beer::find(1)->brand; // brand() return Collection $beer->name = "Unicorn"; $beer->save(); $beer->delete();
  • 14.
    Cache 14 Les classiques get,put, flush… Mais aussi des fonctionnalités plus avancées: - remember - forever - tags - increment / decrement Support natif de redis, memcached, apc, fichiers et base de données $value = Cache::remember('posts', $minutes, function() { return Post::all(); }); Cache::tags('people', 'authors')->put('John', $john, $minutes); Cache::tags('authors')->flush(); Post::cacheTags('post')->remember(5)->where(['author_id' => 2]);
  • 15.
    Queues 15 Diminution du tempsde réponse Api simple et unique Plusieurs services en build-in: - Beanstalkd - Iron.ion - Simple Amazon Queue - Redis Queue::push('SendEmail', array('message' => $message)); Queue::bulk(array('SendEmail', 'NotifyUser'), $payload); Queue::later($date, 'SendEmail@send', array('message' => $message)); class SendEmail { public function fire($job, $data) { /* … */ } } php artisan queue:work php artisan queue:listen /* Works with supervisor */
  • 16.
    Autres Goodies 16 Routeur RestFullet ressource Events Mails Authentification Configuration / environnement Moteur de template (Blade) Database migration Facturation / paiement … …
  • 17.
  • 18.
    Laravel 5 18 ● PSR4 ● Ajout des “Contacts” ● Middelware ● Amélioration de “l’injecteur” de dépendances ● Laravel Socialize ● Form Request
  • 19.
    Laravel 5 19 ● Annotationspour routage / middleware ○ désactivé par défaut ● Cache des routes /** * @Get("/") */ /** * @Middleware("guest", except={"logout"}) */
  • 20.
    Laravel 5 20 ● Suppressionde certains composants purement web ● OAuth ● Less
  • 21.
    Laravel 4 vsLaravel 5 21 ● Contrôle simplifié des accès ● global.php moins fourre tout ● Formalisation de la validation des forms ● Handlers pour éviter la duplication de code ○ Bus ● Générateurs
  • 22.
    Capitaliser le code 22 ●Développement modulaire ● OpenSource ou non ● Installable via composer "require": { "lahaxearnaud/laravel-token": "~0.5", ... },
  • 23.
    Capitaliser le code 23 Unworkbench peux contenir: - des migrations - des modèles - des contrôleurs - … Mais surtout des tests ;(
  • 24.
    Ressources utiles 24 ● Ubuntu14.04 ● PHP 5.6 ● HHVM ● Nginx ● MySQL ● Postgres ● Node (With Bower, Grunt, and Gulp) ● Redis ● Memcached ● Beanstalkd ● … laravel/homestead
  • 25.
  • 26.
    Ressources utiles 26 laravelbook/ardent class Userextends LaravelBookArdentArdent { public static $rules = array( 'name' => 'required|between:4,16', 'email' => 'required|email', 'password' => 'required|alpha_num|between:4,8|confirmed', 'password_confirmation' => 'required|alpha_num|between:4,8', ); }
  • 27.
    Ressources utiles 27 Former::horizontal_open() ->id('MyForm') ->secure() //token CSRF ->populate($user) ->rules(User::$rules) // ardent rules ->method('POST'); Former::xlarge_text('name') ->class('myclass') ->value('Joseph'); Former::textarea('bio') ->rows(10)->columns(20) ->autofocus(); Former::actions() ->large_primary_submit('Submit') ->large_inverse_reset('Reset'); Former::close(); Anahkiasen/former
  • 28.
  • 29.
    Ressources utiles 29 barryvdh/laravel-ide-helper /** * User * *@property integer $id * @property string $username * @property string $email * @property string $password * ... * @property CarbonCarbon $updated_at * @method static IlluminateDatabaseQueryBuilder|User whereId($value) * ... */
  • 30.
    Laravel Vs Symfony 30 http://systemsarchitect.net/ ab-c 20 -n 50 http://site.dev Laravel 135.9 req/s Symfony2 39.22 req/s
  • 31.
  • 32.
    Laravel Vs Symfony 32 Symfony2 Laravel 4 Phpmetrics
  • 33.
    Laravel Vs Symfony 33 LaravelSymfony Forge eZ Publish Snappy Composer October CMS Magento Invoice Ninja Drupal
  • 34.
    Conclusion 34 - Bâti surde bonnes bases - Bonne communauté - Construit pour être testable - Popularité grandissante - Plus mature dans sa version 5
  • 35.