前回の続きです。
前の記事では、2つのコマンドを実行することにより、ユーザ登録機能やログイン機能が実装されました。
ただ、システムによっては外部からユーザを作成されてはいけない場合もあります。
ここでは、ユーザ登録機能のオンオフやルーティングの設定切替を行っていきましょう。
※この記事の実施前に1ユーザだけ作って置きましょう。
単純にログイン後に切り替える
ユーザの作成機能のコントローラ(RegisterController)のコンストラクタ(__construct)には、ログイン前でもアクセス可とする記述があります。
$this->middleware('guest');
これをログイン後でないと入れなくする記述に変えてあげればログイン後のみユーザ登録可能となります。
$this->middleware('auth');
この状態でログイン前とログイン後でユーザ登録画面にそれぞれ遷移してみましょう。
設定が切り替わっていることに気づくかと思います。
この方法の問題点は、コントローラで設定をしなければいけないという点です。
本来は、このような設定は一貫してweb.phpに記述したいところです。
ユーザ登録機能を自作する
手間は掛かりますが、ユーザ登録機能を自作することで自由な設定が可能となります。
1から作るのは更に手間なので既に作られているRegisterController.php等を修正して登録画面を作成してみましょう。
web.phpの確認と作られたユーザ登録の停止
routes\web.phpを確認してみましょう。
既に気づいている人も居るかもしれませんが、「php artisan make:auth」コマンドを実行した後に、以下の一行が追加されます。
Auth::routes();
「web.php」は、どのURLでどのコントローラの関数が動作するか、getやpost、権限等を設定することができます。
(どのURLでどのコントローラの関数が動作するか→「ルーティング」と言ったりします。)
コマンドによって作られる「Auth::routes()」によってユーザ登録やログインのルーティングが行われていますが、この1行では簡易的すぎて意味がわかりません。
ですが、「Auth::routes()」にはオプションとして引数を渡すことで使わない機能を制御することができます。
以下の様に引数を入れてみましょう。
Auth::routes([
'register' => false // ユーザ登録機能をオフに切替
]);
このようにすることでLaravelによって用意されている登録機能を使えなくすることができます。
RegisterController.phpの修正
app\Http\Controllers\Auth\RegisterController.phpを修正します。
ここでは以下の様にしました。※簡易的に実装しています
<?php
namespace App\Http\Controllers\Auth;
use App\User;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Hash;
use Illuminate\Http\Request;
class RegisterController extends Controller
{
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
}
/**
* ユーザ登録画面の表示
* @return \Illuminate\View\View|\Illuminate\Contracts\View\Factory
*/
public function getRegister()
{
return view('auth.register');
}
/**
* ユーザ登録機能
* @param array $data
* @return unknown
*/
public function postRegister(Request $data)
{
// ユーザ登録処理
User::create([
'name' => $data['name'],
'email' => $data['email'],
'password' => Hash::make($data['password']),
]);
// ホーム画面へリダイレクト
return redirect('/home');
}
}
__constructは、後々使う可能性があるので残しています。
validatorを消したことで入力チェックが無くっていますがこれは、別の記事で実装していくため、割愛します。
あとはコメントにある通り、ユーザ登録画面の表示と登録ボタンの押下時の機能を実装しました。
登録後はホーム画面へリダイレクトするようにしています。
web.phpに追記
自作のユーザ登録の為web.phpにルーティングの設定を行う必要があります。
以下の2行をweb.phpに追記してください。
Route::get('/register', 'Auth\RegisterController@getRegister')->name('register');
Route::post('/register', 'Auth\RegisterController@postRegister')->name('register');
動作確認
まず一度この状態で動作確認してみましょう。ユーザ登録機能が動作していれば問題ありません。
この状態では、ログイン前にユーザ登録画面が開けてしまうと思います。
(この状態だと登録後にログイン画面に戻されます)
web.phpの修正
web.phpにはログイン前後のアクセス許可についても記述可能です。
ログイン後のみアクセス可能とするには以下の記述を使っていきます。
Route::group(['middleware' => 'auth'], function() {
// ここにログイン後のみのルーティングを記述
});
先ほど追記した2行を上記の記述と合わせていきます。
具体的には以下の様になります。
Route::group(['middleware' => 'auth'], function() {
// ここにログイン後のみのルーティングを記述
Route::get('/register', 'Auth\RegisterController@getRegister')->name('register');
Route::post('/register', 'Auth\RegisterController@postRegister')->name('register');
});
再度動作確認
ログイン前は登録画面に遷移できなくなったはずです。
ログイン後でなら登録画面が動作することも確認しておきましょう。
まとめ
Laravelのユーザ登録機能は、ログイン前にアクセスする前提で作られています。
なのでログイン後のみにするには、修正を加える必要がありました。
登録などの画面作成やコントローラは別の記事でも紹介していますが今回はルーティングの知識が主になるかと思います。
ログインすることがあるアプリであれば必ず通るところなのでルーティングについてはマスターしておきましょう。