Laravel yet another framework

2 986 vues

Publié le

Découverte de l'environnement de la philosophie et du fonctionnement de Laravel. Pourquoi un tel succès ?
Présentation de différents composant Open Source qui permettent de débuter rapidement un projet Laravel.

Cette présentation fait partie d'une suite de présentations technologiques appelée "Symposium" chez Versusmind. Toutes les présentations sont disponibles sur http://versusmind.eu.

Publié dans : Internet
  • Soyez le premier à commenter

Laravel yet another framework

  1. 1. Laravel: Yet another Framework @lahaxe_arnaud 1
  2. 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. 3. 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
  4. 4. 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
  5. 5. Popularité 5V4V3 V5
  6. 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. 7. Framework - IoC (2/4) 7 class Car { public function start() { $engine = new Engine(); $engine->vroom(); } } $car = new Car(); $car->start();
  8. 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. 9. Framework - IoC (4/4) Ok et alors ? 9 App::bind('Engine', function () { return new MockEngine(); });
  10. 10. Framework - Facade 10 Design Pattern Facade: - Config - Request - Response - Queue - Cache - ... Basé sur l’IoC Abstraction / l’implémentation
  11. 11. 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…
  12. 12. Migration (2/2) 12
  13. 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. 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. 15. 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 */
  16. 16. Autres Goodies 16 Routeur RestFull et ressource Events Mails Authentification Configuration / environnement Moteur de template (Blade) Database migration Facturation / paiement … …
  17. 17. Whoops 17 filp/whoops Supprimé dans Laravel 5
  18. 18. Laravel 5 18 ● PSR 4 ● Ajout des “Contacts” ● Middelware ● Amélioration de “l’injecteur” de dépendances ● Laravel Socialize ● Form Request
  19. 19. Laravel 5 19 ● Annotations pour routage / middleware ○ désactivé par défaut ● Cache des routes /** * @Get("/") */ /** * @Middleware("guest", except={"logout"}) */
  20. 20. Laravel 5 20 ● Suppression de certains composants purement web ● OAuth ● Less
  21. 21. 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
  22. 22. Capitaliser le code 22 ● Développement modulaire ● OpenSource ou non ● Installable via composer "require": { "lahaxearnaud/laravel-token": "~0.5", ... },
  23. 23. Capitaliser le code 23 Un workbench peux contenir: - des migrations - des modèles - des contrôleurs - … Mais surtout des tests ;(
  24. 24. Ressources utiles 24 ● Ubuntu 14.04 ● PHP 5.6 ● HHVM ● Nginx ● MySQL ● Postgres ● Node (With Bower, Grunt, and Gulp) ● Redis ● Memcached ● Beanstalkd ● … laravel/homestead
  25. 25. Ressources utiles 25 barryvdh/laravel-debugbar
  26. 26. 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', ); }
  27. 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. 28. Ressources utiles 28 JeffreyWay/Laravel-4-Generators Intégré dans Laravel 5
  29. 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. 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. 31. Laravel Vs Symfony 31
  32. 32. Laravel Vs Symfony 32 Symfony 2 Laravel 4 Phpmetrics
  33. 33. Laravel Vs Symfony 33 Laravel Symfony Forge eZ Publish Snappy Composer October CMS Magento Invoice Ninja Drupal
  34. 34. Conclusion 34 - Bâti sur de bonnes bases - Bonne communauté - Construit pour être testable - Popularité grandissante - Plus mature dans sa version 5
  35. 35. 35 Questions ?>

×