laravel-admin でヘッダーにアイコンを追加する

laravel-admin の issue をみていたら、ヘッダー(ユーザーアイコンやリフレッシュボタンが表示されている領域)にアイコンを追加する方法についての質問が投稿されていました。興味があって調べてみたのでその調査メモを残してきます。

まずヘッダー部分のテンプレートは vendor/encore/laravel-admin/resources/views/partials/header.blade.php に存在しますけど、ヘッダーからリフレッシュボタンなどのナビゲーションボタンを読み込む箇所は

    <!-- Navbar Right Menu -->
    <div class="navbar-custom-menu">
        <ul class="nav navbar-nav">
            {!! Admin::getNavbar()->render() !!}

という記載になっていました。Admin::getNavbar() を確認する必要がありますね。vendor/encore/laravel-admin/src/Admin.php の実装を確認すると、

/**
 * Get navbar object.
 *
 * @return \Encore\Admin\Widgets\Navbar
 */
public function getNavbar()
{
    if (is_null($this->navbar)) {
        $this->navbar = new Navbar();
    }

    return $this->navbar;
}

とあるので Encore\Admin\Widgets\Navbar の実装を確認します。vendor/encore/laravel-admin/src/Widgets/Navbar.php を確認すると、 left()、right()、add() というメソッドでナビゲーションバーに独自の element を追加できることがわかりました。

/**
 * @param $element
 *
 * @return $this
 */
public function right($element)
{
    $this->elements['right']->push($element);

    return $this;
}

例えば vendor/encore/laravel-admin/resources/views/partials/header.blade.php 直接編集し、下記のように書き換えることでメールアイコンを表示することができました。

    <!-- Navbar Right Menu -->
    <div class="navbar-custom-menu">
        <ul class="nav navbar-nav">

            <?php
            Admin::getNavbar()->right('<li><a><i class="fa fa-envelope"></i></a></li>');
            ?>

もし、リフレッシュボタンのようにコンポーネント化した上でボタンを追加するのであれば vendor/encore/laravel-admin/resources/views/components/refresh-btn.blade.php を参考にテンプレートや、SCRIPTタグで動作を設定することになります。またこれらの修正は vendor 以下のファイルを直接編集するのではなく、テンプレートをプロジェクトディレクトリにコピーした上で行う必要があります。