Symfony2 チュートリアル「symblog」 Symfony 2.3 との相違点まとめ + α

[Symfony2 でブログを作ろう](http://symblog.ganchiku.com/) で勉強中。
バージョンアップによる相違やはまったところをメモ。
随時更新します。

# 相違点

## フォームAPI が変わっている

```php:旧API
Form->bindRequest($request);
```

```php:新API
Form->bind($request);
```

## セッションAPI が変わっている

[パート2] app.session.hasFlash でエラーとなる。
Symfony\HttpFoundation\Session が改良されている。

Session 自体に単一の flash プロパティという構成から、
flash という概念を FlashBag というクラスに表し、更にコレクションに変更されている。
hasFlash のように存在を確認する必要はなく、for in で処理することが可能。

```html+smarty:旧コード
{% if app.session.hasFlash('blogger-notice') %}
	<div class="blogger-notice">
		{{ app.session.flash('blogger-notice') }}
	</div>
{% endif %}
```

```html+smarty:新コード
{% for flashMessage in app.session.flashbag.get('blogger-notice') %}
	<div class="blogger-notice">
		{{ flashMessage }}
	</div>
{% endfor %}
```

## deps が廃止され、ベンダバンドルの管理が composer に移管されている

[パート3] データフィクスチャをインストールする手段の deps が存在しない

以下参照
http://www.karakaram.com/symfony21-install#install-third-party-bundle

「doctrine/data-fixtures * -> no matching package found.」
と表示される場合、composer.json の minimum-stability を stable から alpha に書き換える。

## Doctrine イベントシステム API が変わっている

[パート3] アノテーション @ORM\preUpdate で実行時エラー

ライフサイクルコールバックのイベント名はラージケースに変更されたらしい。
@ORM\preUpdate → @ORM\PreUpdate

以下参照
http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/events.html#lifecycle-callbacks

## Twig render の記法が変わっている

[パート4] {% render ～ %} でエラー「unexpected name of value ～」

render の記法はこう

```html+smarty:render
{{ render(controller('bundle:controller:action', { 'with': param })) }}
```

http://symfony.com/doc/current/book/templating.html#templating-embedding-controller

## Assetic のデフォルト設定に注意

[パート5] Assetic の使用で例外発生

Assetic の設定について特に言及がないが、デフォルトで Assetic の使用を許可するバンドルを設定する項目が有効になっていた。

```yaml:app/config/config.yml
# Assetic Configuration
assetic:
    debug:          %kernel.debug%
    use_controller: false
    bundles:        [ ]
    #java: /usr/bin/java
    filters:
        cssrewrite: ~
        #closure:
        #    jar: %kernel.root_dir%/Resources/java/compiler.jar
        #yui_css:
        #    jar: %kernel.root_dir%/Resources/java/yuicompressor-2.4.7.jar
```

↑の bundles: [ ] をコメントアウトするか、 bundles: ['BloggerBlogBundle'] のように許可するバンドルを指定すればOK。

# はまりどころ

## Apache の 500 Internal Server Error が出て Symfony2 のエラーページが出てこない。

標準でついてくるロガー「monolog」の chromephp が開発環境で有効になっており、
ヘッダに大量のデータを埋め込もうとして Apache エラーを引き起こしている。
いまのところ使わないので app/config/config_dev.yml の対象行をコメントアウト。

## PHPUnit 機能テスト実行時にエラーでテストできない

[パート6] 「PHP Fatal error:  Maximum function nesting level of '100' reached, aborting!」 となる。

```shell-session:phpunit
[user@host public_html]$ phpunit -c app src/Blogger/BlogBundle/Tests/Controller/PageControllerTest.php 
PHPUnit 3.7.21 by Sebastian Bergmann.

Configuration read from /home/kenta/public_html/app/phpunit.xml

PHP Fatal error:  Maximum function nesting level of '100' reached, aborting! in /home/user/public_html/vendor/symfony/symfony/src/Symfony/Component/Routing/Matcher/Dumper/DumperCollection.php on line 81
PHP Stack trace:
... スタックトレースが続く
```

xdebug を使っている場合、ネスト可能な関数の数がデフォルトで 100 にセットされているために発生するエラー。
php.ini に以下の設定を追記することで回避できる。

```ini:php.ini
xdebug.max_nesting_level=500
```

## Entity ORM テーブル名マッピング情報を変更後、マイグレーションしても反映されない

アノテーションでテーブル名を変更し、doctrine コマンドでマイグレーションを試みたがどうしても反映されない。
一度 DB を Drop してから doctrine:schema:create しても、以前のテーブル名で作成されていまう。

Doctrine メタデータがキャッシュされていることが原因だった模様。
念のためすべての Doctrine キャッシュを削除し、改めて doctrine:schema:create したら反映された。

```shell-session:Doctrineキャッシュ削除
[user@host public_html]$ php app/console doctrine:cache:clear-metadata
[user@host public_html]$ php app/console doctrine:cache:clear-query
[user@host public_html]$ php app/console doctrine:cache:clear-result
```

試してはいないが、doctrine:migrations も同じ理由で反映されていなかっただけと推測。

# duplicated

・Doctrine->getEntityManager() ... Doctrine->getManager()