ここではユーザが自身のProfileを確認できるようにしよう.
routes/web.php (抜粋)
Route::get('/', function () {
return view('welcome');
});
Route::get('/auth/verifyemail/{token}', 'Auth\RegisterController@verify');
Auth::routes();
Route::get('/home', 'HomeController@index')->name('home');
Route::get('/users/{id}', 'UsersController@show');
artisan コマンドでコントローラを作成する.この作業で app/Http/Controllers/UsersController.php が生成される.
[GakuinHana@rin06 laravelUser]$ php artisan make:controller UsersController ⏎ Controller created successfully. [GakuinHana@rin06 laravelUser]$
生成されたファイルを編集し,show 関数を作る.
app/Http/Controllers/UsersController.php
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class UsersController extends Controller
{
public function show($id)
{
dd($id);
}
}
Webサーバを再起動し,ログアウトした状態で /users/1 や /users/2 にアクセスしてみる.ログインすることなく接続できてしまう.UsersController のすべてのアクションに対して認証を要求するために,次のような関数を追加する.
app/Http/Controllers/UsersController.php
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class UsersController extends Controller
{
public function __construct()
{
// コントローラの全アクションに対して認証を要求する
$this->middleware('auth');
}
public function show($id)
{
dd($id);
}
}
上の関数を追加することで,/users/1 などを指定するとログイン画面に転送されるようになった.
認証ができたので,自分の Profile を取得しよう.
app/Http/Controllers/UsersController.php
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\User;
class UsersController extends Controller
{
public function __construct()
{
// コントローラの全アクションに対して認証を要求する
$this->middleware('auth');
}
public function show($id)
{
$user = User::find($id);
dd($user);
}
}
/users/1 や /users/2 を表示してみよう.ユーザ情報を取得できている.
/users/1 や /users/2 を表示してみよう.ユーザ情報を取得できている.ただし,他人の情報まで表示できてしまうのは問題である.自分の情報だけを表示できるようにしよう.
app/Http/Controllers/UsersController.php (抜粋)
public function show($id)
{
if (\Auth::user()->id != $id){
// ログインしているユーザidと表示しようとしている$idが異なる
return redirect('/home');
}
$user = User::find($id);
dd($user);
}
上の編集の結果,他人のページを表示しようとしたときには /home へ強制的にリダイレクトされ,自分のProfileだけが表示できるようになった.
コントローラを修正して,ビューにユーザ情報を渡すようにする.
app/Http/Controllers/UsersController.php (抜粋)
public function show($id)
{
if (\Auth::user()->id != $id){
// ログインしているユーザidと表示しようとしている$idが異なる
return redirect('/home');
}
$user = User::find($id);
return view('users.show')
->with('user', $user);
}
resources/views/users フォルダを作成し,この中に show.blade.php を作成する.このファイルに次のような内容を記述する.なお,resources/views/home.blade.php をコピーして一部変更するだけで良い.
resources/views/users/show.blade.php
@extends('layouts.app')
@section('content')
<div class="container">
<div class="row">
<div class="col-md-8 col-md-offset-2">
<div class="panel panel-default">
<div class="panel-heading">Profile</div>
<div class="panel-body">
@if (session('status'))
<div class="alert alert-success">
{{ session('status') }}
</div>
@endif
<dl>
<dt>id</dt>
<dd>{{ $user->id }}</dd>
<dt>name</dt>
<dd>{{ $user->name }}</dd>
<dt>email</dt>
<dd>{{ $user->email }}</dd>
<dt>login_id</dt>
<dd>{{ $user->login_id }}</dd>
<dt>created_at</dt>
<dd>{{ $user->created_at }}</dd>
</dl>
</div>
</div>
</div>
</div>
</div>
@endsection
これで /users/1 から自分の情報を表示できるようになった.
/home から自分のprofileページへのリンクを設置する.
resources/views/layouts/app.blade.php (抜粋)
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false">
{{ Auth::user()->name }} <span class="caret"></span>
</a>
<ul class="dropdown-menu" role="menu">
<li>
<a href="{{ route('logout') }}"
onclick="event.preventDefault();
document.getElementById('logout-form').submit();">
Logout
</a>
<form id="logout-form" action="{{ route('logout') }}" method="POST" style="display: none;">
{{ csrf_field() }}
</form>
</li>
<li>
<a href="{{ action('UsersController@show', Auth::user()->id) }}">
Profile
</a>
</li>
</ul>
</li>
これで各ユーザの /home からProfileへリンクできるようになった.