
Quickstart - Introdução ao Framework
Lucas Macedo

@luuckymacedo
github.com/lucassmacedo
Back-End Developer


ADS Unicesumar

O QUE É?
O Laravel é um framework em PHP baseado no conceito de RAD (Rapid Application Development)
Desenvolvido por Taylor Otwell.
Possui código aberto e uma comunidade ativa.
Utiliza o composer, fornecendo todo o poder das demais bibliotecas escritas para PHP.

Server Requirements
- PHP >= 7.1.3
- OpenSSL PHP Extension
- PDO PHP Extension
- Mbstring PHP Extension
- Tokenizer PHP Extension
- XML PHP Extension
- Ctype PHP Extension
- JSON PHP Extension
Instalação
composer global require "laravel/installer"
laravel new my-app
composer create-project --prefer-dist laravel/laravel blog
php artisan serve
Estrutura
app/
artisan.php
bootstrap/
composer.json
composer.lock
config/
database/
package.json
phpunit.xml
public/
resources/
routes/
server.php
storage/
tests/
vendor/
webpack.mix.js
Lifecycle
O ponto de entrada de todas as requisições para um aplicativo em Laravel é o arquivo public/index.php.
O arquivo index.php carrega o arquivo de autoload gerado pelo Composer, e em seguida, recupera uma instância da aplicação Laravel em bootstrap/app.php
Kernels: HTTP, Console, Handlers
Service Providers
Service providers são responsáveis pela inicialização de vários componentes do Framework, como os componentes de banco de dados, filas, de validação e de roteamento. Uma vez que inicializado, será configurado todos os recursos oferecidos pelo Framework, os service providers são o aspecto mais importante de todo o processo de inicialização do Laravel.
Artisan Console
Artisan é o nome da interface para linha de comando incluida que faz parte do Laravel. Ele provê inúmeros comandos úteis que você pode usar enquanto desenvolve sua aplicacação. Ele é baseado no poderoso componente Symfony Console.
php artisan list
php artisan make:console SendEmails --command=emails:send
<?php namespace App\Console\Commands;
use App\User;
use App\DripEmailer;
use Illuminate\Console\Command;
use Illuminate\Foundation\Inspiring;
class Inspire extends Command
{
protected $signature = 'email:send {user}';
protected $description = 'Send drip e-mails to a user';
protected $drip;
public function __construct(DripEmailer $drip)
{
parent::__construct();
$this->drip = $drip;
}
public function handle()
{
$this->drip->send(User::find($this->argument('user')));
}
}
Ponto de entrada: Rotas
As rotas são o ponto de entrada para uma aplicação Laravel. Através das rotas direcionamos as requisições dos nossos usuários para os controllers corretos.
routes/
api.php
channels.php
console.php
web.php
Route::get('/', function () {
return view('welcome');
});
Route::get('/posts', 'HomeController@index');
Route::post('/posts', 'HomeController@store');
Route::get('posts/{post}', 'HomeController@show');
Route::put('posts/{post}', 'HomeController@update');
Route::delete('/posts/{post}', 'HomeController@destroy');
Route::domain('{account}.myapp.com')->group(function () {
Route::get('user/{id}', function ($account, $id) {
//
});
});
Route::prefix('admin')->middleware('auth')->group(function () {
Route::get('users', function () {
// Matches The "/admin/users" URL
});
});
Middleware
HTTP middleware fornece um mecanismo conveniente para filtragem das requisições HTTP que entram em sua aplicação. Por exemplo, Laravel inclui um middleware que verifica se o usuário de sua aplicação está autenticado.
php artisan make:middleware RedirectIfAuthenticated
// Within App\Http\Kernel Class...
protected $routeMiddleware = [
....
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
];
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Support\Facades\Auth;
class RedirectIfAuthenticated
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @param string|null $guard
* @return mixed
*/
public function handle($request, Closure $next, $guard = null)
{
if (Auth::guard($guard)->check()) {
return redirect('/');
}
return $next($request);
}
}
<?php
# routes/web.php
Route::get('/login', 'AuthController@login')->middleware('guest');
#ou
Route::middleware('guest')->group(function () {
Route::get('/login', 'AuthController@login');
Route::get('/register', 'AuthController@login');
});
Controllers
Controllers são responsáveis por "controlar" a nossa aplicação. Eles recebem a requisição e direcionam para o lugar correto.
php artisan make:controller PostsController
php artisan make:controller PostsController --resource
php artisan make:controller PostsController --resource --model=Post
php artisan make:controller API/PostsController --api
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
class PostsController extends Controller
{
public function index()
{
//
}
public function store(Request $request)
{
//
}
public function show($id)
{
//
}
public function update(Request $request, $id)
{
//
}
public function destroy($id)
{
//
}
}
Models (Eloquent ORM)
O Eloquent ORM incluido com o Laravel fornece uma bonita, e simples implementação ActiveRecord para trabalhar com o seu banco de dados. Cada trabala do banco de dados tem a um "Modelo" correspondente que é usado para interagir com determinada tabela.
php artisan make:model Post
php artisan make:model Post -m
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Post extends Model
{
protected $fillable = ['user_id','title','content'];
public function user()
{
return $this->belongsTo('App\User');
}
public function comments()
{
return $this->hasMany('App\Comment');
}
}
...
// get all posts
$comments = App\Post::all();
// find the post with id 23
$comment = App\Post::find(23)
// find all posts with comments
$comments = App\Post::with('comments')->get();
// Not Found Exceptions
$comment = App\Post::where('active', '==', 1)->firstOrFail();
$comments = App\Post::where('active', 1)
->orderBy('title', 'desc')
->take(10)
->get();
// update
$comment = App\Flight::find(1);
$comment->title = 'New Flight Name';
$comment->save();
// delete
$comment->delete();
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
protected $casts = [
'birthday' => 'date:Y-m-d',
'joined_at' => 'datetime:Y-m-d H:00',
'is_admin' => 'boolean',
'options' => 'array'
];
}
//
$user = App\User::find(1);
$options = $user->options;
$options['key'] = 'value';
$user->options = $options;
$user->save();
Migrations
Migrations são um tipo de controle de versão para o seu banco de dados. Eles permitem que uma equipe modifique o esquema do banco de dados e fique atualizado no estado do esquema atual.
php artisan make:migration create_posts_table
php artisan migrate
php artisan migrate:reset
php artisan migrate:refresh
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreatePostsTable extends Migration
{
public function up()
{
Schema::create('posts', function (Blueprint $table) {
$table->increments('id');
$table->integer('user_id')->unsigned();
$table->foreign('user_id')->references('id')
->on('users')
->onDelete('cascade');
$table->string('title', 100);
$table->string('content');
$table->boolean('status')->default(true);
$table->timestamps();
});
}
public function down()
{
Schema::dropIfExists('posts');
}
}
Collections
A classe Collection prove conveniente wrapper para trabalhar com arrays de dados.
$collection = collect(['taylor', 'abigail', null])->map(function ($name) {
return strtoupper($name);
})
->reject(function ($name) {
return empty($name);
});
$collection = collect([
['account_id' => 'account-x10', 'product' => 'Chair'],
['account_id' => 'account-x10', 'product' => 'Bookcase'],
['account_id' => 'account-x11', 'product' => 'Desk'],
]);
$grouped = $collection->groupBy('account_id');
$grouped->toArray(); // or $grouped->toJson();
//
$collection = collect([1, 2, 3]);
$total = $collection->reduce(function ($carry, $item) {
return $carry + $item;
});
//
$collection = collect([
['name' => 'Desk', 'price' => 200],
['name' => 'Chair', 'price' => 100],
['name' => 'Bookcase', 'price' => 150],
]);
$collection->sortBy('price');
Seed
Laravel inclui um método simples para popular (semear) seu banco de dados com dados de teste usando as classes Seed. Todas as Seeders são armazenadas em database/seeds.
php artisan make:seeder UsersTableSeeder
<?php
use DB;
use Illuminate\Database\Seeder;
use Illuminate\Database\Eloquent\Model;
class DatabaseSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
DB::table('users')->insert([
'name' => str_random(10),
'email' => str_random(10).'@gmail.com',
'password' => bcrypt('secret'),
]);
}
}
...
php artisan db:seed
php artisan db:seed --class=UsersTableSeeder
Using Model Factory
Você pode usar model factories para gerar uma grande quantidade de registros para o banco de dados.
Uma vez definidas as factories, pode usar a função helper factory para inserir registros em seu banco de dados.
php artisan make:factory UserFactory --model=User
<?php
use Faker\Generator as Faker;
/*
|--------------------------------------------------------------------------
| Model Factories
|--------------------------------------------------------------------------
|
| This directory should contain each of the model factory definitions for
| your application. Factories provide a convenient way to generate new
| model instances for testing / seeding your application's database.
|
*/
$factory->define(App\User::class, function (Faker $faker) {
return [
'name' => $faker->name,
'email' => $faker->unique()->safeEmail,
'password' => bcrypt('secret'),
'remember_token' => str_random(10),
];
});
https://github.com/fzaninotto/Faker
<?php
use DB;
use Illuminate\Database\Seeder;
use Illuminate\Database\Eloquent\Model;
class DatabaseSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
// only users
factory(App\User::class, 50)->create();
// users with posts
factory(App\User::class, 50)->create()->each(function ($u) {
$u->posts()->saveMany(factory(App\Post::class, 10)->make());
});
}
}
API Resources
Ao criar uma API, você pode precisar de uma camada que filtre e formate seus dados em respostas JSON.
php artisan make:resource PostResource
php artisan make:resource Post --collection
<?php
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\JsonResource;
class PostResource extends JsonResource
{
public function toArray($request)
{
return [
'id' => $this->id,
'title' => $this->title,
'content' => $this->content,
'created_at' => $this->created_at,
'updated_at' => $this->updated_at,
];
}
}
//
use App\User;
use App\Http\Resources\UserResource;
Route::get('/post/{id}', function ($id) {
return new PostResource(Post::find($id));
});
<?php
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\ResourceCollection;
class PostCollection extends ResourceCollection
{
public function toArray($request)
{
return [
'data' => $this->collection,
'links' => [
'self' => 'link-value',
],
];
}
}
//
use App\User;
use App\Http\Resources\PostCollection;
Route::get('/posts', function () {
return PostCollection::collection(Post::all());
});
http://jsonapi.org/
A SPECIFICATION FOR BUILDING APIS IN JSON
Browser Tests (Laravel Dusk)
O Laravel Dusk fornece uma API de teste e automação do navegador de expressiva e fácil de usar. Por padrão, o Dusk não exige que você instale JDK ou Selenium em sua máquina. Em vez disso, o Dusk usa uma instalação independente do ChromeDriver .
Text
<?php
namespace Tests\Browser;
use App\User;
use Tests\DuskTestCase;
use Laravel\Dusk\Chrome;
class ExampleTest extends DuskTestCase
{
public function testBasicExample()
{
$user = factory(User::class)->create([
'email' => 'taylor@laravel.com',
]);
$this->browse(function ($browser) use ($user) {
$browser->visit('/login')
->type('email', $user->email)
->type('password', 'secret')
->press('Login')
->assertPathIs('/home');
});
}
}

Um projeto
Open Source
Taylor Otwell
em 2012


Lumen.



Thanks !
@luuckymacedo

Links
@laravelphp

laravel.com
laravel.com/docs/5.6
laravel-news.com
forge.laravel.com
envoyer.io
laravelpodcast.com
larachat.co
laracasts.com
vueslack.com
Laravel QuickStart - Conceitos iniciais
By Lucas Macedo
Laravel QuickStart - Conceitos iniciais
3º Encontro - Backend Meetup Group (Bemugo) https://github.com/bemugmga
- 1,096