Symfony2 で新規プロジェクトを作る時にいつもやっていること

2013年6月30日

symfony-logo

Symfony2 で新規プロジェクトを作成して開発を始める時にいつもやっていることをまとめました。

動作確認環境

  • Mac OSX Mountain Lion
  • PHP 5.4
  • Symfony 2.3

目次

  1. インストール
  2. cache, logs ディレクトリに書き込み権限を与える
  3. Symfony2 の動作要件を満たせているか確認する
  4. AcmeDemoBundle を削除
  5. README.md を削除
  6. .gitignore を作成
  7. parameters.yml 設定
  8. generator でバンドルのひな形を自動生成
  9. バンドルのサービスコンテナの設定ファイルを services.yml に変更する
  10. データベースから Entity を自動生成する
  11. CRUD 一式を自動生成する
  12. 開発中によく使用するコマンド

インストール

まずは Symfony2 をインストール。Symfony2 のバージョンは適宜最新版に置き換えてください。Symfony2 のインストール方法は、Composerを使ったSymfony2.1のインストール方法にまとめてあります。

$ mkdir <symfony2-project-root>
$ cd <symfony2-project-root>
$ php composer.phar create-project symfony/framework-standard-edition ./ 2.3.1

cache, logs ディレクトリに書き込み権限を与える

cache, logs ディレクトリに対し、app/console コマンドを実行するユーザと Web サーバの実行ユーザに書き込み権限を与えます。こうしておくと web サーバーの実行ユーザーと app/console を実行するユーザーが違っていても、書き込み権限エラーで怒られなくなります。

以下は、Mac での例です。_www ユーザは ご自身の Apache ユーザなどに置き換えてください。

