初期でログイン認証にも使えるusers/password_resetsのテーブル定義が用意されている
./database/migrations/
まずは上記のテーブル定義をDBに追加する。
テーブル作成
テーブル定義ファイルの生成
$ php artisan make:migration create_profiles_table
./database/migrations/配下にテンプレートが作成される
作成したテーブル定義をDBに反映させる
$ php artisan migrate
$ php artisan migrate:refresh # 再度登録するがレコードは削除される
初期値がある場合
管理ユーザーとか、導入時必ず必要なデータや
ダミーデータなどを入れて操作を確認するためにseederが用意されている。
$ php artisan make:seeder UsersTableSeeder #新規作成
./database/seeds/配下にUsersTableSeeder.phpが生成される
run()内にDBへ投入するレコードを記載する。
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に以下の記載を追加する
public function run()
{
$this->call([
UsersTableSeeder::class,
# ほかにもシーダーテーブルがあれば記載
]);
}
以下のコマンドで投入
$ php artisan migrate --seed
モデル定義
Usersに関しては初期状態で既に作成済のため不要
$ php artisan make:model モデル名(単数形)
./app配下に生成される
認可、認証機能を導入する際に変更するがとりあえず未編集のまま。
コントロールを作る
以下のコマンドでモデルに対するControllerを作成する
$ php artisan make:controller UserController --resource
--resourceがないと空のクラス。
--resourceをつけるとCRUDに必要なメソッド一式をlaravel側で導入してくれる。
Laravel 5.8 コントローラ
ルーティングの設定
Route::resource('users', 'UserController');
ルーティングの確認は以下のコマンドで行う
$ 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にモデルの宣言を追加
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テンプレート
とりあえずwelcom.blade.phpからコピーしてbody部だけ編集。
後々content部分とヘッダーフッター部を分離する。
以上部に新規追加用にAddボタン追加
(略)
<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}'とする。
(略)
<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
ではなく$モデル名
でもよい
(略)
//public function show($id)
public function show(User $user)
{
// $idの場合はfind()で取得
// $user = User::find($id);
return view('users.show', ['user' => $user]);
}
viewの実装。編集モードに遷移するためのEditボタン付与
(略)
<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
を指定する。
コントローラ
(略)
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があるか否か
(略)
<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
ユーザーの更新処理
コントロール
(略)
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
ユーザーの削除処理
コントロール
(略)
public function destory(User $user)
{
$user->delete();
return redirect('users');
}
ビュー
show.balde.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>
これだと誰でも編集できるのでログイン認証を導入する。