Laravel 5.8 CRUD

初期でログイン認証にも使えるusers/password_resetsのテーブル定義が用意されている
./database/migrations/

まずは上記のテーブル定義をDBに追加する。

## テーブル作成
テーブル定義ファイルの生成

```bash
$ php artisan make:migration create_profiles_table
```

./database/migrations/配下にテンプレートが作成される

[Laravel 5.8 データべース：マイグレーション](https://readouble.com/laravel/5.8/ja/migrations.html)

作成したテーブル定義をDBに反映させる

```bash
$ php artisan migrate
$ php artisan migrate:refresh # 再度登録するがレコードは削除される
```

### 初期値がある場合
管理ユーザーとか、導入時必ず必要なデータや
ダミーデータなどを入れて操作を確認するためにseederが用意されている。

```bash
$ php artisan make:seeder UsersTableSeeder  #新規作成
```
./database/seeds/配下にUsersTableSeeder.phpが生成される
run()内にDBへ投入するレコードを記載する。

```php:UsersTableSeeder.php
public function run()
{
    $now = new DateTimeImmutable();
    DB::table('users')->insert([
        'name' => 'hogehoge.admin',
        'email' => 'admin@example.com',
        'password' => bcrypt('password'),
        'email_verified_at' => $now,
        'created_at' => $now,
        'updated_at' => $now,
    ]);
}

```

./database/seeds/DatabaseSeeder.phpに以下の記載を追加する

```php:DatabaseSeeder.php
public function run()
{
    $this->call([
        UsersTableSeeder::class,
        # ほかにもシーダーテーブルがあれば記載
    ]);
}
```

以下のコマンドで投入

```bash
$ php artisan migrate --seed
```




## モデル定義
Usersに関しては初期状態で既に作成済のため不要

```bash
$ php artisan make:model モデル名(単数形)
```

./app配下に生成される

認可、認証機能を導入する際に変更するがとりあえず未編集のまま。

## コントロールを作る
以下のコマンドでモデルに対するControllerを作成する

```commnad.
$ php artisan make:controller UserController --resource
```

--resourceがないと空のクラス。
--resourceをつけるとCRUDに必要なメソッド一式をlaravel側で導入してくれる。
[Laravel 5.8 コントローラ](https://readouble.com/laravel/5.8/ja/controllers.html)

## ルーティングの設定
```routes/web.php
Route::resource('users', 'UserController');
```

ルーティングの確認は以下のコマンドで行う

```bash
$ php artisan route:list
+--------+-----------+-------------------+---------------+---------------------------------------------+--------------+
| Domain | Method    | URI               | Name          | Action                                      | Middleware   |
+--------+-----------+-------------------+---------------+---------------------------------------------+--------------+
|        | GET|HEAD  | /                 |               | Closure                                     | web          |
|        | GET|HEAD  | api/user          |               | Closure                                     | api,auth:api |
|        | GET|HEAD  | users             | users.index   | App\Http\Controllers\UserController@index   | web          |
|        | POST      | users             | users.store   | App\Http\Controllers\UserController@store   | web          |
|        | GET|HEAD  | users/create      | users.create  | App\Http\Controllers\UserController@create  | web          |
|        | GET|HEAD  | users/{user}      | users.show    | App\Http\Controllers\UserController@show    | web          |
|        | PUT|PATCH | users/{user}      | users.update  | App\Http\Controllers\UserController@update  | web          |
|        | DELETE    | users/{user}      | users.destroy | App\Http\Controllers\UserController@destroy | web          |
|        | GET|HEAD  | users/{user}/edit | users.edit    | App\Http\Controllers\UserController@edit    | web          |
+--------+-----------+-------------------+---------------+---------------------------------------------+--------------+
```

コントローラの各アクションを実装する。

### users.index
#### コントロール実装
UserControler.phpにモデルの宣言を追加

```php:app/Http/Controllers/UserController.php
user Illuminate\Http\Request;
use App\User; # モデル定義
(略)
public function index()
{
    $users = User::all();
    return view('users.index', ['users' => $users]);
}
```

#### ビュー実装
laravelはHTMLテンプレートにBladeを採用している
[Laravel 5.8 Bladeテンプレート](https://readouble.com/laravel/5.8/ja/blade.html)
とりあえずwelcom.blade.phpからコピーしてbody部だけ編集。
後々content部分とヘッダーフッター部を分離する。
以上部に新規追加用にAddボタン追加

```html:resources/views/users/index.blade.php
(略)
<a href={
<div class="table-responsive">
    <table class="table table-striped">
        <thead><tr><th>{{ __('ID') }}</th><th>{{ __('Name') }}</th></tr></thead>
        <tbody>
            @foreach($users as $user)
            <tr>
                <td>{{ $user->id }}</td>
                <td>{{ $user->name }}</td>
            </tr>
            @endforeach
        </tbody>
    </table>
</div>
```

`https://hoge/users/`にアクセスするとユーザー一覧(IDとName)が表示される

### users.show
次に名前を選択したら各人のページに遷移するように変更。
index.blade.phpの名前をaタグにリンクを'/users/{id}'とする。

```html:resources/views/users/index.blade.php
(略)
<div class="table-responsive">
    <table class="table table-striped">
        <thead><tr><th>{{ __('ID') }}</th><th>{{ __('Name') }}</th></tr></thead>
        <tbody>
            @foreach($users as $user)
            <tr>
                <td>{{ $user->id }}</td>
                <td><a href="{{ url('users/'.$user->id) }}">{{ $user->name }}</a></td>
            </tr>
            @endforeach
        </tbody>
    </table>
</div>
```

####コントローラを実装
モデルがEloquentモデルとして作成してある場合、
`$id`ではなく`$モデル名`でもよい

```php:app/Http/Controllers/UserController.php
(略)
//public function show($id)
public function show(User $user)
{
// $idの場合はfind()で取得
//    $user = User::find($id);
    return view('users.show', ['user' => $user]);
}
```

viewの実装。編集モードに遷移するためのEditボタン付与

```html:resources/views/users/show.blade.php
(略)
    <div class="container">
        <div class="row">
            <div class="col-sm-2">{{ __('ID') }}</div>
            <div class="col-sm-10">{{ $user->id }}</div>
            <div class="col-sm-2">{{ __('Name') }}</div>
            <div class="col-sm-10">{{ $user->name }}</div>
            <div class="col-sm-2">{{ __('E-Mail Address') }}</div>
            <div class="col-sm-10">{{ $user->email }}</div>
            <div class="col-sm-10 offset-sm-2">
                <a href="{{ url('users/'.$user->id.'/edit') }}" class="btn btn-primary">{{ __('Edit') }}</a>
                <a href="#" class="btn btn-danger">{{ __('Delete') }}</a></div>
        </div>
    </div>
```

### users.create/users.store
ユーザーの新規追加処理。
/users/createで画面表示。画面内にForm作成。
formのアクションに`/users/store`を指定する。

####コントローラ
```php:app/Http/Controllers/UserController.php
(略)
public function create()
{
    return view('users.edit'); // 表示はeditと同じにする。
}
public function store(Request $request)
{
    $user = new User;
    $user->name = $request->name;
    $user->email = $request->email;
    $user->password = $request->password;
    $user->save();
    // 新規登録されたidでshow画面にリダイレクトする
    return redirect('users/'.$user->id);
}
```

####ビュー
edit.blade.phpと同じになるようにする。
editかcreateの違いは$userがあるか否か

```html:resources/views/users/edit.blade.php
(略)
    <div class="container">
        <div class="row">
@isset($user)
            <form action="{{ url('users/'.$user->id) }}" method="post">
                @method('PUT')
@else
            <form action="{{ url('users') }}" method="post">
                @method('POST')
@endisset
                <div class="form-row">
                    <div class="form-group col-sm-12">
                        <label for="name">{{ __('Name') }}</label>
                        <input type="text" class="form-control" id="name" name="name" value="{{ old('name', isset($user) ? $user->name : '') }}" placeholder="{{ __('Name') }}">
                    </div>
                </div>
                <div class="form-row">
                    <div class="form-group col-sm-6">
                        <label for="email">{{ __('E-Mail Address') }}</label>
                        <input type="email" class="form-control" id="email" name="email" value="{{ old('email', isset($user) ? $user->email : '') }}" placeholder="{{ __('E-Mail Address') }}">
                    </div>
{{-- passwordは新規のみ --}}
@if(!isset($user))
                    <div class="form-group col-sm-6">
                        <label for="password">{{ __('Password') }}</label>
                        <input type="password" class="form-control" id="password" name="password" value="{{ old('password', isset($user) ? $user->password : '') }}" placeholder="{{ __('Password') }}">
                    </div>
@endif
                </div>
                <button type="submit" name="submit" class="btn btn-primary">{{ __('Submit') }}</a>
            </form>
        </div>
    </div>
```

### users.edit/users.update
ユーザーの更新処理

####コントロール
```php:app/Http/Controllers/UserController.php
(略)
public function edit(User $user)
{
    return view('users.edit', ['user' => $user]); // 表示はeditと同じにする。
}
public function update(Request $request, User $user)
{
    $user->name = $request->name;
    $user->save();
    return redirect('users/'.$user->id);
}
```

####ビュー
createで作成したものを使用

### users.destory
ユーザーの削除処理

####コントロール
```php:app/Http/Controllers/UserController.php
(略)
public function destory(User $user)
{
    $user->delete();
    return redirect('users');
}
```

####ビュー
show.balde.phpの削除ボタンを実装

```html:resources/views/users/show.blade.php
(略)
    <div class="container">
        <div class="row">
            <div class="col-sm-2">{{ __('ID') }}</div>
            <div class="col-sm-10">{{ $user->id }}</div>
            <div class="col-sm-2">{{ __('Name') }}</div>
            <div class="col-sm-10">{{ $user->name }}</div>
            <div class="col-sm-2">{{ __('E-Mail Address') }}</div>
            <div class="col-sm-10">{{ $user->email }}</div>
            <div class="col-sm-10 offset-sm-2">
                <a href="{{ url('users/'.$user->id.'/edit') }}" class="btn btn-primary">{{ __('Edit') }}</a>
                <form action="{{ url('users/'. $user->id) }}" method="post" style="display:inline;">
                    @csrf
                    @metod('DELETE')
                    <button type="submit" name="submit" class="btn btn-danger">{{ __('Delete') }}</button>
                </form>
            </div>
        </div>
    </div>
```

これだと誰でも編集できるのでログイン認証を導入する。