Components ファイル複製

multi authで管理者ログインを作成して、dashboard.phpをadminフォルダーに複製して使うと見た目はjetstreamできれいに収まる。
しかし、そのままだとリンクもそのままなので、すぐにフロント側にもどってしまう。

\app\View\Components

dashboardを見てみると、<x-app-layout>で囲まれている。xケバブ。
xケバブは、\app\View\Componentsに登録されているという意味らしい。なるほど、そこにAppLayout.phpという、それらしいのがある。

<?php

namespace App\View\Components;

use Illuminate\View\Component;

class AppLayout extends Component
{
    /**
     * Get the view / contents that represents the component.
     *
     * @return \Illuminate\View\View
     */
    public function render()
    {
        return view('layouts.app');
    }
}

要するに、views/layoutsのapp.blade.phpが対象になる。
これを改変するのでもよいかもしれないが、adminapp.blade.phpとして複製する。
dashboard.phpは<x-adminapp-layout>で囲むことになる。
しかしながら、xケバブは、\app\View\Componentsに登録されている必要があるので、AppLayout.phpをAdminappLayout.phpとして複製する。
これは、\app\View\Componentsフォルダーにあるというだけで、xケバブは有効になる。

<?php

namespace App\View\Components;

use Illuminate\View\Component;

class AdminappLayout extends Component
{
    /**
     * Get the view / contents that represents the component.
     *
     * @return \Illuminate\View\View
     */
    public function render()
    {
        return view('layouts.adminapp');
    }
}

JetstreamServiceProvider

adminapp.blade.phpで、上部のナビゲーションバーに当たるものは、

@livewire('navigation-menu')

で指定されている。

livewireコンポーネント。これも単に複製するだけでは動作しない。
これらのコンポーネントは、\vendor\laravel\jetstream\src\JetstreamServiceProviderに登録されている。


抜粋

-----
use Laravel\Jetstream\Http\Livewire\NavigationMenu;
use Laravel\Jetstream\Http\Livewire\NavigationadminMenu;
-----

    public function register()
    {
        $this->mergeConfigFrom(__DIR__.'/../config/jetstream.php', 'jetstream');

        $this->app->afterResolving(BladeCompiler::class, function () {
            if (config('jetstream.stack') === 'livewire' && class_exists(Livewire::class)) {
                Livewire::component('navigation-menu', NavigationMenu::class);
                Livewire::component('navigationadmin-menu', NavigationadminMenu::class);
                Livewire::component('profile.update-profile-information-form', UpdateProfileInformationForm::class);
                Livewire::component('profile.update-password-form', UpdatePasswordForm::class);
                Livewire::component('profile.two-factor-authentication-form', TwoFactorAuthenticationForm::class);
                Livewire::component('profile.logout-other-browser-sessions-form', LogoutOtherBrowserSessionsForm::class);
                Livewire::component('profile.delete-user-form', DeleteUserForm::class);

                if (Features::hasApiFeatures()) {
                    Livewire::component('api.api-token-manager', ApiTokenManager::class);
                }

                if (Features::hasTeamFeatures()) {
                    Livewire::component('teams.create-team-form', CreateTeamForm::class);
                    Livewire::component('teams.update-team-name-form', UpdateTeamNameForm::class);
                    Livewire::component('teams.team-member-manager', TeamMemberManager::class);
                    Livewire::component('teams.delete-team-form', DeleteTeamForm::class);
                }
            }
        });
    }

<x-jet ケバブ

protected function configureComponents()
{
    $this->callAfterResolving(BladeCompiler::class, function () {
        $this->registerComponent('action-message');
        $this->registerComponent('action-section');
        $this->registerComponent('application-logo');
        $this->registerComponent('application-mark');
        $this->registerComponent('authentication-card');
        $this->registerComponent('authentication-card-logo');
        $this->registerComponent('banner');
        $this->registerComponent('button');
        $this->registerComponent('confirmation-modal');
        $this->registerComponent('confirms-password');
        $this->registerComponent('danger-button');
        $this->registerComponent('dialog-modal');
        $this->registerComponent('dropdown');
        $this->registerComponent('dropdown-link');
        $this->registerComponent('form-section');
        $this->registerComponent('input');
        $this->registerComponent('checkbox');
        $this->registerComponent('input-error');
        $this->registerComponent('label');
        $this->registerComponent('modal');
        $this->registerComponent('nav-link');
        $this->registerComponent('responsive-nav-link');
        $this->registerComponent('responsive-switchable-team');
        $this->registerComponent('secondary-button');
        $this->registerComponent('section-border');
        $this->registerComponent('section-title');
        $this->registerComponent('switchable-team');
        $this->registerComponent('validation-errors');
        $this->registerComponent('welcome');
    });
}

Laravel\Jetstream\Http\Livewire\NavigationadminMenu.phpを作り、JetstreamServiceProviderに追加する。

\vendor\laravel\jetstream\src\Http\Livewire\NavigationadminMenu.php

<?php

namespace Laravel\Jetstream\Http\Livewire;

use Livewire\Component;

class NavigationadminMenu extends Component
{
    /**
     * The component's listeners.
     *
     * @var array
     */
    protected $listeners = [
        'refresh-navigation-menu' => '$refresh',
    ];

    /**
     * Render the component.
     *
     * @return \Illuminate\View\View
     */
    public function render()
    {
        return view('navigationadmin-menu');
    }
}

navigation-menuからnavigationadmin-menuを複製する。

これで、adminapp.blade.phpの
 @livewire('navigation-menu') を@livewire('navigationadmin-menu')に変更しても動作する。

カスタマイズが可能となりそう。