- 投稿日:2020-01-07T20:13:28+09:00
Laravelの認可、ゲートとポリシーを使ったルーティングベースのシンプルな実装
Laravelで開発していて、認証(Authentication)はすぐに理解出来ても、認可(Authorization)はなかなか理解出来ませんでした。
自分の書き方と合ってないのか、どう認可を使えばいいのかわからなかった。
使っていくうちにだんだんと慣れてきましたが、それでも難しい。
そこで今回は、自分の知識の再確認のため、あるAPIを実行出来る権限がログインユーザにあるかどうかを、認可(ゲートとポリシー)を使って実装してみました。https://laravel.com/docs/6.x/authorization
https://readouble.com/laravel/6.x/ja/authorization.html使うLaravelのバージョンは6.8.0です。
システムの仕様
- ユーザは権限を持つ。
- APIは権限に対して認可されないと実行出来ない。
- リレーションは
user -- role -< authorizations。データベース
usersテーブルにはuser_role_idカラムがある。
user_rolesテーブル
id name 1 管理者 2 スタッフ
user_role_authorizationsテーブル
id user_role_id route_name 1 1 user_index 2 1 user_create 3 2 user_index テスト
以下の2つのテストが成功すれば完了とします。
上の表で、スタッフはuser_createへの権限がありません。
したがってtests/Feature/UserCreateTest.phpにおいて、スタッフでuser_createにAPIリクエストして403エラーが返ってくれば成功というわけですtests/Feature/UserIndexTest.php<?php namespace Tests\Feature; use Illuminate\Foundation\Testing\RefreshDatabase; use Illuminate\Foundation\Testing\WithFaker; use Tests\TestCase; use App\User; use App\UserRole; class UserIndexTest extends TestCase { use RefreshDatabase; protected function setUp(): void { parent::setUp(); $this->seed(); } /** * A basic feature test example. * * @return void */ public function testAdmin() { $user = factory(User::class)->create(['user_role_id' => UserRole::ADMIN_ROLE_ID]); $response = $this->actingAs($user)->getJson('/api/user'); $response->assertStatus(200); } /** * A basic feature test example. * * @return void */ public function testStaff() { $user = factory(User::class)->create(['user_role_id' => UserRole::STAFF_ROLE_ID]); $response = $this->actingAs($user)->getJson('/api/user'); $response->assertStatus(200); } }tests/Feature/UserCreateTest.php<?php namespace Tests\Feature; use Illuminate\Foundation\Testing\RefreshDatabase; use Illuminate\Foundation\Testing\WithFaker; use Tests\TestCase; use App\User; use App\UserRole; class UserCreateTest extends TestCase { use RefreshDatabase; protected function setUp(): void { parent::setUp(); $this->seed(); } /** * A basic feature test example. * * @return void */ public function testAdmin() { $user = factory(User::class)->create(['user_role_id' => UserRole::ADMIN_ROLE_ID]); $response = $this->actingAs($user)->getJson('/api/user/create'); $response->assertStatus(405); $response = $this->actingAs($user)->postJson('/api/user/create'); $response->assertStatus(200); } /** * A basic feature test example. * * @return void */ public function testStaff() { $user = factory(User::class)->create(['user_role_id' => UserRole::STAFF_ROLE_ID]); $response = $this->actingAs($user)->postJson('/api/user/create'); // これが重要 $response->assertStatus(403); } }ゲートとポリシー
まずポリシーを作ります。
ここで作るallow()メソッドは引数としてログインしたユーザを受け取ります(メソッド名はなんでも大丈夫)。
返り値はResponse::allow()で許可、Response::deny()で拒否です。$ php artisan make:policy AllowRequestApiapp/Policies/AllowRequestApi.php<?php namespace App\Policies; use App\User; use Illuminate\Auth\Access\HandlesAuthorization; use Illuminate\Auth\Access\Response; use Route; use Auth; class AllowRequestApi { use HandlesAuthorization; /** * Create a new policy instance. * * @return void */ public function __construct() { // } /** * ログインユーザの権限をチェック * * @param User $user * @return Response */ public function allow(User $user): Response { $route_name = Route::currentRouteName(); if (!Auth::check()) { return Response::deny('権限がありません。'); } $allowed = (bool)Auth::user()->role->authorizations->where('route_name', $route_name)->count(); if ($allowed) { return Response::allow(); } else { return Response::deny('権限がありません。'); } } }作ったポリシーをサービスプロバイダで登録します。
このときにGate::define()を使います。app/Providers/AuthServiceProvider.php<?php namespace App\Providers; use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider; use Illuminate\Support\Facades\Gate; class AuthServiceProvider extends ServiceProvider { /** * The policy mappings for the application. * * @var array */ protected $policies = [ // 'App\Model' => 'App\Policies\ModelPolicy', ]; /** * Register any authentication / authorization services. * * @return void */ public function boot() { $this->registerPolicies(); Gate::define('allow-request-api', 'App\Policies\AllowRequestApi@allow'); } }登録したので、次はそのポリシーをルーティングで使います。
ミドルウェアの'can:allow-request-api'がそれです。不思議な述語になってしまったのは残念ですが。。。routes/web.php<?php /* |-------------------------------------------------------------------------- | Web Routes |-------------------------------------------------------------------------- | | Here is where you can register web routes for your application. These | routes are loaded by the RouteServiceProvider within a group which | contains the "web" middleware group. Now create something great! | */ Route::get('/', function () { return view('welcome'); }); Auth::routes(); Route::get('/home', 'HomeController@index')->name('home'); Route::prefix('api')->middleware(['auth', 'can:allow-request-api'])->group(function () { Route::prefix('user')->group(function () { Route::get('/', 'UserIndex')->name('user_index'); Route::post('create', 'UserCreate')->name('user_create'); }); });APIの説明は省略します。
1ファイル1メソッドのAPI(コントローラ)を作りたい場合は、--invokableオプションで作れます。$ php artisan make:controller UserIndex --invokable $ php artisan make:controller UserCreate --invokableテスト実行
$ vendor/bin/phpunit tests/Feature/UserIndexTest.php PHPUnit 8.5.1 by Sebastian Bergmann and contributors. .. 2 / 2 (100%) Time: 597 ms, Memory: 24.00 MB OK (2 tests, 2 assertions) $ vendor/bin/phpunit tests/Feature/UserCreateTest.php PHPUnit 8.5.1 by Sebastian Bergmann and contributors. .. 2 / 2 (100%) Time: 188 ms, Memory: 24.00 MB OK (2 tests, 3 assertions)成功しました
まとめ
認可は他にも様々な書き方があります。
今回はルーティングベースの認可でしたが、モデルベースの認可もあります。
奥が深いです。
最高の認可を求める旅はまだまだ終わりません
- 投稿日:2020-01-07T17:56:14+09:00
Laravel 日付関連の処理を施す
Carbonはphpに標準で存在するDateTimeクラスを拡張して、日付操作をより簡単にしてくれます。まず、composerにCarbonをインストールしましょう。
composer self-update //composer --versionでバージョンの確認ができます。そしたら、composerにCarbonをインストールしましょう。
composer require nesbot/carbon現在地点からの日時取得
hogehogeController.phpuse Carbon\Carbon; // 現在日時 $carbon_now = Carbon::now(); // 昨日 Carbon::yesterday(); // 今日 Carbon::today(); // 明日 Carbon::tomorrow(); // 2年進める $carbon_now->addYears(2); // 2年戻る $carbon_now->subYears(2); // 2ヶ月進む $carbon_now->addMonth(2); // 2日進む $carbon_now->addDays(2); // 2時間戻る $carbon_now->subHours(2); // 平日で2日進む $carbon_now->addWeekdays(2); // 2週間進む $carbon_now->addWeeks(2);こんな感じで簡単に色々できます。
参考にさせて頂いたサイト
https://leben.mobi/blog/php_date_carbon/php/
上記サイトにほとんど書いてあるので、参考にしてみましょう!
- 投稿日:2020-01-07T16:36:32+09:00
【Laravel】何をやっても.envが反映されない時の対処法(備忘録)
事象
Laravelの.envやconfigを変更した際は、下記のコマンドを実行して変更を反映させるのが一般的ですが
consolephp artisan cache:clear php artisan config:cacheこれらを実行しても.envやconfigの内容が反映されない場合は下記のファイル削除を行うと解決します。
結論
consolerm -f bootstrap/cache/config.php追記
今回の事象が発生したのは、.envへの値読み込みをコントローラ上で行っていたプロジェクトで発生しました。
そもそも、.envを直接コントローラやビュー等で参照するのがマズいらしく、envの値を参照する際は、必ずconfigファイルを挟んで行わなければならない。
- 投稿日:2020-01-07T16:10:22+09:00
larave-adminでcheckboxをDBに保存
larave-adminはお手軽にさらっと管理画面を作れて便利です。
大まかな使用方法は他の記事にお任せするとしてcheckbox、multiselectなどをDBに保存するにはひと手間必要なので備忘録的メモです公式に記述があります。二つあるようですが今回はデータをカンマ区切りで登録する方法です。
https://laravel-admin.org/docs/#/en/model-form-fieldsclass Post extends Model public function getTagsAttribute($value) { return explode(',', $value); } public function setTagsAttribute($value) { $this->attributes['tags'] = implode(',', $value); } }そのまま引用しています。
get[elements]Attributeとset[elements]Attributeをoverwriteしています。マイグレーションはtextかvarcharあたりで
Schema::create('post', function (Blueprint $table) { $table->bigIncrements('id'); $table->text('tag'); $table->timestamps(); $table->softDeletes(); });これでDBにはカンマ区切りで保存されます
- 投稿日:2020-01-07T16:10:22+09:00
laravel-adminでcheckboxをDBに保存
larave-adminはお手軽にさらっと管理画面を作れて便利です。
大まかな使用方法は他の記事にお任せするとしてcheckbox、multiselectなどをDBに保存するにはひと手間必要なので備忘録的メモです公式に記述があります。二つあるようですが今回はデータをカンマ区切りで登録する方法です。
https://laravel-admin.org/docs/#/en/model-form-fieldsclass Post extends Model public function getTagsAttribute($value) { return explode(',', $value); } public function setTagsAttribute($value) { $this->attributes['tags'] = implode(',', $value); } }そのまま引用しています。
get[elements]Attributeとset[elements]Attributeをoverwriteしています。マイグレーションはtextかvarcharあたりで
Schema::create('post', function (Blueprint $table) { $table->bigIncrements('id'); $table->text('tag'); $table->timestamps(); $table->softDeletes(); });これでDBにはカンマ区切りで保存されます
- 投稿日:2020-01-07T15:23:22+09:00
Laravel 6-Passport APIの主キーとしてのUUID
Laravel 6 - UUID as Primary Key for Passport API
チュートリアルを続けたくない場合は、このチュートリアルと同じ機能を備えたhttps://github.com/JamesHemery/laravel-uuidをいつでも使用できます
If you don´t want to follow the tutorial, you can always use https://github.com/JamesHemery/laravel-uuid which has the same functionality as this tutorial
laravelをインストールする
Install laravel
ユーザーテーブルの移行の変更
modify users table migration
$table->uuid('id')->primary();パスポートをインストールする
Install Passport
移行を実行する
run migrations
composer laravel / dbalをインストールします
composer Install laravel/dbal
テーブルを変更する新しい移行を作成する
create a new migration to change table
Schema::table("oauth_access_token",function (Blueprint $table){ $table->string("user_id")->change(); });移行を再度実行します
run migrations again
ユーザーモデル内に、以下を追加します
Inside the User Model, add the following
use Illuminate\Support\Str; class User extends Authenticatable { use HasApiTokens, Notifiable; public $incrementing = false; //No more autoincrement field protected static function boot() { parent::boot(); // TODO: Change the autogenerated stub //Generate a new UUID when creating a new registry self::creating(function ($model){ $model->id = (string) Str::uuid(); }); } .... }この部分を他のモデルで再利用可能にしたい場合は、特性を作成できます
If you want to make this part reusable for other models, you can create a Trait
app \ Traits \ HasUuid.phpにファイルを作成しますcreate a file in
app\Traits\HasUuid.php<?php namespace App\Traits; use Illuminate\Support\Str; trait HasUuid{ public function getIncrementing() { return false; } protected static function boot() { parent::boot(); // TODO: Change the autogenerated stub self::creating(function ($model){ $model->id = (string) Str::uuid(); }); } }モデルでは、「HasApiToken」の横に新しい特性「HasUuid」を追加できます
In the model, next to
HasApiTokenyou can add the new traitHasUuidclass User extends Authenticatable { use HasApiTokens, Notifiable, SoftDeletes, HasUuid; ....残りは、APIの作成方法に関する以前のチュートリアルに従うことができます
The rest you can follow my previous tutorials on how to create an API
- 投稿日:2020-01-07T14:31:42+09:00
Laravel + Nuxt ルート追加用メモ
※更新中
Laravel
モデル
php artisan make:model Post-m オプションでマイグレーション・ファイルを同時に作成できる。
マイグレーション・ファイル
php artisan make:migration create_posts_tableマイグレート実行
php artisan migrateポリシー
php artisan make:policy PostPolicyポリシー登録
app/Providers/AuthServiceProvider.php// 略 class AuthServiceProvider extends ServiceProvider { protected $policies = [ 'App\User' => 'App\Policies\UserPolicy', 'App\Post' => 'App\Policies\PostPolicy', // 'App\Model' => 'App\Policies\ModelPolicy', ]; // 略リソース
php artisan make:resource Post php artisan make:resource PostCollectionコントローラー
php artisan make:controller API/PostController --api --model=Postルート
routes/api.php// 略 Route::namespace('API')->group(function () { Route::apiResource('posts', 'PostController'); } // 略Nuxt
ストア
store └ posts ├ index.js ├ store.js ├ show.js ├ update.js └ delete.jsstore/posts/update.jsexport const actions = { request: async function ({ dispatch }, payload) { try { let response = await this.$axios({ method: 'post', url: `/posts/${payload.params.id}`, data: { _method: 'put', title: payload.form.title, text: payload.form.text, tags: payload.form.tags } }) let handledResponse = await dispatch('handleResponse', response) return handledResponse } catch (err) { // ?? } }, handleResponse: async function ({ commit }, response) { let handledResponse = { post: response.data.data } return handledResponse } }コンポーネント
components └ posts ├ parts ├ requests │ ├ StoreButton.vue │ ├ UpdateButton.vue │ └ DeleteButton.vue ├ List.vue ├ Form.vue └ Full.vuecomponents/posts/requests/UpdateButton.vue<template> <button-request class="bg-purple-500" @click="updatePost">Update</button-request> </template> <script> import { mapActions } from 'vuex' import ButtonRequest from '~/components/library/buttons/Request' export default { props: { form: { type: Object, required: true } }, methods: { ...mapActions({ requestUpdatePost: 'posts/update/request' }) updatePost: async function () { let payload = this.makePayload() try { let handledResponse = await this.requestUpdatePost(payload) this.$emit('updated', handledResponse) } catch (err) { // } finally { // } }, makePayload: function () { let payload = {} payload.params = this.$route.params payload.form = this.form return payload } }, components: { ButtonRequest } } </script>components/posts/Form.vue<template> <form class="flex flex-col bg-white"> <div class="flex-grow-0"> <input class="w-full" type="text" v-model="form.title" /> </div> <div class="flex-grow"> <textarea class="w-full h-full" v-model="form.text"></textarea> </div> <form-row class="flex-grow-0"> <template v-if="create"> <store-button :form="form"/> </template> <template v-else-if="edit"> <update-button :form="form"/> </template> </form-row> </form> </template> <script> import FormRow from '~/components/library/forms/FormRow' import StoreButton from '~/components/posts/requests/StoreButton' import UpdateButton from '~/components/posts/requests/UpdateButton' import DeleteButton from '~/components/posts/requests/DeleteButton' export default { props: { form: { type: Object, required: true }, create: { type: Boolean, default: false }, edit: { type: Boolean, default: false } }, methods: { handleRequest: function (event) { this.$emit('request', event) } }, components: { FormRow, StoreButton, UpdateButton, DeleteButton } } </script>ページ
pages └ posts ├ _id │ ├ index.vue │ └ edit.vue └ create.vuepages/posts/_id/edit.vue<template> <div> <post-form edit :form="form" /> </div> </template> <script> import PostForm from '~/components/posts/Form' export default { data: function () { return { form: { title: '', text: '' }, post: { title: '', text: '' } } }, asyncData: async function ({ $axios, params, store }) { let handledResponse = await store.dispatch('posts/show/request', { params }) return handledResponse }, beforeMount: function () { this.form.title = this.post.title this.form.text = this.post.text }, components: { PostForm } } </script>
- 投稿日:2020-01-07T12:35:24+09:00
クラスとは
「クラス」とは
よくPHPの学習サイトではクラスは設計図に例えられます。
オブジェクト指向とは設計図(クラス)からインスタンス(オブジェクト)を作ることを言います。
このことからわかるようにオブジェクト指向では 「クラス」 というものが基本になります。クラスは class を使用して、以下の書式で作成します。
class クラス名 { 実装したい処理 }クラスが持つ変数をプロパティと呼びます。
クラスが持つ関数をメソッドと呼びます。class Math { //プロパティを定義 public $number1; public $number2; //メソッドを定義 function add() { return $this->number1 + $this->number2; } function minus() { return $this->number1 - $this->number2; } }プロパティは
public どこからでもアクセスできる
protected そのクラスと、サブクラスからしかアクセスできない
private そのクラスからしかアクセスできない
で定義します。× $this->$number1 〇 $this->number1クラスが持つ関数、いわゆるメソッドはfunction で定義します。
クラス内でプロパティやメソッドを参照するときは、$ this という変数を使います。
$ this はメソッドの定義の中でのみ使用できる、特殊な変数です。
このときプロパティ名に$(ダラー)はつけません。
- 投稿日:2020-01-07T11:10:09+09:00
Laravelのバリデーションで、正規表現のパイプが使えない件
Laravelのバリデーションで、正規表現のパイプが使えない件
Laravelのバリデーション
Laravelには、いくつかのバリデーションルールが用意されており、パイプ区切りで実行したいルールをvalidateメソッドへ渡すことで、複数のルールを利用することができる。
[バリデーションルールの例]
ルール 説明 フィールドがメールアドレスとして正しいことをバリデートする ipv4 フィールドがIPv4アドレスの形式として正しいことをバリデートする required フィールドが入力データに存在しており、かつ空でないことをバリデートする regex フィールドが指定された正規表現にマッチすることをバリデートする sample.php// バリデーションの利用例(パイプ区切り) $validateRules = [ // 必須入力, 英数字のみ 'user_name'=>'required|regex:/^[0-9a-zA-Z]+$/', // 必須入力, メールアドレス形式 'mail'=>'required|email', ];正規表現のパイプが使えない
通常、正規表現ではパイプ(|)を用いて「OR条件」を利用することができるが、Laravelでは複数のルールを区切るためにパイプを使うため、上記の書き方では正規表現のパイプを利用することができない。
バリデーションルールをパイプ区切りではなく、配列で書くことで正規表現のパイプを利用できるようにする。sample.php// バリデーションの利用例(配列) $validateRules = [ // 必須入力, 「大阪」か「東京」のいずれかのみ 'location'=>['required','regex:/(大阪|東京)/'], ];
- 投稿日:2020-01-07T09:53:49+09:00
【 Laravel 】Laravel DB.comでCLUD『 表示・登録・更新・削除 』機能をCODEを書かず自動作成
Laravle DB.com は「 ER図 → CRUD生成 」までCODEを書かずに作成可能なツールです
以前にも書きましたが、Laravle DB.comでは「CRUD」のコードまで生成するようになりました。\(^o^)/
私の開発環境
- Laravel5.5/PHP7.2.1/MySQL5.6.38 (Chromeで確認)
メリット
- CRUDを自動生成!
- 超便利! ER図を保存できるので、1度作ったものを別のアプリにも転用しやすい!
- どのPCからでも同じデータを操作できる(ブラウザアプリだから)!
さあ、はじめて行きましょう!
【 LaravelDB.comへ ログイン 】
LaravelDB.com
Googleアカウントのみログイン可能です。
※現在はGoogleアカウントを持っていない人は少ないですからね〜
【 LaravelDB.comの POINT!! 】
ER図を作成していきますが重要事項があります!
<<重要>>
主キーのAutoIncrementは どのテーブルも『 id 』 と固定すること!!
LaravelのEloquentModel を便利に使うためには、どのテーブルも 『 id 』 と固定するのが吉です。
理由は「 モデル名::find($id); 」と便利に使う場合は 主キーのAutoIncrement 『 id 』 名にしておかないと動作しないからです( Laravelを勉強してる人はなんとなく知ってることでしょうか )。
※ laravelDB.comのCRUDでも生成されるファイルは「 ○○○::find($id); 」を使ってるためそ!
※ laravelに最初から入っているテーブル「user」「password_resets」は作成しないこと(migrate時に上書きしてしまいます)
※慣れれば簡単ですが、少しだけ慣れる時間は必要ですね。
【 CRUDを生成してみる! 】
まずは、ER図を簡単に作ってみましょう!!
その後に右メニュー「 ER図のLoad/Save 」をクリックすると以下画面が表示されます。
CRUDを生成するボタンが新しく出来ています!!!
※まだデバッグが全て終わってないため「BETA」と書いてますが、クリックです!!!
【 CRUD: 新しいプロジェクトを用意 】
最低限Laravelがインストールした状態 を準備します!
この時点ではまだLOGINは作らないように!
【 CRUD: ダウンロードファイルを確認しましょう 】
Zip圧縮ファイルがダウンロードされるので、Zipを展開(解凍)して中を見てみましょう!
CRUDに必要なファイルが一式入っています。
ダウンロードしたファイル( 各フォルダ内のファイル )を移動しましょう!
※welcome.blade.phpはダウンロードしたファイルへのリンクが生成されているので、上書きしてください。
【 CRUD: 配置しおわったら「 Migrate 」しましょう 】
DBや.env設定など最低限の設定が終わっていたら
php artisan migrateで、テーブルを作成してください。
【 完成: ブラウザで確認しましょう! 】
http://localhost/ (URLは開発環境によって異なります) で確認しましょう!
画面の中央に今までなかったリンクが出来ています。あなたが作ったテーブルのCRUD画面へ遷移できますよ!!作成されたindex/show/editの画面
基本的な処理が最初から出来てます!捗りそうですね!
画面が古いままの場合(Cacheかも)
以下コマンドでCacheをクリアしてみましょう
php artisan cache:clear php artisan config:clear php artisan route:clear php artisan view:clear
動作した後はコードを見ると良いでしょう
- Routing
- Controller
- Views
- Model 後は、自分で変更をいれていくだけですね。
こちらのイベントで操作方法等の勘所など解説する予定!
【G'sCreativeCollection #3】GEEKs_Output_LT
Outline】
・日時:1月11日(土)17:00~19:30
・会場:ShibuyaQWS(渋谷スクランブルスクエア15F)内
・参加費:無料
・定員:30名
日本から海外へ向けたアウトプット
laravelDB.com は日本人が作り、海外でも使われるプロダクトになることを願っております。
Twitterアカウント: LaravelDB.com
m(_ _)m
- 投稿日:2020-01-07T09:53:49+09:00
【 Laravel 】CLUD『 表示・登録・更新・削除 』機能をCODEを書かず自動作成
Laravle DB.com は「 ER図 → CRUD生成 」までCODEを書かずに作成可能なツールです
以前にも書きましたが、Laravle DB.comでは「CRUD」のコードまで生成するようになりました。\(^o^)/
私の開発環境
- Laravel5.5/PHP7.2.1/MySQL5.6.38 (Chromeで確認)
メリット
- CRUDを自動生成!
- 超便利! ER図を保存できるので、1度作ったものを別のアプリにも転用しやすい!
- どのPCからでも同じデータを操作できる(ブラウザアプリだから)!
さあ、はじめて行きましょう!
【 LaravelDB.comへ ログイン 】
LaravelDB.com
Googleアカウントのみログイン可能です。
※現在はGoogleアカウントを持っていない人は少ないですからね〜
【 LaravelDB.comの POINT!! 】
ER図を作成していきますが重要事項があります!
<<重要>>
主キーのAutoIncrementは どのテーブルも『 id 』 と固定すること!!
LaravelのEloquentModel を便利に使うためには、どのテーブルも 『 id 』 と固定するのが吉です。
理由は「 モデル名::find($id); 」と便利に使う場合は 主キーのAutoIncrement 『 id 』 名にしておかないと動作しないからです( Laravelを勉強してる人はなんとなく知ってることでしょうか )。
※ laravelDB.comのCRUDでも生成されるファイルは「 ○○○::find($id); 」を使ってるためそ!
※ laravelに最初から入っているテーブル「user」「password_resets」は作成しないこと(migrate時に上書きしてしまいます)
※慣れれば簡単ですが、少しだけ慣れる時間は必要ですね。
【 CRUDを生成してみる! 】
まずは、ER図を簡単に作ってみましょう!!
その後に右メニュー「 ER図のLoad/Save 」をクリックすると以下画面が表示されます。
CRUDを生成するボタンが新しく出来ています!!!
※まだデバッグが全て終わってないため「BETA」と書いてますが、クリックです!!!
【 CRUD: 新しいプロジェクトを用意 】
最低限Laravelがインストールした状態 を準備します!
この時点ではまだLOGINは作らないように!
【 CRUD: ダウンロードファイルを確認しましょう 】
Zip圧縮ファイルがダウンロードされるので、Zipを展開(解凍)して中を見てみましょう!
CRUDに必要なファイルが一式入っています。
ダウンロードしたファイル( 各フォルダ内のファイル )を移動しましょう!
※welcome.blade.phpはダウンロードしたファイルへのリンクが生成されているので、上書きしてください。
【 CRUD: 配置しおわったら「 Migrate 」しましょう 】
DBや.env設定など最低限の設定が終わっていたら
php artisan migrateで、テーブルを作成してください。
【 完成: ブラウザで確認しましょう! 】
http://localhost/ (URLは開発環境によって異なります) で確認しましょう!
画面の中央に今までなかったリンクが出来ています。あなたが作ったテーブルのCRUD画面へ遷移できますよ!!作成されたindex/show/editの画面
基本的な処理が最初から出来てます!捗りそうですね!
画面が古いままの場合(Cacheかも)
以下コマンドでCacheをクリアしてみましょう
php artisan cache:clear php artisan config:clear php artisan route:clear php artisan view:clear
動作した後はコードを見ると良いでしょう
- Routing
- Controller
- Views
- Model 後は、自分で変更をいれていくだけですね。
こちらのイベントで操作方法等の勘所など解説する予定!
【G'sCreativeCollection #3】GEEKs_Output_LT
Outline】
・日時:1月11日(土)17:00~19:30
・会場:ShibuyaQWS(渋谷スクランブルスクエア15F)内
・参加費:無料
・定員:30名
日本から海外へ向けたアウトプット
laravelDB.com は日本人が作り、海外でも使われるプロダクトになることを願っております。
Twitterアカウント: LaravelDB.com
m(_ _)m
- 投稿日:2020-01-07T09:53:49+09:00
【 Laravel 】CRUD『 表示・登録・更新・削除 』機能をCODEを書かず自動作成
Laravel DB.com は「 ER図 → CRUD生成 」までCODEを書かずに作成可能なツールです
以前にも書きましたが、Laravel DB.comでは「CRUD」のコードまで生成するようになりました。\(^o^)/
私の開発環境
- Laravel5.5/PHP7.2.1/MySQL5.6.38 (Chromeで確認)
メリット
- CRUDを自動生成!
- 超便利! ER図を保存できるので、1度作ったものを別のアプリにも転用しやすい!
- どのPCからでも同じデータを操作できる(ブラウザアプリだから)!
さあ、はじめて行きましょう!
【 LaravelDB.comへ ログイン 】
LaravelDB.com
Googleアカウントのみログイン可能です。
※現在はGoogleアカウントを持っていない人は少ないですからね〜
【 LaravelDB.comの POINT!! 】
ER図を作成していきますが重要事項があります!
<<重要>>
主キーのAutoIncrementは どのテーブルも『 id 』 と固定すること!!
LaravelのEloquentModel を便利に使うためには、どのテーブルも 『 id 』 と固定するのが吉です。
理由は「 モデル名::find($id); 」と便利に使う場合は 主キーのAutoIncrement 『 id 』 名にしておかないと動作しないからです( Laravelを勉強してる人はなんとなく知ってることでしょうか )。
※ laravelDB.comのCRUDでも生成されるファイルは「 ○○○::find($id); 」を使ってるためそ!
※ laravelに最初から入っているテーブル「user」「password_resets」は作成しないこと(migrate時に上書きしてしまいます)
※慣れれば簡単ですが、少しだけ慣れる時間は必要ですね。
【 CRUDを生成してみる! 】
まずは、ER図を簡単に作ってみましょう!!
その後に右メニュー「 ER図のLoad/Save 」をクリックすると以下画面が表示されます。
CRUDを生成するボタンが新しく出来ています!!!
※まだデバッグが全て終わってないため「BETA」と書いてますが、クリックです!!!
【 CRUD: 新しいプロジェクトを用意 】
最低限Laravelがインストールした状態 を準備します!
この時点ではまだLOGINは作らないように!
【 CRUD: ダウンロードファイルを確認しましょう 】
Zip圧縮ファイルがダウンロードされるので、Zipを展開(解凍)して中を見てみましょう!
CRUDに必要なファイルが一式入っています。
ダウンロードしたファイル( 各フォルダ内のファイル )を移動しましょう!
※welcome.blade.phpはダウンロードしたファイルへのリンクが生成されているので、上書きしてください。
【 CRUD: 配置しおわったら「 Migrate 」しましょう 】
DBや.env設定など最低限の設定が終わっていたら
php artisan migrateで、テーブルを作成してください。
【 完成: ブラウザで確認しましょう! 】
http://localhost/ (URLは開発環境によって異なります) で確認しましょう!
画面の中央に今までなかったリンクが出来ています。あなたが作ったテーブルのCRUD画面へ遷移できますよ!!作成されたindex/show/editの画面
基本的な処理が最初から出来てます!捗りそうですね!
画面が古いままの場合(Cacheかも)
以下コマンドでCacheをクリアしてみましょう
php artisan cache:clear php artisan config:clear php artisan route:clear php artisan view:clear
動作した後はコードを見ると良いでしょう
- Routing
- Controller
- Views
- Model 後は、自分で変更をいれていくだけですね。
こちらのイベントで操作方法等の勘所など解説する予定!
【G'sCreativeCollection #3】GEEKs_Output_LT
Outline】
・日時:1月11日(土)17:00~19:30
・会場:ShibuyaQWS(渋谷スクランブルスクエア15F)内
・参加費:無料
・定員:30名
日本から海外へ向けたアウトプット
laravelDB.com は日本人が作り、海外でも使われるプロダクトになることを願っております。
Twitterアカウント: LaravelDB.com
m(_ _)m
- 投稿日:2020-01-07T09:53:49+09:00
【 Laravel 】Laravel DB.comで『 CRUD簡単作成 』
Laravle DB.com を使って 「 ER図 → CRUD生成 」を試す!
前提条件
- Laravelで環境を作ったことがある人(とりあえず動作するまで)
- Laravelの基本を理解している人(つもりの人)
- 確認環境:Laravel5.5/PHP7.2.1/MySQL5.6.38
【 LaravelDB.comへ ログイン 】
LaravelDB.com
Googleアカウントのみログイン可能です。
※現在はGoogleアカウントを持っていない人は少ないですからね〜
【 LaravelDB.comの POINT!! 】
ER図を作成していきますが重要事項があります!
<<重要>>
主キーのAutoIncrementは どのテーブルも『 id 』 と固定すること!!
LaravelのEloquentModel を便利に使うためには、どのテーブルも 『 id 』 と固定するのが吉です。
理由は「 モデル名::find($id); 」と便利に使う場合は 主キーのAutoIncrement 『 id 』 名にしておかないと動作しないからです( Laravelを勉強してる人はなんとなく知ってることでしょうか )。
※ laravelDB.comのCRUDでも生成されるファイルは「 ○○○::find($id); 」を使ってるためそ!
※ laravelに最初から入っているテーブル「user」「password_resets」は作成しないこと(migrate時に上書きしてしまいます)
※慣れれば簡単ですが、少しだけ慣れる時間は必要ですね。
【 CRUDを生成してみる! 】
まずは、ER図を簡単に作ってみましょう!!
その後に右メニュー「 ER図のLoad/Save 」をクリックすると以下画面が表示されます。
CRUDを生成するボタンが新しく出来ています!!!
※まだデバッグが全て終わってないため「BETA」と書いてますが、クリックです!!!
【 CRUD: 新しいプロジェクトを用意 】
【 CRUD: ダウンロードファイルを確認しましょう 】
Zip圧縮ファイルがダウンロードされるので、Zipを展開(解凍)して中を見てみましょう!
CRUDに必要なファイルが一式入っています。
ダウンロードしたファイル( 各フォルダ内のファイル )を移動しましょう!
※welcome.blade.phpはダウンロードしたファイルへのリンクが生成されているので、上書きしてください。
【 CRUD: 配置しおわったら「 Migrate 」しましょう 】
DBや.env設定など最低限の設定が終わっていたら
php artisan migrateで、テーブルを作成してください。
【 完成: ブラウザで確認しましょう! 】
http://localhost/ (URLは開発環境によって異なります) で確認しましょう!
画面の中央に今までなかったリンクが出来ています。あなたが作ったテーブルのCRUD画面へ遷移できますよ!!
画面が古いままの場合(Cacheかも)
以下コマンドでCacheをクリアしてみましょう
php artisan cache:clear php artisan config:clear php artisan route:clear php artisan view:clear
動作した後はコードを見ると良いでしょう
- Routing
- Controller
- Views
- Model 後は、自分で変更をいれていくだけですね。
こちらのイベントで操作方法等の勘所など解説する予定!
【G'sCreativeCollection #3】GEEKs_Output_LT
Outline】
・日時:1月11日(土)17:00~19:30
・会場:ShibuyaQWS(渋谷スクランブルスクエア15F)内
・参加費:無料
・定員:30名
日本から海外へ向けたアウトプット
laravelDB.com は日本人が作り、海外でも使われるプロダクトになることを願っております。
Twitterアカウント: LaravelDB.com
m(_ _)m
- 投稿日:2020-01-07T09:53:49+09:00
【 Laravel 】Laravel DB.comで『 CRUD簡単作成 』を解説
Laravle DB.com を使って 「 ER図 → CRUD生成 」を試す!
以前にも書きましたが、Laravle DB.comでは「CRUD」のコードまで生成するようになりました。\(^o^)/
私の開発環境
- Laravel5.5/PHP7.2.1/MySQL5.6.38 (Chromeで確認)
メリット
- CRUDを自動生成!
- 超便利! ER図を保存できるので、1度作ったものを別のアプリにも転用しやすい!
- どのPCからでも同じデータを操作できる(ブラウザアプリだから)!
さあ、はじめて行きましょう!
【 LaravelDB.comへ ログイン 】
LaravelDB.com
Googleアカウントのみログイン可能です。
※現在はGoogleアカウントを持っていない人は少ないですからね〜
【 LaravelDB.comの POINT!! 】
ER図を作成していきますが重要事項があります!
<<重要>>
主キーのAutoIncrementは どのテーブルも『 id 』 と固定すること!!
LaravelのEloquentModel を便利に使うためには、どのテーブルも 『 id 』 と固定するのが吉です。
理由は「 モデル名::find($id); 」と便利に使う場合は 主キーのAutoIncrement 『 id 』 名にしておかないと動作しないからです( Laravelを勉強してる人はなんとなく知ってることでしょうか )。
※ laravelDB.comのCRUDでも生成されるファイルは「 ○○○::find($id); 」を使ってるためそ!
※ laravelに最初から入っているテーブル「user」「password_resets」は作成しないこと(migrate時に上書きしてしまいます)
※慣れれば簡単ですが、少しだけ慣れる時間は必要ですね。
【 CRUDを生成してみる! 】
まずは、ER図を簡単に作ってみましょう!!
その後に右メニュー「 ER図のLoad/Save 」をクリックすると以下画面が表示されます。
CRUDを生成するボタンが新しく出来ています!!!
※まだデバッグが全て終わってないため「BETA」と書いてますが、クリックです!!!
【 CRUD: 新しいプロジェクトを用意 】
最低限Laravelがインストールした状態 を準備します!
この時点ではまだLOGINは作らないように!
【 CRUD: ダウンロードファイルを確認しましょう 】
Zip圧縮ファイルがダウンロードされるので、Zipを展開(解凍)して中を見てみましょう!
CRUDに必要なファイルが一式入っています。
ダウンロードしたファイル( 各フォルダ内のファイル )を移動しましょう!
※welcome.blade.phpはダウンロードしたファイルへのリンクが生成されているので、上書きしてください。
【 CRUD: 配置しおわったら「 Migrate 」しましょう 】
DBや.env設定など最低限の設定が終わっていたら
php artisan migrateで、テーブルを作成してください。
【 完成: ブラウザで確認しましょう! 】
http://localhost/ (URLは開発環境によって異なります) で確認しましょう!
画面の中央に今までなかったリンクが出来ています。あなたが作ったテーブルのCRUD画面へ遷移できますよ!!作成されたindex/show/editの画面
基本的な処理が最初から出来てます!捗りそうですね!
画面が古いままの場合(Cacheかも)
以下コマンドでCacheをクリアしてみましょう
php artisan cache:clear php artisan config:clear php artisan route:clear php artisan view:clear
動作した後はコードを見ると良いでしょう
- Routing
- Controller
- Views
- Model 後は、自分で変更をいれていくだけですね。
こちらのイベントで操作方法等の勘所など解説する予定!
【G'sCreativeCollection #3】GEEKs_Output_LT
Outline】
・日時:1月11日(土)17:00~19:30
・会場:ShibuyaQWS(渋谷スクランブルスクエア15F)内
・参加費:無料
・定員:30名
日本から海外へ向けたアウトプット
laravelDB.com は日本人が作り、海外でも使われるプロダクトになることを願っております。
Twitterアカウント: LaravelDB.com
m(_ _)m
- 投稿日:2020-01-07T00:06:38+09:00
[AWS S3ファイルアップロード] Error retrieving credentials from the instance profile metadata server.
こちらのQiita記事を参考に、LaravelでAWS S3へ画像をアップロードする機能を実装しようとしていたら、以下のエラーが発生しました。
Aws\Exception\CredentialsException
Error retrieving credentials from the instance profile metadata server. (cURL error 7: (see https://curl.haxx.se/libcurl/c/libcurl-errors.html))
こちらのstackoverflowの回答の通り、以下のコマンドを叩いたら解決しました!!
$ php artisan config:clear日本語での解説がなかったので、こちらでシェアします〜!!














