InnoCafe vol.18
@localdisk
松尾 大(まつお まさる)
http://slides.com/masarumatsuo/innocafe-18#/
Route::get('/', function() {
return ['foo', 'bar'];
});
Content-Type がちゃんと
application/json になる
Route::get('users', function() {
// モデルファクトリー便利
$user = factory(\App\User::class)->make();
return $user;
});
returnしてJSONでレスポンスさせるには以下の条件のいずれかに該当させる必要があります。
イベントを発生(fire)させるところと実行(listen)させるところが分かれてる
# ロールバックされた時のリスナを作る
$ php artisan make:listener RollbackListner
--event=Illuminate\Database\Events\TransactionRolledBack<?php
namespace App\Listeners;
use Illuminate\Database\Events\TransactionRolledBack;
class RollbackListner
{
public function handle(TransactionRolledBack $event)
{
// ロールバックされたクエリを参照できる
dd($event->connection->getQueryLog());
}
}
php artisan make:event AsyncEvent
php artisan make:listener AsyncLister
--event=App\\Events\\AsyncEvent// ShouldQueue を implements するのがポイント
class AsyncLister implements ShouldQueue
{
}php artisan make:auth
Created View: /Users/localdisk/NetBeansProjects/five-point-two/resources/views/auth/login.blade.php
Created View: /Users/localdisk/NetBeansProjects/five-point-two/resources/views/auth/register.blade.php
Created View: /Users/localdisk/NetBeansProjects/five-point-two/resources/views/auth/passwords/email.blade.php
Created View: /Users/localdisk/NetBeansProjects/five-point-two/resources/views/auth/passwords/reset.blade.php
Created View: /Users/localdisk/NetBeansProjects/five-point-two/resources/views/auth/emails/password.blade.php
Created View: /Users/localdisk/NetBeansProjects/five-point-two/resources/views/layouts/app.blade.php
Created View: /Users/localdisk/NetBeansProjects/five-point-two/resources/views/home.blade.php
Created View: /Users/localdisk/NetBeansProjects/five-point-two/resources/views/welcome.blade.php
Installed HomeController.
Updated Routes File.# -m つけるとマイグレーションファイルも作ってくれる
php artisan make:model Admin -mclass CreateAdminsTable extends Migration
{
public function up()
{
Schema::create('admins', function (Blueprint $table) {
// CreateUsersTable からコピペ
$table->increments('id');
$table->string('name');
$table->string('email')->unique();
$table->string('password', 60);
$table->rememberToken();
$table->timestamps();
});
}
}<?php
return [
'guards' => [
// 追加
'admin' => [
'driver' => 'session',
'provider' => 'admins',
],
],
'providers' => [
// 追加
'admins' => [
'driver' => 'eloquent',
'model' => App\Admin::class,
],
],
// モデルファクトリを追加
// database/factories/ModelFactory.php
$factory->define(App\Admin::class, function (Faker\Generator $faker) {
return [
'name' => $faker->name,
'email' => $faker->email,
'password' => bcrypt(str_random(10)),
'remember_token' => str_random(10),
];
});
➜ five-point-two php artisan tinker
Psy Shell v0.7.2 (PHP 7.0.4 — cli) by Justin Hileman
>>> factory(App\Admin::class)->create(['password' => bcrypt('secret')]);
=> App\Admin {#719
name: "Mr. Sage McDermott",
email: "kFeest@yahoo.com",
updated_at: "2016-03-29 06:45:52",
created_at: "2016-03-29 06:45:52",
id: 2,
}// http://localhost:8000/admin
Route::group(['prefix' => 'admin'], function() {
Route::get('login', function() {
// ビューはコピる
return view('admin.login');
});
Route::post('login', function(\Illuminate\Http\Request $request) {
$credentials = $request->only(['email', 'password']);
// guard メソッドの引数に `admin` を入れるのがポイント
$result = Auth::guard('admin')->attempt($credentials);
dd($result);
});
});
認証…ネットワークやサーバへ接続する際に本人性をチェックし、正規の利用者であることを確認する方法。
認可…認証によって確認された利用者を識別して、アクセス権限の制御を行い、利用者ごとに固有のサービスを提供すること。
Gateファサードを使ってみよう
➜ five-point-two php artisan make:model Profile -m
Model created successfully.
Created Migration: 2016_03_29_083825_create_profiles_table
➜ five-point-two php artisan migrate
Migrated: 2016_03_29_083825_create_profiles_table$factory->define(App\Profile::class, function (Faker\Generator $faker) {
return [
'nickname' => $faker->name,
'user_id' => factory(\App\User::class)->create()->id,
];
});
➜ five-point-two php artisan tinker
>>> factory(App\Profile::class)->create();
=> App\Profile {#708
nickname: "Delbert Rau",
user_id: 2,
updated_at: "2016-03-29 08:44:30",
created_at: "2016-03-29 08:44:30",
id: 1,
}Gateファサードを使ってみよう
<?php
class AuthServiceProvider extends ServiceProvider
{
protected $policies = [
'App\Model' => 'App\Policies\ModelPolicy',
];
public function boot(GateContract $gate)
{
$this->registerPolicies($gate);
// ユーザーIDとプロフィールIDが一致すればOK
\Gate::define('update-profile', function($user, $profile){
return $user->id === $profile->user_id;
});
}
}
Gateファサードを使ってみよう
<?php
class AuthServiceProvider extends ServiceProvider
{
protected $policies = [
'App\Model' => 'App\Policies\ModelPolicy',
];
public function boot(GateContract $gate)
{
$this->registerPolicies($gate);
// ユーザーIDとプロフィールIDが一致すればOK
\Gate::define('update-profile', function($user, $profile){
return $user->id === $profile->user_id;
});
}
}