all aboard for laravel 5.1

64
All Aboard for Laravel 5.1 Jason McCreary "JMac" @gonedark

Upload: jason-mccreary

Post on 12-Apr-2017

2.237 views

Category:

Internet


2 download

TRANSCRIPT

All Aboard for Laravel 5.1Jason McCreary "JMac" @gonedark

All Aboard for Laravel 5.1 - Jason McCreary - php[world] 2015

A short rant about frameworksChoose wisely and code carefully

2

All Aboard for Laravel 5.1 - Jason McCreary - php[world] 2015

Talk the Talk

1. What’s New in Laravel 5.02. Upgrading from Laravel 4.23. What’s New in Laravel 5.14. What’s coming in Laravel 5.2

3

All Aboard for Laravel 5.1 - Jason McCreary - php[world] 2015

The Goal

“To get you familiar with the new features in Laravel so you are comfortable upgrading your projects to 5.1”

4

All Aboard for Laravel 5.1 - Jason McCreary - php[world] 2015

Why Upgrade?

“Laravel 5.1 is the first release of Laravel to receive long term support. Laravel 5.1 will receive bug fixes for 2 years and security fixes for 3 years. This support window is the largest ever provided for Laravel and provides stability and peace of mind for larger, enterprise clients and customers.”

5

All Aboard for Laravel 5.1 - Jason McCreary - php[world] 2015

What’s New…In Laravel 5.0

6

All Aboard for Laravel 5.1 - Jason McCreary - php[world] 2015

New Folder Structure

• Follows PSR-4 naming conventions• App namespacing• Models live in the default namespace

• Everything related to HTTP lives under Http/ (controllers, middleware, requests)

• Views live outside the App namespace within resources/.

7

All Aboard for Laravel 5.1 - Jason McCreary - php[world] 2015

Folder Structure

8

4.2 5.0

All Aboard for Laravel 5.1 - Jason McCreary - php[world] 2015

App Folder

9

4.2 5.0

All Aboard for Laravel 5.1 - Jason McCreary - php[world] 2015

Namespacing

<?php namespace App; // ...

