Symfony2.7でのBundle構成について

July 12, 2015,
tags: symfony php


このエントリーをはてなブックマークに追加

Symfony2.6から、AppBundleが増えたり、Bundleをどう構成するべきか悩んでる人は多いのかと思います。 半年ぐらい2.6~2.7で開発した経験を元にどうBundleを構成していくのか考えてみました。

個人てに最近おすすめなBundle構成

├── src
│   ├── AdminBundle
│   ├── AppBundle
│   ├── Domain
│   └── WebBundle

AdminBundle, WebBundle

この二つのBundleは、web画面用のBundleとして利用します。
管理画面ようにAdminBundle,通常表示するサイト用のWebBundleみたいな使い分けです。
ポイントは、ここではControllerFormTypeなどの比較的画面に近い部分のファイルを置くようにします。
なので、ここではEntityRepositoryなどは置かないようにします。

AppBundle

この使い方は個人的に非常に悩みました。
ドキュメントにはDoctrineのEntityクラスや、ビジネスロジックを配置すると書いてあります。
しかし、個人的にはなんとなく違和感があって違う用とに使っています。

ここではAdminBundleWebBundleに共通するような、FormTypeやvaliation用のファイルなどといったファイルを置くようにしています。

Domain

まずこのディレクトリ自体はBundleではありません。 単純にドメイン的なものを配置するためのディレクトリです。 これは別にDomainって名前のディレクトリじゃなくてBlogとかそういった目的に応じたものでもいいかと思います。 ポイントとしてはBundleにしないことです。 あとは領域(コンテキスト)ごとDomain配下にディレクトリを作成します。

例:

$ mkdir src/Domain/User

で、さらにその下にEntity,Repository,Usecase,Service,Specificationなどのディレクトリファイルを配置します。

しかしこのままではEntityやRepositoryを使うことができないので、conifg.ymlで設定を書かなければなりません。

orm:
    auto_generate_proxy_classes: "%kernel.debug%"
    mappings:
        user:
            is_bundle: false
            alias: Item
            type: annotation
            dir: %kernel.root_dir%/../src/Domain/User/Entity
            prefix: Domain\User\Entity

みたいな感じに設定すれば大丈夫です。

実際に簡単なBlogサンプルを作ってみようと思います。

1. symfony install

今回はsymfony installerを使います。入ってない方は下のように入れてください。

$ sudo curl -LsS http://symfony.com/installer -o /usr/local/bin/symfony
$ sudo chmod a+x /usr/local/bin/symfony

そしてインストール

$ symfony new blog
Downloading Symfony...

   4.95 MB/4.95 MB ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓  100%

Preparing project...

✔  Symfony 2.7.1 was successfully installed. Now you can:

   * Change your current directory to /Users/polidog/php/blog

   * Configure your application in app/config/parameters.yml file.

   * Run your application:
       1. Execute the php app/console server:run command.
       2. Browse to the http://localhost:8000 URL.

   * Read the documentation at http://symfony.com/doc

おれでインストールは完了です。

2. 必要なライブラリをインストールする。

今回はこんな感じにcomposerで必要なライブラリを指定しています。

"doctrine/doctrine-migrations-bundle": "2.1.*@dev",
"knplabs/knp-paginator-bundle": "~2.4",
"phpmentors/domain-kata": "1.4",
"stof/doctrine-extensions-bundle": "~1.1"

あとはcomposer updateしましょう。

$ composer update

3. Bundleを用意する

ここまで準備できたら、次はBundleを用意します。

$ app/console generate:bundle --namespace=WebBundle --format=annotation
$ app/console generate:bundle --namespace=AdminBundle --format=annotation

4. ライブラリの設定

まずはAppKernel.phpに登録する作業を行います。

// app/AppKernel.php
<?php

use Symfony\Component\HttpKernel\Kernel;
use Symfony\Component\Config\Loader\LoaderInterface;

class AppKernel extends Kernel
{
    public function registerBundles()
    {
        $bundles = array(
            new Symfony\Bundle\FrameworkBundle\FrameworkBundle(),
            new Symfony\Bundle\SecurityBundle\SecurityBundle(),
            new Symfony\Bundle\TwigBundle\TwigBundle(),
            new Symfony\Bundle\MonologBundle\MonologBundle(),
            new Symfony\Bundle\SwiftmailerBundle\SwiftmailerBundle(),
            new Symfony\Bundle\AsseticBundle\AsseticBundle(),
            new Doctrine\Bundle\DoctrineBundle\DoctrineBundle(),
            new Sensio\Bundle\FrameworkExtraBundle\SensioFrameworkExtraBundle(),

            new Doctrine\Bundle\MigrationsBundle\DoctrineMigrationsBundle(),
            new Knp\Bundle\PaginatorBundle\KnpPaginatorBundle(),
            new \Stof\DoctrineExtensionsBundle\StofDoctrineExtensionsBundle()

        );

        if (in_array($this->getEnvironment(), array('dev', 'test'))) {
            $bundles[] = new Symfony\Bundle\DebugBundle\DebugBundle();
            $bundles[] = new Symfony\Bundle\WebProfilerBundle\WebProfilerBundle();
            $bundles[] = new Sensio\Bundle\DistributionBundle\SensioDistributionBundle();
            $bundles[] = new Sensio\Bundle\GeneratorBundle\SensioGeneratorBundle();
        }

        return $bundles;
    }

    public function registerContainerConfiguration(LoaderInterface $loader)
    {
        $loader->load($this->getRootDir().'/config/config_'.$this->getEnvironment().'.yml');
    }
}

次にapp/config/config.ymlに書くライブラリの必要な部分を記載していきます。

doctrine_migrations:
    dir_name: %kernel.root_dir%/migrations
    namespace: Application\Migrations
    table_name: migration_versions
    name: Application Migrations

knp_paginator:
    page_range: 20
    default_options:
        page_name: page
        sort_field_name: sort
        sort_direction_name: direction
        distinct: false

stof_doctrine_extensions:
    default_locale: ja_JP
    orm:
        default:
            tree: false
            timestampable: true

5. ドメインを配置するためのディレクトリを作成

次にドメインを配置するためのディレクトリを作成します。今回はBlogという名前で用意します。 その下に、User,Articleというディレクトリを作り、さらにその下に,Entity,Reposiotry,Usecaseなどを配置します。

$ mkdir -p src/Blog/{User,Article}/{Entity,Repository,Usecase}

ディレクトリを作成できたら、次はconfig.ymlの修正を行います。

mappings:
    user:
        is_bundle: true
        alias: User
        type: annotation
        dir: %kernel.root_dir%/../src/Blog/User/Entity
        prefix: Blog\User\Entity
    article:
        is_bundle: true
        alias: Article
        type: annotation
        dir: %kernel.root_dir%/../src/Blog/Article/Entity
        prefix: Blog\Article\Entity

5. まずはユーザー登録の部分から作る

comments powered by Disqus