Laravel JetstreamでデフォルトのルーティングやLivewireを無効化にする

Laravel JetstreamでデフォルトのルーティングやLivewireを無効化にする

Laravel8よりlaravel/uiは非推奨となり、laravel/jetstreamが認証系推奨ライブラリとなりました。

しかし、laravel/jetstreamでは、Tailwind CSSやLivewire、Inertiaの使用を強要されてしまいます。

Tailwind CSSはまだしもLivewireやInertiaは採用しないケースが殆どだと思いますので、それらの機能を無効化する方法をご紹介します。

また、合わせてルーティング設定やcontrollerの変更方法もご紹介します。

動作環境

  • laravel/framework v8.0.4
  • laravel/jetstream v1.1.2

無効化手順

本記事は以下のようなコマンドでLaravel Jetstreamが初期設定されているとした上でデフォルトのルーティング解除などの手順などをご紹介します。

$ php artisan jetstream:install livewire --teams
$ npm install && npm run dev
$ php artisan migrate

対象ライブラリの自動読み込みの解除

まず、対象ライブラリの自動読み込みを解除します。composer.jsonに以下の記述を追加してください。

"extra": {
    "laravel": {
        "dont-discover": [
            "laravel/fortify",
            "laravel/jetstream"
        ]
    }
}

キャッシュが残っている場合、以下のコマンドでキャッシュを削除することができます。

$ php artisan config:clear

ServiceProviderの追加

ServiceProviderの自動読み込みを解除したので、ServiceProviderを作成して追加します。

今回は、自動生成されたJetstreamServiceProviderFortifyServiceProviderをあまり活用していかないため、自動生成されたJetstreamServiceProviderFortifyServiceProviderを使用してオリジナルのJetstreamServiceProviderFortifyServiceProviderを拡張して行きたいと思います。あまり必要ないと思われますが、コマンド関係の機能は残してあります。

App/Providers/JetstreamServiceProvider.php

<?php

namespace App\Providers;

use App\Actions\Jetstream\AddTeamMember;
use App\Actions\Jetstream\CreateTeam;
use App\Actions\Jetstream\DeleteTeam;
use App\Actions\Jetstream\DeleteUser;
use App\Actions\Jetstream\UpdateTeamName;
use Laravel\Jetstream\Jetstream;
use Laravel\Jetstream\JetstreamServiceProvider as BaseServiceProvider;

class JetstreamServiceProvider extends BaseServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        // Laravel\Jetstream\JetstreamServiceProvider
        \Laravel\Fortify\Fortify::viewPrefix('auth.');
        $this->configurePublishing();
        $this->configureCommands();

        // App\Providers\JetstreamServiceProvider
        $this->configurePermissions();

        Jetstream::createTeamsUsing(CreateTeam::class);
        Jetstream::updateTeamNamesUsing(UpdateTeamName::class);
        Jetstream::addTeamMembersUsing(AddTeamMember::class);
        Jetstream::deleteTeamsUsing(DeleteTeam::class);
        Jetstream::deleteUsersUsing(DeleteUser::class);
    }

    /**
     * Configure the roles and permissions that are available within the application.
     *
     * @return void
     */
    protected function configurePermissions()
    {
        Jetstream::defaultApiTokenPermissions(['read']);

        Jetstream::role('admin', 'Administrator', [
            'create',
            'read',
            'update',
            'delete',
        ])->description('Administrator users can perform any action.');

        Jetstream::role('editor', 'Editor', [
            'read',
            'create',
            'update',
        ])->description('Editor users have the ability to read, create, and update.');
    }
}

App/Providers/FortifyServiceProvider.php

<?php

namespace App\Providers;

use App\Actions\Fortify\CreateNewUser;
use App\Actions\Fortify\ResetUserPassword;
use App\Actions\Fortify\UpdateUserPassword;
use App\Actions\Fortify\UpdateUserProfileInformation;
use Laravel\Fortify\Fortify;
use Laravel\Fortify\FortifyServiceProvider as BaseServiceProvider;

class FortifyServiceProvider extends BaseServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        // Laravel\Fortify\FortifyServiceProvider
        $this->configurePublishing();

        // App\Providers\FortifyServiceProvider
        Fortify::createUsersUsing(CreateNewUser::class);
        Fortify::updateUserProfileInformationUsing(UpdateUserProfileInformation::class);
        Fortify::updateUserPasswordsUsing(UpdateUserPassword::class);
        Fortify::resetUserPasswordsUsing(ResetUserPassword::class);
    }
}

独自ルートと独自Controllerの追加

独自ルートの追加

fortify/routes及びjetstream/routesの内容を参考に追加していきます。

e.g. ログインフォーム追加

Route::group(['middleware' => config('fortify.middleware', ['web'])], function () {
    // Authentication...
    Route::get('/admin/login', 'App\Http\Controllers\Auth\AuthenticatedSessionController@create')
                ->middleware(['guest'])
                ->name('login');

    $limiter = config('fortify.limiters.login');

    Route::post('/admin/login', 'App\Http\Controllers\Auth\AuthenticatedSessionController@store')
                ->middleware(array_filter([
                    'guest',
                    $limiter ? 'throttle:'.$limiter : null,
                ]));
});

独自Controllerの追加

Controllerもfortify/routes及びjetstream/routesの内容を参考に追加していきます。

e.g. ログインフォームで使用するtemplateの変更

<?php

namespace App\Http\Controllers\Auth;

use Illuminate\Http\Request;
use Laravel\Fortify\Http\Controllers\AuthenticatedSessionController as BaseController;

class AuthenticatedSessionController extends BaseController
{
    public function create(Request $request)
    {
        return view('auth.login');
    }
}

おわりに

現状、laravel/jetstreamはルートの変更やcontrollerの変更が簡単に追加ができないため、Authの足場とはとても言いにくいでしょう。

Laravelのコミュニティでも不満が多くあったためにLaravel8に非推奨になったlaravel/uiがインストールできるようにアップデートされました。

非推奨になっているものを使用するのは、少しセキュリティ面での不安は残りますが、現状はlaravel/jetstreamを使用するよりかは、laravel/uiを使用した方が滞りなくAuth機能を実装できると思います。

参考サイト