class User extends Model { // ... }

10

All Aboard for Laravel 5.1 - Jason McCreary - php[world] 2015

Namespacing

<?php namespace App\Http\Controllers; class HomeController extends Controller {

public function index() { return view('home'); } }

11

All Aboard for Laravel 5.1 - Jason McCreary - php[world] 2015

Namespacing"autoload": { "classmap": [ "app/commands", "app/controllers", "app/models", "app/database/migrations", "app/database/seeds", "app/tests/TestCase.php" ] },

12

"autoload": { "classmap": [ "database" ], "psr-4": { "App\\": "app/" } },

4.2 5.0

All Aboard for Laravel 5.1 - Jason McCreary - php[world] 2015

New Objects

• Events are now objects, not strings!• Command objects allow simpler job processing• Requests are now objects• Middleware objects to replace Filters

13

All Aboard for Laravel 5.1 - Jason McCreary - php[world] 2015

Middleware

“HTTP middleware provide a convenient mechanism for filtering HTTP requests entering your application.”

14

All Aboard for Laravel 5.1 - Jason McCreary - php[world] 2015

Middleware

<?php namespace App\Http\Controllers; class HomeController extends Controller { public function __construct() { $this->middleware('auth'); }

// ... }

15

All Aboard for Laravel 5.1 - Jason McCreary - php[world] 2015

Middleware<?php namespace App\Http\Middleware;

use Closure;

class TimeoutMiddleware {

public function handle($request, Closure $next) {

if (abs(time() - $request->input(‘ttl’)) > 300) {

return redirect('timeout');

}

return $next($request);

}

}

16

All Aboard for Laravel 5.1 - Jason McCreary - php[world] 2015

Form Request Objects

“A simple way to customize request validation automatically.”

17

All Aboard for Laravel 5.1 - Jason McCreary - php[world] 2015

Form Request Objects<?php namespace App\Http\Requests;

class RegisterRequest extends FormRequest {

public function rules() {

return [

'email' => 'required|email|unique:users',

'password' => 'required|confirmed|min:8'

];

}

}

18

All Aboard for Laravel 5.1 - Jason McCreary - php[world] 2015

Controller Method Injection

“In addition to constructor injection, you may now type-hint dependencies on controller methods. These objects will be resolved and available along with any route parameters.”

19

All Aboard for Laravel 5.1 - Jason McCreary - php[world] 2015

Controller Method Injection

public function register(

RegisterRequest $request,

RegistrationRepository $registration)

{

// ...

}

20

All Aboard for Laravel 5.1 - Jason McCreary - php[world] 2015

Controller Validation

"If FormRequests are a little too much, the Laravel 5 base controller now includes a ValidatesRequests trait. This trait provides a simple validate() method to validate incoming requests."

21

All Aboard for Laravel 5.1 - Jason McCreary - php[world] 2015

Controller Validation

public function register(Request $request)

{

$this->validate($request, [

'email' => 'required|email|unique:users',

'password' => 'required|confirmed|min:8'

]);

}

22

All Aboard for Laravel 5.1 - Jason McCreary - php[world] 2015

Environment Configuration

“Laravel 5 uses the DotEnv library to condense all configuration values into a single .env file. These values get loaded into $_ENV and available through the env() helper method.”

23

All Aboard for Laravel 5.1 - Jason McCreary - php[world] 2015

Environment ConfigurationAPP_ENV=local APP_DEBUG=true APP_KEY=SomeRandomString DB_HOST=localhost DB_DATABASE=homestead DB_USERNAME=homestead DB_PASSWORD=secret CACHE_DRIVER=file SESSION_DRIVER=file

24

<?php

return array(

'APP_KEY' => 'secretkey',

);

4.2 5.0

All Aboard for Laravel 5.1 - Jason McCreary - php[world] 2015

Environment Configuration

25

<?php return [ 'debug' => env('APP_DEBUG'),

// ... 'key' => env('APP_KEY', 'SomeRandomString'), // ...];

All Aboard for Laravel 5.1 - Jason McCreary - php[world] 2015

Artisan Updates

• Now includes several make commands to generate common objects

• tinker is now backed by Psysh for a more powerful REPL

• route commands for listing and caching routes

26

All Aboard for Laravel 5.1 - Jason McCreary - php[world] 2015

Authentication

“User registration, authentication, and password reset controllers are now included out of the box, as well as simple corresponding views.”

27

All Aboard for Laravel 5.1 - Jason McCreary - php[world] 2015

User Model (4.2)<?php use Illuminate\Auth\UserTrait; use Illuminate\Auth\UserInterface; use Illuminate\Auth\Reminders\RemindableTrait; use Illuminate\Auth\Reminders\RemindableInterface;class User extends Eloquent implements UserInterface, RemindableInterface { use UserTrait, RemindableTrait; protected $table = 'users'; protected $hidden = array('password', 'remember_token');}

28

All Aboard for Laravel 5.1 - Jason McCreary - php[world] 2015

User Model (5.0)<?php namespace App; use Illuminate\Auth\Authenticatable; use Illuminate\Database\Eloquent\Model; use Illuminate\Auth\Passwords\CanResetPassword;use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract;use Illuminate\Contracts\Auth\CanResetPassword as CanResetPasswordContract; class User extends Model implements AuthenticatableContract, CanResetPasswordContract { use Authenticatable, CanResetPassword; protected $table = 'users'; protected $fillable = ['name', 'email', 'password']; protected $hidden = ['password', 'remember_token'];}

29

All Aboard for Laravel 5.1 - Jason McCreary - php[world] 2015

Blade

“By default, Laravel 5.0 escapes all output from both the {{ }} and {{{ }}} Blade directives. A new {!! !!} directive has been introduced to display raw, unescaped output.”

30

All Aboard for Laravel 5.1 - Jason McCreary - php[world] 2015

Libraries and Packages

• Laravel Elixir - asset management• Laravel Socialite - authentication with Oauth services• Flysystem - filesystem abstraction library• Laravel Scheduler - command manager

31

All Aboard for Laravel 5.1 - Jason McCreary - php[world] 2015

Upgrading LaravelFrom 4.2 to 5.0

32

All Aboard for Laravel 5.1 - Jason McCreary - php[world] 2015

Two Approaches

• “New move-in”• “Update in-place”

33

All Aboard for Laravel 5.1 - Jason McCreary - php[world] 2015

What to do?

“As always, it depends. However, the documentation recommends migrating your 4.2 app to a new Laravel 5 app. So, new move-in it is.”

34

All Aboard for Laravel 5.1 - Jason McCreary - php[world] 2015

Basic Steps1. Create a new Laravel 5 app2. Migrate configuration3. Move app files4. Add namespacing5. Review Bindings6. Miscellaneous changes7. Blade Tag changes8. Update dependencies9. Cross fingers

35

All Aboard for Laravel 5.1 - Jason McCreary - php[world] 2015

Do not pass 5.0!

“Going directly to 5.1 will make the migration more complicated as there are significant changes between 5.0 and 5.1. Do not pass 5.0. Otherwise you will not collect $200 and you will go to jail.”

36

All Aboard for Laravel 5.1 - Jason McCreary - php[world] 2015

Create new Laravel 5 app

composer create-project laravel/laravel --prefer-dist

37

All Aboard for Laravel 5.1 - Jason McCreary - php[world] 2015

Create new Laravel 5 app

composer global require “laravel/installer=~1.1”

laravel new project-name

38

All Aboard for Laravel 5.1 - Jason McCreary - php[world] 2015

Migrate Configuration

1. Copy configuration from your 4.2 app’s env.php to .env

2. Compare configurations from your 4.2 app’s config/

3. Recreate environment configurations from your 4.2 app’s config/env/ to.env

4. Update environment configurations to use env()

39

All Aboard for Laravel 5.1 - Jason McCreary - php[world] 2015

Migrate Configuration

“Be sure to leave .env.example file in your project. It should contain placeholder values that will make it easy for other developers to copy and configure for their environment.”

40

All Aboard for Laravel 5.1 - Jason McCreary - php[world] 2015

Migrate Configuration

“When managing multiple environments, you may find it easiest to create several .env files and symlink the .env within each environment.”

41

All Aboard for Laravel 5.1 - Jason McCreary - php[world] 2015

Move Files

42

4.2 5.0

All Aboard for Laravel 5.1 - Jason McCreary - php[world] 2015

Move Files

• routes.php to app/Http/routes.php

• app/views to resources/views

• app/database to database/

43

All Aboard for Laravel 5.1 - Jason McCreary - php[world] 2015

Add namespace

“You do not need to do this. You can keep everything in the global namespace and add the paths to the classmap just as in Laravel 4.2. However, not doing so carries over technical debt as your project will not truly follow Laravel 5.0’s configuration.”

44

All Aboard for Laravel 5.1 - Jason McCreary - php[world] 2015

Add namespace

<?php namespace App\Http\Controllers; class YourController extends Controller {

// ... }

45

All Aboard for Laravel 5.1 - Jason McCreary - php[world] 2015

Add namespace

<?php namespace App; class YourModel extends Eloquent {

// ... }

46

All Aboard for Laravel 5.1 - Jason McCreary - php[world] 2015

Review Bindings

"Move any service container bindings from start/global.php to the register method of the app/Providers/AppServiceProvider.php file."

47

All Aboard for Laravel 5.1 - Jason McCreary - php[world] 2015

Miscellaneous Changes

•SoftDeletingTrait is now SoftDeletes•User Authentication changes•Pagination method changes

•Oh yeah, and the Form and Html Facades are gone.

48

All Aboard for Laravel 5.1 - Jason McCreary - php[world] 2015

Blade Changes1. Cry2. Bargain3. Face reality4. Start changing every {{ }} to {!! !!}

5. Remove all blade comment tags {{-- --}} (you should have known better)

6. Smile

49

All Aboard for Laravel 5.1 - Jason McCreary - php[world] 2015

Update your dependencies

"Review your dependencies then run composer update"

50

All Aboard for Laravel 5.1 - Jason McCreary - php[world] 2015

Cross fingers

51

All Aboard for Laravel 5.1 - Jason McCreary - php[world] 201552

All Aboard for Laravel 5.1 - Jason McCreary - php[world] 2015

Questions…Ask now! Cause we’re moving to 5.1

53

All Aboard for Laravel 5.1 - Jason McCreary - php[world] 2015

What’s New…In Laravel 5.1

54

All Aboard for Laravel 5.1 - Jason McCreary - php[world] 2015

Project Updates

• Long Term Support• Requires PHP > 5.5.9• Follows PSR-2• Updated Documentation• Uses openssl for encryption, instead of mcrypt

55

All Aboard for Laravel 5.1 - Jason McCreary - php[world] 2015

App Folder

56

5.0 5.1

All Aboard for Laravel 5.1 - Jason McCreary - php[world] 2015

Event Broadcasting

"makes it easy to broadcast your events over a websocket connection."

57

All Aboard for Laravel 5.1 - Jason McCreary - php[world] 2015

Middleware Parameters<?php namespace App\Http\Middleware;

use Closure;

class RoleMiddleware {

public function handle($request, Closure $next, $role) {

if (!$request->user()->hasRole($role)) {

// Redirect...

}

return $next($request);

}

}

58

All Aboard for Laravel 5.1 - Jason McCreary - php[world] 2015

Middleware Parameters

Route::put(

‘post/{id}',

['middleware' => 'role:editor', function ($id) {

// ...

}]

);

59

All Aboard for Laravel 5.1 - Jason McCreary - php[world] 2015

Focus on Testing

• Stronger integration testing• Model factories

60

All Aboard for Laravel 5.1 - Jason McCreary - php[world] 2015

What’s Coming…In Laravel 5.2

61

All Aboard for Laravel 5.1 - Jason McCreary - php[world] 2015

Laravel 5.2

• Coming December 2015• Route filters have been deprecated in preference of middleware.

• *_fetch methods deprecated in favor of *_pluck

62

All Aboard for Laravel 5.1 - Jason McCreary - php[world] 2015

Resources

• What’s new in Laravel 5 Laracasts• Laravel Official Upgrade Guide• Laravel In-Place Upgrade Guide• What’s new in Laravel 5.1 Laracasts

63

All Aboard for Laravel 5.1 - Jason McCreary - php[world] 2015

Questions…@gonedark on Twitter

64