[Laravel Nova]管理画面が爆速開発できる公式パッケージが凄い

こんにちは。
みなさんLaravel Novaをご存知ですか?

これは、先週リリースされたばかり(2018/8/21)のLaravel公式パッケージで、Laravelアプリケーションの管理画面がとても簡単につくれます。

パッケージインストールしてコマンドを実行しただけですでに管理画面ができてしまいます。
もちろんアプリケーションによってDBテーブルの構成が違ったり要件が違うため設定は必要になります。

設定は、設定ファイルやDBに格納された値ではなく、PHPコードを書いて行います。
Laravelを普段利用している開発者にとっては非常にわかりやすく直感的に使えると思います。

価格は1サイト\$99(法人の場合は1サイト\$199)ですが、削減できる工数を考えると買わなければ損なレベルです。

それでは早速見ていきましょう。

インストール手順は割愛しますが、通常のパッケージと同様簡単にインストールできます。

インストール後はhttp://[サイトのurl]/novaでアクセスできます。

以下がログイン後の管理画面です。

<img width="1659" alt="スクリーンショット 2018-08-26 16.27.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/43996/5ddad33c-bb24-9613-eefc-b9243528505f.png">

上の画像のUsersの部分をクリックするとユーザー一覧が表示されます。
(usersテーブルにemailとnameカラムが必要です。)

<img width="1661" alt="スクリーンショット 2018-08-26 16.31.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/43996/af19acc2-cd08-e817-df5c-7a0f822728bb.png">

ユーザーの修正画面はこんな感じです。

<img width="1658" alt="スクリーンショット 2018-08-26 16.38.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/43996/7a4f6aad-1812-99d1-f81d-02d562257f89.png">


何もしないでここまでできていると嬉しいですね。

それではここからどのように設定を変更していくのか見ていきましょう。
今回はブログを想定して、以下の2つの変更を行っていきたいと思います。

A. ユーザーに電話番号の項目を追加する
B. 記事一覧、作成・編集画面の追加

##A. ユーザーに電話番号の項目を追加する

*先にusersテーブルにtellというカラムを追加ておいてください。

項目の追加は非常に簡単で、novaのユーザーのリソースファイルを開き、fields関数にtellの項目を追加するだけです。

novaのユーザーのリソースファイル: app/Nova/User.php 
現在の状態

```
   /**
     * Get the fields displayed by the resource.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return array
     */
    public function fields(Request $request)
    {
        return [
            ID::make()->sortable(),

            Gravatar::make(),

            Text::make('Name')
                ->sortable()
                ->rules('required', 'max:255'),

            Text::make('Email')
                ->sortable()
                ->rules('required', 'email', 'max:255')
                ->creationRules('unique:users,email')
                ->updateRules('unique:users,email,{{resourceId}}'),

            Password::make('Password')
                ->onlyOnForms()
                ->creationRules('required', 'string', 'min:6')
                ->updateRules('nullable', 'string', 'min:6'),
        ];
    }
```

これに以下のコードを追加します。

```
Text::make('Tell')
                ->sortable()
                ->rules('required', 'max:255')
                ->creationRules('unique:users,email')
                ->updateRules('unique:users,email,{{resourceId}}'),
```

追加後


```
    public function fields(Request $request)
    {
        return [
            ID::make()->sortable(),

            Gravatar::make(),

            Text::make('Name')
                ->sortable()
                ->rules('required', 'max:255'),

            Text::make('Email')
                ->sortable()
                ->rules('required', 'max:255')
                ->creationRules('unique:users,email')
                ->updateRules('unique:users,email,{{resourceId}}'),

            Text::make('Tell')
                ->sortable()
                ->creationRules('unique:users,tell')
                ->updateRules('unique:users,tell,{{resourceId}}'),

            Password::make('Password')
                ->onlyOnForms()
                ->creationRules('required', 'string', 'min:6')
                ->updateRules('nullable', 'string', 'min:6'),
        ];
    }
```

これだけで、ユーザー一覧への表示、編集画面での電話番号の変更ができるようになります。
簡単ですね。

<img width="1659" alt="スクリーンショット 2018-08-26 16.44.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/43996/23d1757a-4737-f854-a6a0-112664f7ebe3.png">

##B. 記事一覧、作成・編集画面の追加
では次に記事一覧画面の追加の手順を見ていきましょう。

記事用に以下のテーブルを用意しました。

```
CREATE TABLE `posts` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `user_id` int(11) DEFAULT NULL,
  `title` varchar(255) DEFAULT NULL,
  `content` text,
  `updated_at` datetime DEFAULT NULL,
  `created_at` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
```
また Postクラス(eloquentモデル)もあらかじめ作成済みです。

まず上記のモデル用のリソースファイルを以下のコマンドで作成します。

```
php artisan nova:resource Post
```

以下のファイルが作成されます。

```
app/Nova/Post.php
```

このファイルのfields()にカラムの設定を追加していきます。

最初の状態

```
 public function fields(Request $request)
    {
        return [
            ID::make()->sortable()
        ];
    }
```

以下の項目を追加する

```
BelongsTo::make('User'),
Text::make('title')->sortable(),
Textarea::make('content')->sortable(),
```

追加後のコード

```
public function fields(Request $request)
{
    return [
        ID::make()->sortable(),
        BelongsTo::make('User'),
        Text::make('title')->sortable(),
        Textarea::make('content')->sortable(),
    ];
}
```

これで記事のリストと新規登録、編集ができるようになります。
非常に簡単ですね。

<img width="1652" alt="スクリーンショット 2018-08-26 16.49.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/43996/2d19dd67-a290-5db9-a56d-c61a3d6ab924.png">

ユーザー名の部分は自動的にuserテーブルから値を持ってきてくれています。
編集画面や新規登録画面では、セレクトボックスからユーザー名を選択できるようになっています。
たったこれだけでそこまでできるなんて本当に感動レベルです。

ちなみに以下の記述によりユーザー名が表示されるようになります。
BelongsTo::make('User');
ただしこれが正しく動くにはApp\Postにリレーションシップをあらかじめ定義しておく必要があります。

```
public function user(){
    return $this->belongsTo(User::class);
}
```

以上、初めてつかってもとくにつまづきどころもなく簡単に管理画面を作成することができました。
まだまだいろいろ触ってみて情報発信したいと思いますが、聞きたいことあればお尋ねください!!

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">laravel nova 凄い!</p>&mdash; usagi (@shiro_usagi_san) <a href="https://twitter.com/shiro_usagi_san/status/1033624103544975360?ref_src=twsrc%5Etfw">2018年8月26日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>