Laradockを利用して開発環境を作る(データベース)

データベースの作成

laradockディレクトリに移動し、以下のコマンドを実行します。
Uオプションは、.envファイルに定義したDB_USERNAMEの値を入力してください。

% docker-compose exec workspace psql -U default -h postgres


パスワードの入力が求められます。
.envファイルに定義したDB_PASSWORDの値を入力してください。

Password for user default:
||


パスワードを変更します。
.envファイルに定義したDB_PASSWORDの値も、新しいパスワードに変更します。
>||
default=# ALTER ROLE session_user WITH PASSWORD '任意の文字列';


データベースを作成します。

default=# CREATE DATABASE skillmap;

データの変更と削除の操作を制御する

あるユーザーが登録したデータを、別のユーザーが変更・削除できないように制御します。
Laravelの認可機能のひとつであるポリシーを使って、制御します。


ポリシーを作成します。
以下のコマンドを実行してください。
appディレクトリ - Policiesディレクトリ以下に、ArticlePolicy.phpが作成されます。

% php artisan make:policy BookPolicy --model=Book


ArticlePolicy.phpを以下のように修正してください。

<?php

namespace App\Policies;

use App\Models\Book;
use App\User;
use Illuminate\Auth\Access\HandlesAuthorization;

class BookPolicy
{
    use HandlesAuthorization;

    public function viewAny(?User $user)
    {
        return true;
    }

    public function view(?User $user, Book $book)
    {
        return true;
    }

    public function create(User $user)
    {
        return true;
    }

    public function update(User $user, Book $book)
    {
        return $user->id === $book->user_id;
    }

    public function delete(User $user, Book $book)
    {
        return $user->id === $book->user_id;
    }
}


appディレクトリ - Providersディレクトリの AuthServiceProvider.phpを以下のように修正してください。

<?php

namespace App\Providers;

use App\Policies\BookPolicy;
use App\Models\Book;

use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
use Illuminate\Support\Facades\Gate;

class AuthServiceProvider extends ServiceProvider
{
    protected $policies = [
        Book::class => BookPolicy::class,
    ];

    public function boot()
    {
        $this->registerPolicies();
    }
}


appディレクトリ - Httpディレクトリ - Controllersディレクトリ の BooksController.phpを以下のように修正してください。

class BooksController extends Controller
{
    public function __construct()
    {
        $this->authorizeResource(Book::class, 'book');
    }
}


あるユーザーが登録したデータを、別のユーザーが変更・削除するとエラー画面に遷移します。

メッセージを日本語化する

configフォルダのapp.phpのlocaleを変更します。

'locale' => 'ja',

メッセージを日本語化した設定ファイルを公開している方のサイトからダウンロードします。
以下のサイトを表示してください。
github.com


Download Zipをクリックしてください。
f:id:hikotaro_san:20200507064935p:plain



ダウンロードしたファイルを解凍してください。
解凍後に作成されたフォルダ内のjaフォルダを、Laravelのresourcesフォルダのlangフォルダ以下にコピーしてください。
f:id:hikotaro_san:20200507065131p:plain



以上で、メッセージを日本語化する作業は終わりです。

シーディング機能を使ってデータを登録する

シーダーファイルを作成します。

% php artisan make:seeder BooksTableSeeder


databaseフォルダ - seedフォルダにシードファイルが作成されます。
シーダーファイルに登録するデータを書きます。

<?php

use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;

class BookTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        $book = [
            'title' => '吾輩は猫である',
            'author' => '夏目漱石',
            'price' => 500
        ];
        DB::table('books')->insert($book);

        $book = [
            'title' => '人間失格',
            'author' => '太宰治',
            'price' => 600
        ];
        DB::table('books')->insert($book);

        $book = [
            'title' => '武蔵野',
            'author' => '国木田独歩',
            'price' => 400
        ];
        DB::table('books')->insert($book);
    }
}


DatabaseSeederファイルにシーダーファイルを追加します。

<?php

use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    /**
     * Seed the application's database.
     *
     * @return void
     */
    public function run()
    {
        $this->call(BooksTableSeeder::class);
    }
}


シーディングを実行します。

% php artisan db:seed

マイグレーション機能を使ってみる

マイグレーションファイルを作成します。

% php artisan make:migration create_books_table


databaseフォルダにマイグレーションファイルが作成されます。
マイグレーションファイルにテーブルのデータ項目を追記します。

public function up()
{
    Schema::create('books', function (Blueprint $table) {
        $table->increments('id');
        $table->text('title')->nullable(false);
        $table->text('author')->nullable(false);
        $table->integer('price');
        $table->timestamps();
    });
 }

参考: データベース:マイグレーション 6.x Laravel


空のデータベースを作成します。

% touch database.sqlite


マイグレーションを実行します。

% php artisan migrate