Laravel で秒速で管理画面を作成する

こんにちは、Laravel で簡単に管理画面を作成できる Laractive Admin を作ったので、使い方を紹介していきたいと思います。

環境

Laractive Admin のインストール

まずは Composer で Laractive Admin をインストールします。

$ composer require enomotodev/laractive-admin

インストールできたら artisan コマンドで Laractive Admin を初期化します。

$ php artisan laractive-admin:install

初期化コマンドを実行すると、次のファイルが生成されます。

  • app/Admin/AdminUser.php
  • app/database/migrations/[timestamp]_create_admin_users_table.php
  • app/database/migrations/[timestamp]_create_laractive_admin_comments_table.php

マイグレーションファイルが生成されたのでマイグレーションを実行します。

$ php artisan migrate

これで admin_users テーブルと laractive_admin_comments テーブルが作成されました。

次のコマンドで admin_users テーブルに初期ログイン用のデータが作成されます。

$ php artisan laractive-admin:seed

ログイン用のデータが作成されたので、ブラウザで /admin を開きます。

f:id:enomotodev:20180520000429p:plain

先ほどの php artisan laractive-admin:seed コマンドでログイン用のアカウントが作成されているので、そのアカウントでログインします。

f:id:enomotodev:20180520000354p:plain

これでログイン機能をもった管理画面が簡単に作成されました!

それでは次から実際に他のモデルを作成して、それらの管理機能も作っていきたいと思います。

著者(Author)管理を作成する

それでは name カラムをもつ Author モデルを作成して、Author を管理できるようにしていきましょう。

まずはモデルとマイグレーションを作成して、マイグレーションを実行します。

$ php artisan make:model Author -m
  • [timestamp]_create_authors_table.php
<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateAuthorsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('authors', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('authors');
    }
}
  • app/Author.php
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Author extends Model
{
    /**
     * @var array 
     */
    protected $fillable = [
        'name',
    ];
}

忘れずに $fillablename を設定しておきましょう。

ここまで作成できたらマイグレーションを実行します。

$ php artisan migrate

下準備はできたので、管理画面に Author 管理のページを作成しましょう。

管理画面にページを追加するには app/Admin/ 配下に Enomotodev\LaractiveAdmin\Http\Controllers\Controller を継承したクラスを作成して、$model プロパティに管理する対象のモデルを指定します。

  • app/Admin/Author.php
<?php

namespace App\Admin;

use Enomotodev\LaractiveAdmin\Http\Controllers\Controller;

class Author extends Controller
{
    /**
     * @var string
     */
    public $model = \App\Author::class;
}

ブラウザで再度確認してみると、メニューに Author が追加されているのが確認できると思います。

f:id:enomotodev:20180520000359p:plain

この状態でもデータを新規作成できるのですが、バリデーションがないので、app/Admin/Author.php にバリデーションを追加します。

バリデーションを追加するには、$validate プロパティに通常と同じようにバリデーションルールを追加します。

  • app/Admin/Author.php
<?php

namespace App\Admin;

use Enomotodev\LaractiveAdmin\Http\Controllers\Controller;

class Author extends Controller
{
    /**
     * @var string
     */
    public $model = \App\Author::class;

    /**
     * @var array
     */
    protected $validate = [
        'name' => 'required|max:100',
    ];
}

バリデーションが追加されたので実際に name を空にしてフォームを送信するとエラーが表示されます。

f:id:enomotodev:20180520000404p:plain

データを登録すると一覧画面には次のように表示されるのが確認できると思います。

f:id:enomotodev:20180520000412p:plain

書籍(Book)管理を作成する

Author 管理ができたので、Author に対して BelongsTo の関係である Book モデルを作成したいと思います。

Book モデルは author_id, title, description, main_image カラムをもち、画像をアップロードできるようにしたいと思います。

まずは、モデルとマイグレーションを作成して、マイグレーションを実行します。

$ php artisan make:model Book -m
  • [timestamp]_create_books_table.php
<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateBooksTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('books', function (Blueprint $table) {
            $table->increments('id');
            $table->integer('author_id');
            $table->string('title');
            $table->text('description');
            $table->string('main_image');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('books');
    }
}
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Book extends Model
{
    /**
     * @var array
     */
    protected $fillable = [
        'author_id',
        'title',
        'description',
        'main_image',
    ];

    /**
     * @return \Illuminate\Database\Eloquent\Relations\BelongsTo
     */
    public function author()
    {
        return $this->belongsTo(Author::class);
    }
}

マイグレーションを実行します。

$ php artisan migrate

それではモデルができたので、Author と同様に app/Admin/ 配下に Book 管理用のファイルを作成します。

  • app/Admin/Book.php
<?php

namespace App\Admin;

use Enomotodev\LaractiveAdmin\Http\Controllers\Controller;

class Book extends Controller
{
    /**
     * @var string
     */
    public $model = \App\Book::class;

    /**
     * @var array
     */
    protected $validate = [
        'author_id' => 'required',
        'title' => 'required',
        'description' => 'required',
        'main_image' => 'required|image',
    ];
}

バリデーションを書くのを忘れないように気をつけてください

ブラウザで確認すると Author Id の部分がセレクトになっているのに注目してください。

f:id:enomotodev:20180520000418p:plain

これは belongsTo で定義したモデルのデータが選択できるようになっています。

一方、Main Imageを確認するとファイルをアップロードしたいのに、テキスト入力になってしまっています。

ファイルをアップロードするには app/Admin/Book.php$files プロパティを定義する必要があります。

早速 $files プロパティを定義してみましょう。

// ...

class Book extends Controller
{
    // ...

    /**
     * @var array
     */
    protected $files = [
        'main_image',
    ];
}

$files プロパティを定義した後にブラウザで確認すると、フォーム要素がテキストからファイルになっているのが確認できると思います!

まとめ

個人的に最近久しぶりに Laravel を触っているのですが、毎回管理画面を作ったりするのが面倒だったので、OSS として Laractive Admin を作ってみました。

当初、カラムを定義するのが面倒だったので、DESCRIBE コマンドでテーブル定義を参照して、そこからフォームを生成していたりするのですが、モデルに $fillable が定義されているのであれば、そこから色々生成してもいいのかなーと思ってます。

これから、どんどん機能を増やしていきたいと思っているので、ぜひ触ってみて PR ください!!

enomotodev/laractive-admin

React,Angular,Vue.js,React Nativeを使って学ぶ はじめてのフロントエンド開発

React,Angular,Vue.js,React Nativeを使って学ぶ はじめてのフロントエンド開発

React開発 現場の教科書

React開発 現場の教科書