68
Adventures in Laravel 5 Joe Ferguson February 4th 2015

Adventures in Laravel 5 SunshinePHP 2016 Tutorial

Embed Size (px)

Citation preview

Page 1: Adventures in Laravel 5 SunshinePHP 2016 Tutorial

Adventures in Laravel 5Joe Ferguson

February 4th 2015

Page 2: Adventures in Laravel 5 SunshinePHP 2016 Tutorial

Who Am I?Joe Ferguson

PHP Developer

Twitter: @JoePFerguson

Organizer of @MemphisPHP

@NomadPHP Lightning Talks

Passionate about Community

Page 3: Adventures in Laravel 5 SunshinePHP 2016 Tutorial

Before we begin

Have Virtualbox (virtualbox.org) Installed

Have VirtualBox Extension Pack Installed

Have Vagrant (vagrantup.com) Installed

run: vagrant box add laravel/homestead

Page 4: Adventures in Laravel 5 SunshinePHP 2016 Tutorial

New(ish) Toys in Laravel

Page 5: Adventures in Laravel 5 SunshinePHP 2016 Tutorial

New Directory Structure

Page 6: Adventures in Laravel 5 SunshinePHP 2016 Tutorial

Laravel 5 DirectoryApp directory now "Your Application" / "Entry point to app”

Laravel 4 Artisan Commands -> Console in App folder

Web stuff in Http

Controllers all have name space

filters.php -> Broken out into separate classes/files.

More focus on Service Providers -> Filter Service Providers

No more global.php -> Use service providers

Removed models directory. Can be just in app folder. PSR-4 default

Don't like the app namespace? artisan app:name MyApplication

Page 7: Adventures in Laravel 5 SunshinePHP 2016 Tutorial

Blade Changes

