このエントリーは Symfony Advent Calendar 2015 11日目の記事です。
昨日は @ryo511 さんの「Symfonyの歩き方/5分でわかるSymfony Best Practices」でした。

はじめに

Symfonyに管理画面を導入するためのバンドルといえば、SonataAdminBundle が有名ですよね。

でも、小ぶりなアプリなんかで 「管理画面は普通にエンティティのCRUDができれば十分」 というような場合には、SonataAdminBundleよりももっとシンプルで扱いやすい EasyAdminBundle がおすすめです。

本記事では、EasyAdminBundleの基本的な使い方を、簡単なSymfonyプロジェクトを実際に作りながら解説してみたいと思います。

ほとんど 公式のドキュメント をなぞるだけのような感じですが :dash:

1. プロジェクトとエンティティを作成

とりあえず、管理画面を導入するための簡単なプロジェクトを作りましょう。

ブログチュートリアル以外の例が思い浮かばないので(笑)、投稿コメント という2つのエンティティを持ったブログっぽいプロジェクトを作ることにします。

EasyAdminBundleを試すのが目的なので、ただエンティティがあるだけのプロジェクトでOKです。

  1. Symfony Installer でプロジェクトを作成(今回はSymfonyのバージョンは2.8を使います)
  2. エンティティとDBを作成

細かい手順はここでは割愛させていただきます。以前書いた「Symfony2 で REST API を実装する際の手順と仕組みの解説」という記事の前半部分でこの辺り解説していますので、参考にしてみてください。

以降は、プロジェクトが次のようなエンティティを持っているものとして説明します。

Postエンティティ

プロパティ名 nullable
$title string false
$body text true

Commentエンティティ(Post:Comment = 1:N)

プロパティ名 nullable
$body text true

2. EasyAdminBundleをインストール

いつものようにcomposerでインストールして、

$ composer require javiereguiluz/easyadmin-bundle

AppKernel.php に登録して、

<?php
// app/AppKernel.php

// ...
class AppKernel extends Kernel
{
    public function registerBundles()
    {
        $bundles = array(
            // ...
            new JavierEguiluz\Bundle\EasyAdminBundle\EasyAdminBundle(),
        );
    }

    // ...
}

ルーティングを追加します。

# app/config/routing.yml
easy_admin_bundle:
    resource: "@EasyAdminBundle/Controller/"
    type:     annotation
    prefix:   /admin

また、アセットも持っているのでインストールが必要です。

$ php app/console assets:install --symlink

3. EasyAdminBundleを設定

これでバンドルのインストールは完了しました。

それでは管理画面の設定を行いましょう。config.yml に以下を追記します。

# app/config/config.yml
easy_admin:
    entities:
        - AppBundle\Entity\Post
        - AppBundle\Entity\Comment

これだけです。簡単すぎ!

4. 実際に動かす前にちょっとだけ準備

この時点ですでに管理画面が動作するようにはなっているのですが、正常に動かすためにはもう少しだけ準備が必要です。

4-1. 翻訳を有効化

Symfony Installerでインストールしたままだと翻訳が有効になっていない(TranslatorにfallbackLocalesが設定がされていない)ので、config.yml の以下の箇所をコメントインして翻訳を有効にしておきましょう。

# app/config/config.yml
framework:
-   #translator:      { fallbacks: ["%locale%"] }
+   translator:      { fallbacks: ["%locale%"] }

4-2. エンティティに__toString()を実装

また、管理画面において、エンティティの文字列表現が必要になる場面があるため、__toString() メソッドを実装しておく必要があります。(以下は例です)

<?php
// Post.php

private function __toString()
{
    return $this->title;
}
<?php
// Comment.php

private function __toString()
{
    return mb_substr($this->body, 10);
}

これで、今度こそ準備完了です!

5. /admin にアクセス

では、管理画面を見てみましょう。

$ php app/console server:run
$ open -a "Google Chrome" http://localhost:8000/admin

image

おおー!普通に管理画面!

もちろんCRUDも一通り動きます。

image

image

image

プロパティの型やリレーションシップに合わせて適切なUIで表示してくれるので、基本的には何も考えなくてもいい感じになります。素晴らしい!

6. お好みに合わせてカスタマイズ

お任せでもいい感じに動きますが、表示する項目やフォームの形式などを細かくカスタマイズすることもできます。

ちょっと出来ることがいろいろあって説明しきれないので、ここについては 公式のドキュメント を参照してください :bow:

おわりに

EasyAdminBundle の導入方法について簡単に解説しました。

設定ファイルだけでCRUDが動いてくれるというのがとにかく楽で嬉しいですね。

私の場合、社内用のちょっとしたツールなんかで「いざとなったらユーザー(社員)が自分でデータをいじれる」という要件がある場合などに重宝しています。

SonataAdminBundleに疲れたら、試しに使ってみてください。

明日は @77web さん(2周目 :bow: )です!お楽しみに!