Laravel Admin Barというパッケージを開発しました。

# 初めてのパッケージ開発
Laravelに簡単にAdmin Barを追加できるパッケージを開発しました。
### Admin Barとは?
ブログシステムなどのフロント側のページを表示している時に表示される管理者用のツールバーのことです。
Wordpressにもありますね。

<img width="724" alt="スクリーンショット 2019-02-01 18.45.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/43996/d9e2d741-8e5b-ca9d-cd20-14942179cb44.png">

自分の作った記事を読んでいて、誤字をみつけて編集したいという時などにツールバーに[この記事を編集する]みたいなボタンがあると便利ですよね。

### なぜ作ったの?
[wink](https://github.com/writingink/wink)という、MediumやGhostのようなブログサービスのLaravel版みたいなOSSがあるのですが、それにAdmin Barの機能がなかったのでパッケージを作ることにしました。
wink用のラッパーのパッケージを作ってあとでwinkに組み込んでくれないか聞いてみようと思っています。

ちなみにwinkはLaravelの開発メンバーの一人がやっています。ソースが綺麗で勉強になるのとまだリリースされたばかりなのでOSSに参加してみたいという方はみてみるといいかもしれません。


### 基本的な使い方

詳しい使用方法は[GitHub](https://github.com/shrft/laravel-admin-bar)に上げてあります。(現在は英語のみ)

設定は全てconfigファイルでできる様になっています。

1. まずはinstall

```
composer require shrft/laravel-admin-bar
```

2. 次に設定ファイルなどを追加します。

```
php artisan vendor:publish --provider="Shrft\AdminBar\AdminBarServiceProvider"
```

publishコマンド実行してもらうとconfigディレクトリ配下にadminbar.phpというファイルが作成されますので
そのファイルを編集します。

以下はconfig/adminbar.phpに説明を記入したものです。

```php
return array(

     // falseにするとAdmin Barが無効になります。
    'enabled'=>true,

    /**
     * 除外するURL。管理画面ではAdmin Bar不要だと思いますので、ここで管理画面のパスを指定してください。
     * 現在のURLがここで指定したパスに一致するかどうかは Request::is()を利用してチェックしています。
     **/
    'excludes' => 'admin/*',

    /**
     * 管理者としてログインしている場合のみAdmin Barを表示するため管理者かどうかチェックするためのロジック
     * をここに追加してください。
     */
    'is_admin' => function(){

        //例としてこんな感じのチェック処理を入れてみました。常に表示したい場合は、trueを返してもらえればOKです。
       if( Auth::user() &&  Auth::user()->isAdmin()){
           return true;
       }
       return false;
    },
    /**
     * ここで表示する内容を指定します。
     * */
    'menus' => array(
        // タイトルはメニューに表示される名称、pathは表示されるリンクです。
        ['title'=>'管理画面TOP', 'path'=>'/admin'], // こんなリンクが追加されます。-> <a href="/admin">管理画面TOP</a>
        ['title'=>'記事の追加', 'path'=>'/admin/post/new'],
        ),
);
```

これで以下のようなツールバーが表示されます。
<img width="1497" alt="qiita_pic1.png" src="https://qiita-image-store.s3.amazonaws.com/0/43996/c2a53f80-be59-64a8-1933-2076e4c1062c.png">

### 記事ページをみている時だけ、その記事の編集ページのリンクを表示するには?

記事ページの編集ページへのリンクを表示する方法についての例です。

ブログのサイトで以下の様にルートが定義されているとします。

```php
# 記事ページ
Route::get('/post/{id}', ['uses'=>'PostController@show']);

# 管理画面ページ
Route::get('/admin/post/edit/{id}', ['uses'=>'Admin\PostController@edit']);
```

その場合は、以下のように定義することで、記事ページの編集リンクを表示することができます。

```php
'menus' => array(
        ['title'=>'管理画面TOP', 'path'=>'/admin'],
        ['title'=>'この記事を編集する',
          // 記事編集画面など現在のURLから動的にリンクを生成したい場合は、以下の様にcallbackが利用できます。
         'path'=>function($request){
                    $postid = $request->route('id');
                    return '/admin/post/edit/' . $postid;
                 }, 
         // 記事ページでのみリンクを表示するため、filterに記事ページのURLのパターンを指定します。
         // filterにもcallbackを利用することができます。trueを返すとリンクを表示します。
         'filter'=>'post/*'],
        ),
```

### ドロップダウンの表示

以下の様にpathに配列を渡すことで、ドロップダウン表示ができます。

```php
'menus' => array(
        ['title'=>'管理画面TOP', 'path'=>'/admin'],
        ['title'=>'ドロップダウン', 'path'=>[
                                 ['title'=>'メニュー1', 'path'=>'/path/to/option1'],
                                 ['title'=>'メニュー2', 'path'=>'/path/to/option2']
                                ]
        ],
        ),
```

### 懸念点と今後
使っていただいて不具合見つけたりもっとこうしたらみたいなのあれば是非プルリクお願いします!
一緒にWinkに組み込んでもらえる様な素晴らしいパッケージにしましょう!

[github](https://github.com/shrft/laravel-admin-bar)

以下に自分でも対応するけど誰かやってくれたら嬉しいかもというものをリストアップしました。

#### バグ & 改善
- スマホの表示崩れ
- excludesに配列を渡して除外URLを複数定義できるようにする。(いらないかも。未定)
- pathやfilterにcallbackを渡して動的に値を生成するようにしているが、設定ファイルに複雑な処理がはいるのはよくないので他の方法を考える。
　たとえば 以下の様に定義しておくとAdminHelperクラスのgetEditUrlを呼び出しその関数が動的なURLを返してくれるとか?

    ```php
    'menus' => array(
            ['title'=>'この記事を編集する', 'path'=>'AdminbarHelper@getEditUrl'],
            ),
    ```
  または、Laravel Novaみたいな感じで設定を定義するようにする?? アイディア募集中です。

- Laravel5.1以上のバージョンをサポート。現在は、5.5以上
- テストがたりてないところテスト追加

#### 機能 & アイディア
- アドミンバーの位置を指定できるようにする。上、下とか(システムが複雑にならない方法で)
- ステータス表示機能。PV数とかなにか表示したい情報を簡単に表示できるようにする設定。 (いるかな??)

ここまで読んでくださりありがとうございました!!!!