MidwestPHP 2016 - Adventures in Laravel 5

Preview:

Citation preview

Adventures in Laravel 5

https://joind.in/talk/d0f4a

Joe Ferguson

https://github.com/svpernova09/quickstart-basic

Want to follow along?

Who Am I?

Joe Ferguson

PHP Developer

Twitter: @JoePFerguson

Organizer of @MemphisPHP

@NomadPHP Lightning Talks

PHP FIG Secretary

Passionate about Community

Getting Started with Laravel

https://github.com/svpernova09/quickstart-basic

Want to follow along?

Database, Migrations, Seeding

database/

factories/ - Default Model Attributes

migrations/ - Version control for your DB Schema

seeds/ - Sample / Test Data for your DB

Database, Migrations, Seeding

Routing

app/

Http/

routes.php

Layouts

resources/

views/

layouts/

app.blade.php

Views

resources/

views/

tasks.blade.php

Open Laravel-5.2-basic-quickstart

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`

Viewing the Migration

Laravel-5.2-basic-quickstart/database/

migrations/2015_10_27_141258_create_tasks_table.php

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

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

Exercise 1

Add / edit migration to create tasks table

Add / edit Task model

Add routes (just like task)

Add / edit Views

You can safely disregard any authentication related to users

Exercise 1 Task Migration

Exercise 1 Task Model

Exercise 1 Task Create Route

Exercise 1 Task Delete Route

Exercise 1 Task View

Exercise 1 Task Create View

Exercise 2

Assign users to tasks as you create tasks

When listing tasks, show the user they have assigned them

When listing users, show how many tasks they have assigned to that user

You can safely disregard any authentication related to users

Exercise 2 Task Migration

Exercise 2 Model Relationships

Task Model

User Model

Exercise 2 Show Assigned User

Exercise 2 Count User’s Tasks

Exercise 3

Write Tests for User Functionality

Write Tests for Task Functionality

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

Exercise 3 ModelFactory

Exercise 3Make sure the task is saved to the DB

Exercise 3Make sure the user is saved to the DB

Exercise 3Ensure the user delete request succeeds

Exercise 3Ensure the task delete request succeeds

Exercise 3Ensure the index page loads

Exercise 3Ensure the index page contains data

Easy Stuff Right?

Let’s clean up a bit

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

Exercise 4Move “Create” Forms to own views

Exercise 4Move “Current” html to own views

Exercise 4Move Create/Delete User Functionality to Controller method

Exercise 4Move Create/Delete Task Functionality to Controller method

Using Laravel Facades

Using Static Methods:

`User::all()`

`User::find(1);

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

`User::where(‘email’, ‘joe@joeferguson.me’)->get();

Using Dependency Injection

Using Injected Object

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

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

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

`$this->user->where(‘email’, ‘joe@joeferguson.me’)->get();

Exercise 5

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

Exercise 5Using Static

Dependency Injection

Exercise 6

Implement index view for tasks

Implement index view for users

Implement edit functionality for tasks

Add tests for your new routes & methods

Exercise 6Implement index view for users

Route Controller

Exercise 6Implement index view for tasks

Route Controller

Exercise 6Implement edit functionality for tasks

Route Controller

Exercise 6Handle Edit Form

Route Controller

What’s “TaskStoreRequest”?

Laravel Form Request

Whirlwind tour on Laravel

New(ish*) Toys in Laravel

*Since 4.2

New Directory Structure

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

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() !!}

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

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

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.

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()

Route Caching

artisan route:cache

Serializes your routes.php

Benefits: Faster routing

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

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

Controller Method Injection

Can inject dependencies into methods, no longer via constructor

Purpose is to help developers write cleaner code

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

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

Socialite

Easy to use social logins with oauth

Supports Facebook, Twitter, Google, Github, and Bitbucket

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

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

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)

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

Validating Arrays

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

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.

Functional Testing Is Easy!

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!

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!

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

Which version should you use?

5.2 for my own projects

5.1 for client projects

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!”

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!

Getting Homestead

Install the box:vagrant box add laravel/homestead

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.

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

How I use Homestead

Install Homestead

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

Go forth and develop!

Feedback!

https://joind.in/talk/f8132

Joe FergusonTwitter: @JoePFergusonEmail: joe@joeferguson.meFreenode: joepferguson

Contact Info: