10分ぐらいで学べるSymfony2 〜admin generator編〜

informationテーブルに対してアドミンジェネレータでCRUD処理を作成するメモ
SonataAdminBundleを利用します。今回はエンティティは「src/Root/SiteBundle/Entity/Information.php」に作成済とします

(1)インストール
vendor下にインストールするが結構な数のバンドルのインストールが必要

$ vi deps
[SonatajQueryBundle]
    git=http://github.com/sonata-project/SonatajQueryBundle.git
    target=/bundles/Sonata/jQueryBundle
[SonataBluePrintBundle]
    git=http://github.com/sonata-project/SonataBluePrintBundle.git
    target=/bundles/Sonata/BluePrintBundle
[SonataUserBundle]
    git=http://github.com/sonata-project/SonataUserBundle.git
    target=/bundles/Sonata/UserBundle
[SonataAdminBundle]
    git=http://github.com/sonata-project/SonataAdminBundle.git
    target=/bundles/Sonata/AdminBundle
[MenuBundle]
    git=http://github.com/knplabs/KnpMenuBundle.git
    target=/bundles/Knp/Bundle/MenuBundle
[KnpMenu]
    git=https://github.com/knplabs/KnpMenu.git
    target=/knp/menu
# インストール
$ php bin/vendors install
# autoload設定追記
<?php
# app/autoload.php
$loader->registerNamespaces(array(
    // ...
    'Sonata'                         => __DIR__.'/../vendor/bundles',
    'Knp'                             => array(
        __DIR__.'/../vendor/bundles',
        __DIR__.'/../vendor/knp/menu/src',
    ),
    // ...
));

# app/AppKernel.php
public function registerBundles()
{
    return array(
        // ...
        new Sonata\jQueryBundle\SonatajQueryBundle(),
        new Sonata\BluePrintBundle\SonataBluePrintBundle(),
        new Sonata\AdminBundle\SonataAdminBundle(),
        new Knp\Bundle\MenuBundle\KnpMenuBundle(),
        // ...
    );
}

# ルーティングの設定
$ vi app/config/routing.yml
sonata_admin:
    resource: "@SonataAdminBundle/Resources/config/routing/sonata_admin.xml"
    prefix:   /admin
_sonata_admin:
    resource: .
    type: sonata_admin
    prefix: /admin

# assetのインストール
$ php app/console assets:install web --symlink

これで「http://xxxxxxxxxx/admin/dashboard」にアクセスすると↓のような空のダッシュボードが表示されます。

f:id:taka512:20110924211825p:image



(2)Adminクラスの作成
SonataAdminBundleでは項目毎にAdminクラスを生成して、そこにCRUDの定義などをがりがり書いていくようです。(「generator.yml」的な感じですね)

# src/Root/SiteBundle/Admin/InformationAdmin.php
<?php
namespace Root\SiteBundle\Admin;

use Sonata\AdminBundle\Admin\Admin;
use Sonata\AdminBundle\Form\FormMapper;
use Sonata\AdminBundle\Datagrid\DatagridMapper;
use Sonata\AdminBundle\Datagrid\ListMapper;
use Sonata\AdminBundle\Show\ShowMapper;
use Sonata\AdminBundle\Validator\ErrorElement;

class InformationAdmin extends Admin
{
    protected function configureDatagridFilters(DatagridMapper $datagrid)
    {
        $datagrid
            ->add('title')
        ;
    }

    protected function configureListFields(ListMapper $listMapper)
    {
        $listMapper
            ->addIdentifier('id')
            ->add('title')
            ->add('start_date')

            // add custom action links
            ->add('_action', 'actions', array(
                'actions' => array(
                    'view' => array(),
                    'edit' => array(),
                )
            ))
        ;
    }
    protected function configureFormFields(FormMapper $formMapper)
    {
        $formMapper
            ->add('title')
            ->add('body')
        ;
    }
    public function validate(ErrorElement $errorElement, $object)
    {
        $errorElement
            ->with('title')
                ->assertMaxLength(array('limit' => 32))
            ->end()
        ;
    }
}


(3)Controllerクラスの作成
Controllerクラスは空で良いです。ルーティングも基本的なアクションは設定しなくても
よろしくやってくれるようです。

# src/Root/SiteBundle/Controller/InformationAdminController.php
<?php
namespace Root\SiteBundle\Controller;

use Sonata\AdminBundle\Controller\CRUDController as Controller;

class InformationAdminController extends Controller
{
}

(4)config.ymlの設定
最後にサービス的な物を登録します。

# app/config/config.yml
services:
    root.site.admin.information:
        class: Root\SiteBundle\Admin\InformationAdmin
        tags:
            - { name: sonata.admin, manager_type: orm, group: site_management, label: information }
        arguments: [null, Root\SiteBundle\Entity\Information, RootSiteBundle:InformationAdmin]


登録後にキャッシュをクリアすると・・・

わりといけてる感じの管理画面ができました

f:id:taka512:20110924235121p:image


リスト表示
f:id:taka512:20110924235122p:image




参考
SensioGeneratorBundle
http://symfony2bundles.org/sensio/SensioGeneratorBundle
SonataAdminBundle
http://symfony2bundles.org/sonata-project/SonataAdminBundle
SonataAdminBundle documentation
http://sonata-project.org/bundles/admin/master/doc/index.html