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を作成して追加します。
今回は、自動生成されたJetstreamServiceProvider
とFortifyServiceProvider
をあまり活用していかないため、自動生成されたJetstreamServiceProvider
とFortifyServiceProvider
を使用してオリジナルのJetstreamServiceProvider
とFortifyServiceProvider
を拡張して行きたいと思います。あまり必要ないと思われますが、コマンド関係の機能は残してあります。
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機能を実装できると思います。