月: 2021年10月

  • 【Laravel】Gateとは

    【Laravel】Gateとは

    参加しているLaravelのプロジェクトでGateというものを扱うタイミングがあった。
    それの忘備録です。

    Gateとは

    Laravelは特定のリソースに対するユーザーアクションを認可する手軽な方法を提供している

    • 組み込み認証サービス
    • 認証されているユーザーでもDBのレコードの更新や削除ができない

    Laravelが提供しているアクションを認可する2つの具体例が次

    • Gate
    • Policy

    これらはRoutesやControllerのようなもの、と考えてok

    Gate

    クロージャーベースのシンプルなアプローチを提供する

    Policy

    Controllerの様に特定のModelやリソース周辺のロジックをひと塊にまとめる

    今回は「Gate」についてまとめる

    Gate

    Gateは、ユーザーが特定のアクションを実行することを許可されているかどうかを判断する単なるクロージャーである。

    • 通常、GateはGate Facadesを使用してApp\Providers\AuthServiceProviderクラスのbootメソッド内で定義される
    • Gateは常に最初の引数としてユーザーインスタンスを受け取る
    • オプションで関連するEloquentモデルなど追加の引数を受け取れる

    Gateを使った例

    <?php
    use App\Models\Post;
    use App\Models\User;
    use Illuminate\Support\Facades\Gate;
    
    /**
     * 全認証/認証サービスを登録
     *
     * @return void
     */
    public function boot()
    {
        $this->registerPolicies();
    
        Gate::define('update-post', function (User $user, Post $post) {
            return $user->id === $post->user_id;
        });
    }

    上記の例では、ユーザーが特定のApp\Models\Postモデルを更新できるかどうかを判断するGateを定義した。ユーザーのidとPostを作成したuser_idを比較している。

    アクションの認可

    Gateを使用してアクションを認可するにはGate Facadesが提供するallowsかdeniesメソッドを使う必要がある。すでに認証済みのユーザーをこれらのメソッドに渡す必要はない。Laravelは自動的にユーザーをGateクロージャーに渡す。一般的には、認可が必要なアクションを実行する前に、アプリケーションのController内でGate認可メソッドを呼び出す。

    <?php
    namespace App\Http\Controllers;
    
    use App\Http\Controllers\Controller;
    use App\Models\Post;
    use Illuminate\Http\Request;
    use Illuminate\Support\Facades\Gate;
    
    class PostController extends Controller
    {
        /**
         * 指定した投稿を更新
         *
         * @param \Illuminate\Http\Request $request
         * @param \App\Models\Post $post
         * @return \Illuminate\Http\Response
         * /
        public function update(Request $request, Post $post)
        {
            if (! Gate::allows('update-post', $post)) {
                abort(403);
            }
        
            // 投稿を更新する処理
        }
    }

    この様にLaravelのGateを使えば、そのユーザーに対してアクションを制限することができる。

  • React Nativeで新しいアプリを作る

    React Nativeで新しいアプリを作る

    今回はReact Nativeで新しいプロジェクトを開始する方法をお伝えします。

    Expoを使います

    私は自分でReact Nativeで開発するときな実機で挙動を見たいので、Expoを使っています。

    今回はExpoを使用した方法をお伝えします。

    expo init app-name

    今回は例として「app-name」というアプリを作ることを想定します。

    上記のコマンドでapp-nameという名前のプロジェクト(=アプリ)がディレクトリに設置されます。

  • CRUDとは

    CRUDとは

    よく聞くCRUDとは何か、整理できてなかったからまとめてみた。

    システムの最低要件

    システムを作るとき、めっちゃ簡単に言うとWebサイトを作るときに最低限必要と言われている要件のこと。

    Create

    CreateのC、「作成」とか「登録」とか表現する。

    Twitterだとツイート機能、ブログだと投稿機能。

    これらがCreateにあたる。

    Read

    ReadのR、「参照」とか「閲覧」のこと。

    サイトを見る(=閲覧)のに必要な機能。

    これがないと何も始まらない感じはある(=なくても良い珍しいシステムもあるかもだけど)。

    Update

    UpdateのU、「更新」のこと。

    一度作ったブログ記事を更新したりできる。

    珍しく(?)TwitterにこのUpdate機能はない。一度投稿したら、そのツイートを描き直すことはできない。

    Delete

    DeleteのD、「削除」のこと。

    間違えて投稿したツイートを削除したり、誤った情報を載せたブログ記事を削除したりするやつ。

    まとめ

    システムに必要な機能の頭文字を取っている。

    機能を指してるだけで、HTTPメソッドとは似ているが全く別物。

    CRUDの中にHTTPメソッドが含まれているイメージ。

  • Seederとは

    Seederとは

    会社のインターンで「Seeder」に遭遇した。

    Seederとは何かまとめた。

    Seederに遭遇した状況

    会社のインターンに参加して初日に開発環境構築をしてた。

    会社ではLaravelを使っている。

    会社の仕様書があって、それ通りにパソコンの環境を揃えていた。

    Docker内に環境を作っていたが、本番環境と同様のDBをmigrateで生成した。

    https://sunablog.tokyo/2021/08/11/post-2091/
    Migrationについては、この投稿を参考

    そのあとに「Seederを実行するように」と言われた。

    ここで初対面した。

    Seederでできること

    Seederを使うとDBにダミーデータを挿入することができる。

    下からの説明を見れば分かる。

    Seederに実行方法

    以下のようにコマンドを実行するとUserTableSeeder.phpというファイルが生成される。

    php artisan make:seeder UserTableSeeder

    このファイル内のrunメソッドにDBのtableに挿入したい実際のデータを記述する。

    例えば以下のようになる。

    <?php
    
    namespace Database\Seeders;
    
    use Illuminate\Database\Seeder;
    use Illuminate\Support\Facades\DB;
    
    class UserTableSeeder extends Seeder
    {
        public function run()
        {
            DB::table('users')->insert([
                'name' => 'suna',
                'email' => 'suna_sample@email.com',
                'sex' => 'male'
            ]);
        }
    }

    これのみだとSeederファイルを設定しただけなので、これを実際に作動させれるようにDatabaseSeeder.phpファイルで先ほどのUserTableSeeder.phpが呼び出されるように処理を書く。

    <?php
    
    namespace Database\Seeders;
    
    use Illuminate\Database\Seeder;
    
    class DatabaseSeeder extends DatabaseSeeder
    {
        public function run()
        {
            $this->call('UserTableSeeder::class');
        }
    }

    これでプログラムは完了。

    次のコマンドを実行することで、実際にSeederが作動してDBにデータが挿入される。

    php artisan db:seed --class=UserTableSeeder