$ rm -rf app/cache/*
$ rm -rf app/logs/*
$ sudo chmod +a "_www allow delete,write,append,file_inherit,directory_inherit" app/cache app/logs
$ sudo chmod +a "`whoami` allow delete,write,append,file_inherit,directory_inherit" app/cache app/logs

参考サイト

Symfony のインストールと設定 | Symfony2日本語ドキュメント

Symfony2 の動作要件を満たせているか確認する

app/check.php を実行し、すべて OK が表示されていることを確認します。

$ php app/check.php
 OK       PHP version must be at least 5.3.3 (5.4.15 installed)
 OK       PHP version must not be 5.3.16 as Symfony won't work properly with it
 OK       Vendor libraries must be installed
...

ブラウザから web/config.php にもアクセスして動作確認します。「Your configuration looks good to run Symfony.」と表示されれば OK です。

symfony2-configuration

開発環境などで Xdebug を使用している場合は、php.ini などで xdebug.max_nesting_level=1000 に設定します。デフォルトのままだと、check.php でアラートが上がるかと思います。

参考サイト

https://github.com/symfony/symfony/issues/7112

AcmeDemoBundle を削除

サンプルのバンドル AcmeDemoBundle は不要なので削除します。

$ rm -rf src/Acme
$ rm -rf web/bundles/acmedemo

app/config/routing_dev.yml から AcmeDemoBundle の ルーティングを削除します。

# AcmeDemoBundle routes (to be removed)
_acme_demo:
    resource: "@AcmeDemoBundle/Resources/config/routing.yml"

app/AppKernel.php から AcmeDemoBundle のバンドル登録を削除します。

$bundles[] = new Acme\DemoBundle\AcmeDemoBundle();

app/config/security.yml に、デモ用の認証設定が書かれているので、必要に応じて中身を書き換えます。

security:
    providers:
        in_memory:
            memory: ~
    firewalls:
        dev:
            pattern: ^/(_(profiler|wdt)|css|images|js)/
            security: false
        default:
            anonymous: ~

README.md を削除

プロジェクトルート直下にある README.md、UPGRADE.md を削除します。README.md はご自身のプロジェクト用に置き換えてもいいです。

$ rm README.md
$ rm UPGRADE.md
$ rm UPGRADE-2.2.md

.gitignore を作成

Symfony2 のプロジェクトルートディレクトリに .gitignore ファイルを作成します。

# Bootstrap
app/bootstrap*
# Symfony directories
vendor/*
*/logs/*
*/cache/*
web/uploads/*
web/bundles/*
# Configuration files
app/config/parameters.ini
app/config/parameters.yml

parameters.yml 設定

parameters.yml を設定します。

  • SMTP サーバがない環境では Gmail 経由でメール送信するように
  • locale を日本に
  • secret キーを16文字のランダム英数字(小文字)に
parameters:
    database_driver: pdo_mysql
    database_host: 127.0.0.1
    database_port: null
    database_name: symfony
    database_user: root
    database_password: 'password'
    mailer_transport: gmail
    mailer_encryption: ssl
    mailer_auth_mode: login
    mailer_host: smtp.gmail.com
    mailer_user: hoge@gmail com
    mailer_password: 'password'
    locale: ja
    secret: 16文字のランダム英数字(小文字)

generator でバンドルのひな形を自動生成

app/console generate:bundle コマンドでバンドルのひな形を自動作成します。バンドルを手作業で作成するのは結構大変なので、Generator に任せます。

$ php app/console generate:bundle
Bundle namespace: Kara/HogeBundle
Bundle name [KaraHogeBundle]: Enter
Target directory [/var/www/hoge-project/src]: Enter
Configuration format (yml, xml, php, or annotation): annotation
Do you want to generate the whole directory structure [no]? yes
Do you confirm generation [yes]? Enter
Confirm automatic update of your Kernel [yes]? Enter
Confirm automatic update of the Routing [yes]? Enter

web の bundles 以下に Resources へのシンボリックリンクを作成します。

$ php app/console assets:install web --symlink

作成されたバンドルのテストを実行しておきます。

$ phpunit -c app

バンドルのサービスコンテナの設定ファイルを services.yml に変更する

Generator で作成したバンドルのサービスコンテナの設定ファイルは services.xml ですが、yml の方が扱いやすいので変更します。

ファイル名を services.xml から services.yml に変更

$ cd src/Kara/HogeBundle/Resources/config
$ mv services.xml services.yml

サービスコンテナの読み込み方法を変更。

// src/Kara/HogeBundle/DependencyInjection/KaraHogeExtension.php
public function load(array $configs, ContainerBuilder $container)
{
    //...
    $loader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
    $loader->load('services.yml');
}

データベースから Entity を自動生成する

Entity も Generator で自動生成します。まずはテーブルを作成。

CREATE TABLE `user` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ユーザid',
  `email` varchar(255) NOT NULL COMMENT 'メールアドレス',
  `password` varchar(50) NOT NULL COMMENT 'パスワード',
  `name` varchar(50) DEFAULT NULL COMMENT 'ユーザ名',
  `created_at` datetime DEFAULT NULL COMMENT '登録日',
  `modified_at` datetime DEFAULT NULL COMMENT '更新日',
  PRIMARY KEY (`id`),
  UNIQUE KEY `email` (`email`),
  KEY `email_password` (`email`,`password`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 comment='ユーザ';

次に、データベースから Entity の元となる xml を作成します。

$ php app/console doctrine:mapping:convert xml src/Kara/HogeBundle/Resources/config/doctrine/metadata/orm --from-database --force

作成した xml から Entity を作成します。

すべての Entity を作成
$ php app/console doctrine:mapping:import KaraHogeBundle annotation
Entity を個別で作成
$ php app/console doctrine:mapping:import KaraHogeBundle annotation --filter=User

Entity に getter, setter を付けます。

すべての Entity を対象
$ php app/console doctrine:generate:entities KaraHogeBundle --no-backup
Entity 個別
$ php app/console doctrine:generate:entities KaraHogeBundle:User --no-backup

参考サイト

既にあるデータベースからエンティティを生成する方法 | Symfony2日本語ドキュメント

CRUD 一式を自動生成する

user テーブルの CRUD を自動生成します。出来上がった画面を必要に応じてカスタマイズします。

$ php app/console doctrine:generate:crud
The Entity shortcut name: KaraHogeBundle:User
Do you want to generate the "write" actions [no]? yes
Configuration format (yml, xml, php, or annotation) [annotation]: Enter
Routes prefix [/user]: Enter
Do you confirm generation [yes]? Enter

CRUD 結果をカスタマイズしたい場合は Symfony2のdoctrine:generate:crudコマンドの出力結果を上書きする を参考にどうぞ。

開発中によく使用するコマンド

その他、開発中によく使用するコマンドです。思い出したら随時更新します。

キャッシュをクリアする。

$ php app/console cache:clear

コンテナに登録されているサービスを一覧表示する。

$ php app/console container:debug

ルーティングを一覧表示する。

$ php app/console router:debug

コンソールコマンドを一覧表示する。

$ php app/console list

web/bundle/ に Bundle/Resources/public にあるディレクトリのシンボリックリンクを作成したり、web/app(_dev).php を作成したり。

$ php app/console assets:install --symlink

Doctrine の DQL を実行する。

$ php app/console doctrine:query:dql 'SELECT u FROM Kara\HogeBundle\Entity\User u WHERE u.id > 0' --max-result=3

-技術ブログ
-