Laravel 4 uses {{ to echo and {{{ To echo escaped

Laravel 5 {{ and {{{ will echo escaped and {!! is used to echo raw

Biggest impact is likely form helpers: {!! Form::open() !!}

Page 8: Adventures in Laravel 5 SunshinePHP 2016 Tutorial

Commands

Commands (app/Commands) - Message containing only info needed to do something

Command Handler (app/Handlers/Commands) - Class that does something in response to a command

Command Bus - Allows dispatch of commands, matches commands to handlers

Self handling commands just need a handle() method on the command & implements SelfHandling

Page 9: Adventures in Laravel 5 SunshinePHP 2016 Tutorial

Events

Events (app/Events)

Events have handlers (similar to Commands)

Bind Events via app\Providers\EventServiceProvider.php

Events inform the system something happened VS demanding action from the system

Page 10: Adventures in Laravel 5 SunshinePHP 2016 Tutorial

Form RequestsSpecial class for validating and authorizing form submissions

Each class has rules() (returns array) and authorize() (returns boolean) methods

Benefit of rules & authorize being methods is you can perform logic

Type Hinting your forms to the Form Request will automatically validate your forms

If validation fails, errors will be available to the view and redirected back.

This happens because the FormRequestServiceProvider listens for anything being resolved is an instance of FormRequest and calls the validate method.

Page 11: Adventures in Laravel 5 SunshinePHP 2016 Tutorial

Helpersview() - Get a View instance for the given view path

action() - Generate a URL for a given controller action

app_path() - Get the fully qualified path to the app directory

asset() - Generate a URL for an asset.

Routing – get(), delete(), put()

Page 12: Adventures in Laravel 5 SunshinePHP 2016 Tutorial

Route Caching

artisan route:cache

Serializes your routes.php

Benefits: Faster routing

Drawback: Must run artisan route:clear on every routes.php change

Page 13: Adventures in Laravel 5 SunshinePHP 2016 Tutorial

MiddlewareImplements decorator pattern. request -> does work -> returns object to next layer

Laravel uses middleware for Encrypting/Decrypting cookies, Reading/Writing Sessions

artisan make:middleware MyMiddleware (app/Http/Middleware)

Middleware registered in app/Http/Kernel.php

Can run before or after the request has been processed.

Easiest example would be auth

Page 14: Adventures in Laravel 5 SunshinePHP 2016 Tutorial

Controller Method Injection

Can inject dependencies into methods, no longer via constructor

Purpose is to help developers write cleaner code

Page 15: Adventures in Laravel 5 SunshinePHP 2016 Tutorial

Changes to Illuminate Packages

Form or HTML helpers no longer in Core, must be pulled in via composer.

add "laravelcollective/html": "~5.0" to composer

update config/app.php

Page 16: Adventures in Laravel 5 SunshinePHP 2016 Tutorial

Elixir

API for defining basic Gulp tasks for your app.

Requires nodejs

Put your sass/less files in resources/assets/sass|less

Can trigger sass/less/phpunit/phpspec, combine stylesheets

Page 17: Adventures in Laravel 5 SunshinePHP 2016 Tutorial

Socialite

Easy to use social logins with oauth

Supports Facebook, Twitter, Google, Github, and Bitbucket

Page 18: Adventures in Laravel 5 SunshinePHP 2016 Tutorial

Contracts

Set of interfaces that define the core services provided by the framework

Depend on abstractions, not concrete dependencies.

Write code that doesn't have to be aware of the laravel framework

Page 19: Adventures in Laravel 5 SunshinePHP 2016 Tutorial

Implicit Route Model Binding

Laravel will automatically resolve type-hinted Eloquent model's defined in routes or controller actions whose variable names match a route segment name.

Laravel 5.2https://laravel.com/docs/5.2/routing#route-model-binding

Page 20: Adventures in Laravel 5 SunshinePHP 2016 Tutorial

API Rate LimitingLimit the amount of times a user can access your API with the Throttle middleware.

Laravel 5.2https://laracasts.com/series/whats-new-in-laravel-5-2/episodes/2

Will return HTTP Code 429 (Too many requests)

Page 21: Adventures in Laravel 5 SunshinePHP 2016 Tutorial

Auth & Password ResetsNew artisan command make:auth generates scaffolding for you.

Laravel 5.2https://laracasts.com/series/whats-new-in-laravel-5-2/episodes/3

Page 22: Adventures in Laravel 5 SunshinePHP 2016 Tutorial

Validating Arrays

Laravel 5.2https://laracasts.com/series/whats-new-in-laravel-5-2/episodes/4

Page 23: Adventures in Laravel 5 SunshinePHP 2016 Tutorial

Authentication Drivers

Laravel 5.2

Easily have different authentication drivers for multiple authenticatable models or user tables.

Useful to allow users from an admins table be able to log in as well as users from a users table.

Page 24: Adventures in Laravel 5 SunshinePHP 2016 Tutorial

Functional Testing Is Easy!

Page 25: Adventures in Laravel 5 SunshinePHP 2016 Tutorial

Upgrade from 4.2 to 5.xFresh install Laravel 5

Update Dependencies /Packages

Namespace (somewhat optional for now)

Migrate environment variables

Move routes to app/Http/routes.php

Move controllers to app/Http/Controllers (add this to classmap)

Copy route bindings to boot() in app/Providers/RouteServiceProvider.php

Add route facade to RouteServiceProvider.php to continue using Route facade

CSRF is now global. Use middleware to disable if needed

Move models to app/Models. Add app/Models to classmap in composer.json

Update your user auth to use Laravel 5’s auth system

Move commands to app/Console/Commands. Add app/Console/Commands to classmap in composer.json

Move migrations to database/migrations, Database Seeds to database/seeds

… and more!

Page 26: Adventures in Laravel 5 SunshinePHP 2016 Tutorial

Upgrade from 4.2 to 5.x

https://la

ravel.com

/docs/5.1

/upgrade

Fresh install Laravel 5

Update Dependencies /Packages

Namespace (somewhat optional for now)

Migrate environment variables

Move routes to app/Http/routes.php

Move controllers to app/Http/Controllers (add this to classmap)

Copy route bindings to boot() in app/Providers/RouteServiceProvider.php

Add route facade to RouteServiceProvider.php to continue using Route facade

CSRF is now global. Use middleware to disable if needed

Move models to app/Models. Add app/Models to classmap in composer.json

Update your user auth to use Laravel 5’s auth system

Move commands to app/Console/Commands. Add app/Console/Commands to classmap in composer.json

Move migrations to database/migrations, Database Seeds to database/seeds

… and more!

Page 27: Adventures in Laravel 5 SunshinePHP 2016 Tutorial

Quick note on versions

5.1 LTS bug fixes for 2 years, security fixes for 3 years

Non LTS: bug fixes for 6 months, security fixes for 1 year

5.1 is currently the only LTS version

Page 28: Adventures in Laravel 5 SunshinePHP 2016 Tutorial

Which version should you use?

5.2 for my own projects

5.1 for client projects

Page 29: Adventures in Laravel 5 SunshinePHP 2016 Tutorial

Homestead“Laravel Homestead is an official, pre-packaged

Vagrant "box" that provides you a wonderful development environment without requiring you

to install PHP, HHVM, a web server, and any other server software on your local machine. No more worrying about messing up your operating

system! Vagrant boxes are completely disposable. If something goes wrong, you can destroy and re-

create the box in minutes!”

Page 30: Adventures in Laravel 5 SunshinePHP 2016 Tutorial

What’s in the box:• Ubuntu 14.04• PHP 7.0• HHVM• Nginx• MySQL• Postgres• Redis

• NodeJS• Bower• Grunt• Gulp• Beanstalkd• Memcached• Laravel Envoy

Fabric + HipChat Extension + more!

Page 31: Adventures in Laravel 5 SunshinePHP 2016 Tutorial

Getting Homestead

Install the box:vagrant box add laravel/homestead

Page 32: Adventures in Laravel 5 SunshinePHP 2016 Tutorial

Getting Homestead

If you have PHP installed locally:composer global require "laravel/homestead=~2.0"

Make sure to place the ~/.composer/vendor/bin directory in your PATH so the homestead executable is found when you run the

homestead command in your terminal.

Page 33: Adventures in Laravel 5 SunshinePHP 2016 Tutorial

Homestead 2.x & 3.x

Significant change over previous 1.x versions

Uses homestead from your home folder

Less vagrant stuff in your projects (if you don’t like that sort of thing)

3.x will give you PHP 7

Page 34: Adventures in Laravel 5 SunshinePHP 2016 Tutorial

How I use Homestead

Page 35: Adventures in Laravel 5 SunshinePHP 2016 Tutorial

Install Homestead

http://laravel.com/docs/5.1/homestead#per-project-installation

Page 36: Adventures in Laravel 5 SunshinePHP 2016 Tutorial

Getting Started with Laravel

Page 37: Adventures in Laravel 5 SunshinePHP 2016 Tutorial

Database, Migrations, Seeding

database/

factories/ - Default Model Attributes

migrations/ - Version control for your DB Schema

seeds/ - Sample / Test Data for your DB

Page 38: Adventures in Laravel 5 SunshinePHP 2016 Tutorial

Database, Migrations, Seeding

Page 39: Adventures in Laravel 5 SunshinePHP 2016 Tutorial

Routing

app/

Http/

routes.php

Page 40: Adventures in Laravel 5 SunshinePHP 2016 Tutorial

Layouts

resources/

views/

layouts/

app.blade.php

Page 41: Adventures in Laravel 5 SunshinePHP 2016 Tutorial

Views

resources/

views/

tasks.blade.php

Page 42: Adventures in Laravel 5 SunshinePHP 2016 Tutorial

Time to do stuff!

Page 43: Adventures in Laravel 5 SunshinePHP 2016 Tutorial

Open Laravel-5.2-basic-quickstart

Page 44: Adventures in Laravel 5 SunshinePHP 2016 Tutorial

Basic Quick Start

https://laravel.com/docs/5.2/quickstart

If you already have Vagrant, Run:

`./vendor/bin/homestead make`

`vagrant up`

Run the migration: `php artisan migrate`

Page 45: Adventures in Laravel 5 SunshinePHP 2016 Tutorial

Viewing the Migration

Laravel-5.2-basic-quickstart/database/

migrations/2015_10_27_141258_create_tasks_table.php

Page 46: Adventures in Laravel 5 SunshinePHP 2016 Tutorial

Viewing the ModelLaravel-5.2-basic-quickstart/app/Task.php

Page 47: Adventures in Laravel 5 SunshinePHP 2016 Tutorial

Viewing the RoutesLaravel-5.2-basic-quickstart/app/Http/routes.php

Page 48: Adventures in Laravel 5 SunshinePHP 2016 Tutorial

Exercise 1 Hints

Add / edit migration to create users table

Add / edit User model

Add routes (just like task)

Add / edit User Views

You can safely disregard any authentication related to users

Page 49: Adventures in Laravel 5 SunshinePHP 2016 Tutorial

Exercise 1 Solution

To see a possible solution checkout the branch “exercise-1”

git checkout exercise-1

Page 50: Adventures in Laravel 5 SunshinePHP 2016 Tutorial

Exercise 2

Assign users to tasks as you create them

When listing tasks, show the user they have assigned them

When listing users, show how many tasks they have assigned them

You can safely disregard any authentication related to users

Page 51: Adventures in Laravel 5 SunshinePHP 2016 Tutorial

Exercise 2 Hints

Add / edit migration to create users table

Add / edit User model

Add routes (just like task)

Add / edit User Views

You can safely disregard any authentication related to users

Page 52: Adventures in Laravel 5 SunshinePHP 2016 Tutorial

Exercise 2 Solution

To see a possible solution checkout the branch “exercise-2”

git checkout exercise-2

Page 53: Adventures in Laravel 5 SunshinePHP 2016 Tutorial

Exercise 3

Write Tests for User Functionality

Write Tests for Task Functionality

Page 54: Adventures in Laravel 5 SunshinePHP 2016 Tutorial

Exercise 3 Hints

Use Model Factories to seed test data

Make sure the task is saved to the DB

Make sure the user is saved to the DB

Ensure the user delete request succeeds

Ensure the task delete request succeeds

Ensure the index page loads and contains data

You can safely disregard any authentication related to users

Page 55: Adventures in Laravel 5 SunshinePHP 2016 Tutorial

Exercise 3 Solution

To see a possible solution checkout the branch “exercise-3”

git checkout exercise-3

Page 56: Adventures in Laravel 5 SunshinePHP 2016 Tutorial

Easy Stuff Right?

Page 57: Adventures in Laravel 5 SunshinePHP 2016 Tutorial

Let’s clean up a bit

Page 58: Adventures in Laravel 5 SunshinePHP 2016 Tutorial

Exercise 4

Move “Create” Forms to own views

Move “Current” html to own views

Move Create/Delete User Functionality to Controller method

Move Create/Delete Task Functionality to Controller method

Page 59: Adventures in Laravel 5 SunshinePHP 2016 Tutorial

Exercise 4 Hints

Use `php artisan make:controller` to scaffold

Utilize your tests to make sure you didn’t break anything:

`./vendor/bin/phpunit`

You can safely disregard any authentication related to users

Page 60: Adventures in Laravel 5 SunshinePHP 2016 Tutorial

Using Laravel Facades

Using Static Methods:

`User::all()`

`User::find(1);

`User::where(‘user_id`, 1)->get()

`User::where(‘email’, ‘[email protected]’)->get();

Page 61: Adventures in Laravel 5 SunshinePHP 2016 Tutorial

Using Dependency Injection

Using Injected Object

`$this->user->all()`

`$this->user->find(1);

`$this->user->where(‘user_id`, 1)->get()

`$this->user->where(‘email’, ‘[email protected]’)->get();

Page 62: Adventures in Laravel 5 SunshinePHP 2016 Tutorial

Exercise 5

Update your controllers to inject your models instead of using static methods (Facades)

Page 63: Adventures in Laravel 5 SunshinePHP 2016 Tutorial

Exercise 5 Hints

Make sure you “use App\ModelName”

Utilize your tests to make sure you didn’t break anything:

`./vendor/bin/phpunit`

You can safely disregard any authentication related to users

Page 64: Adventures in Laravel 5 SunshinePHP 2016 Tutorial

Exercise 6

Implement index view for tasks

Implement index view for users

Implement edit functionality for tasks

Add tests for your new routes & methods

Page 65: Adventures in Laravel 5 SunshinePHP 2016 Tutorial

Exercise 6 Hints

Route Controller

Page 66: Adventures in Laravel 5 SunshinePHP 2016 Tutorial

Go forth and develop!

Page 67: Adventures in Laravel 5 SunshinePHP 2016 Tutorial

Feedback!

https://joind.in/talk/f8132

Joe FergusonTwitter: @JoePFergusonEmail: [email protected]: joepferguson

Contact Info:

Page 68: Adventures in Laravel 5 SunshinePHP 2016 Tutorial