トップページ
Laravel学習サイトLaravelやるばい

目次

アクセスに関する実装

今回はアクセスに関する実装の解説です。

下記の内容を実装します。


存在しないURLにアクセスしたらリダイレクト

現在存在しないURLにアクセスすると「404 | NOT FOUND」の表示になりますが実際のECサイトを利用している時にこれが起きたらユーザーはびっくりします。

だから存在しないURLにアクセスした場合は他のページにリダイレクトするようにします。

リダイレクトするページは商品一覧ページにします。

web.phpに下記の記述をします。

Route::fallback([ShopController::class, 'notFoundUrl']);

上記の記述は下記の記述の中には入れません。

Route::middleware('auth')->group(function () {
}

理由はログインしてない人が存在しないURLにアクセスした時に「404 | NOT FOUND」を表示しない為です。

Shopコントローラーに下記の記述をします。

public function notFoundUrl() {
    return redirect('/index')->with('message', 'アクセスしたURLは存在しません');
}

これで存在しないURLにアクセスすると下記の表示になります。

20250308_163424_ec14.jpg


商品の作成・編集・削除のリンクに購入するユーザーはアクセスできなくする

商品の作成・編集・削除のリンクはusersテーブルのidカラムの値が1以外のユーザーには表示されませんがURLを直接入力するとアクセスできます。

ECサイトとしてこれはまずいのでidカラムの値が1以外のユーザーにはURLを直接入力してもアクセスできなくします。


カラムの追加

usersテーブルにrole_typeカラムを追加します。

下記のコマンドを叩きます。

php artisan make:migration add_role_type_to_table_users --table=users

既存のテーブルにカラムを追加する時のコマンドは下記になります。

php artisan make:migration add_カラム名_to_table_テーブル名 --table=テーブル名

マイグレーションファイルに下記の記述をします。

return new class extends Migration
{
    /**
     * Run the migrations.
     */
    public function up(): void
    {
        Schema::table('users', function (Blueprint $table) {
            $table->integer('role_type')->after('password');      //この行を追加
        });
    }

    /**
     * Reverse the migrations.
     */
    public function down(): void
    {
        Schema::table('users', function (Blueprint $table) {
            $table->dropColumn('role_type');                     //この行を追加
        });
    }
};

「->after('password')」はpasswordカラムの後ろにrole_typeカラムを追加するという意味です。

マイグレーションファイルの内容を適用する前に戻すコマンドは下記になります。

php artisan migrate:rollback

適用前に戻したら追加したカラムは削除しないといけません。

その為の記述が下記になります。

$table->dropColumn('role_type');

「role_type」はカラム名です。

role_typeカラムの値を登録できるようにする為にUserモデルに下記の記述をします。

protected $fillable = [
    'name',
    'email',
    'password',
    'role_type'            //この行を追加
];

次はミドルウェアを作成します。


ミドルウェアの作成

ミドルウェアはweb.phpとコントローラーの間で発生する処理みたいな物です。

江戸時代で例えると関所を通過する時に手形がないと通過できませんが手形に当たるのがミドルウェアです。

下記のコマンドを叩きます。

php artisan make:middleware RoleType

「ec > app > Http > Middleware > RoleType.php」が作成されるので下記の記述をします。

use Illuminate\Support\Facades\Auth;    //この行を追加



public function handle(Request $request, Closure $next): Response
{


    //ここから修正
    if (Auth::check() && Auth::user()->role_type == 1) {
        return $next($request);
    }

    return redirect('/top')->with('message', 'アクセス権がありません');
    //ここまで修正

    
}

role_typeカラムの値だけアクセスができるようにします。


ミドルウェアの適用

設定したミドルウェアを使えるようにします。

「ec > app > Http > Kernel.php」に下記の記述をします。

protected $middlewareAliases = [
    'auth' => \App\Http\Middleware\Authenticate::class,
    'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
    'auth.session' => \Illuminate\Session\Middleware\AuthenticateSession::class,
    'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
    'can' => \Illuminate\Auth\Middleware\Authorize::class,
    'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
    'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class,
    'precognitive' => \Illuminate\Foundation\Http\Middleware\HandlePrecognitiveRequests::class,
    'signed' => \App\Http\Middleware\ValidateSignature::class,
    'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
    'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
];


//ここから追加
protected $routeMiddleware = [
    'role_type_access' => \App\Http\Middleware\RoleType::class,
];
//ここまで追加

「role_type_access」はweb.phpで使うミドルウェア名です。

「RoleType」はコマンドで作成したミドルウェアです。

web.phpに適用する為に下記の記述をします。

Route::middleware('auth')->group(function () {
    Route::controller(ShopController::class)->group(function () {


        //ここから修正
        Route::middleware(['role_type_access'])->group(function () {
            Route::get('/stock/create', 'create')->name('shop.create');

            Route::post('/stock/store', 'store')->name('shop.store');

            Route::delete('/stock/{stock}/delete', 'delete')->name('shop.delete');

            Route::get('/stock/{stock}/edit', 'edit')->name('shop.edit');

            Route::put('/stock/{stock}/update', 'update')->name('shop.update');
        });

        Route::get('/index', 'index')->name('shop.index');

        Route::post('/mycart/add', 'addMyCart')->name('shop.addmycart');

        Route::get('/mycart', 'myCart')->name('shop.mycart');

        Route::delete('/mycart/{cart}/delete', 'cartDelete')->name('mycart.delete');

        Route::post('/mycart/purchase', 'purchase')->name('mycart.purchase');
        //ここまで修正

        
    });
});

「Route::middleware(['role_type_access'])・・・」のrole_type_accessがKernel.phpで設定したミドルウェア名ですl。

これでusersテーブルのrole_typeカラムの値が1ではない場合にアクセスできないURLにアクセスすると下記の表示になります。

20250308_172940_ec15.jpg

最後にユーザー登録時にrole_typeカラムの値も設定できるようにします。


role_typeカラムの値の設定

「ec > Http > Controllers > Auth > RegisteredUserController.php」に下記の記述をします。

$user = User::create([
    'name' => $request->name,
    'email' => $request->email,
    'password' => Hash::make($request->password),
    'role_type' => User::count() == 0 ? 1 : 2         //この行を追加
]);

ユーザーの登録がない(usersテーブルのidカラムの値が1)場合はrole_typeカラムの値が1になり2人目のユーザーの登録からrole_typeカラムの値が2になります。

usersテーブルの情報を全て削除してユーザーの登録をし直すとrole_typeカラムの値も設定されるので確認して下さい。

これで完成です。

戻る