Symfony2 でブログを作ろう で勉強中。
バージョンアップによる相違やはまったところをメモ。
随時更新します。
相違点
フォームAPI が変わっている
Form->bindRequest($request);
Form->bind($request);
セッションAPI が変わっている
[パート2] app.session.hasFlash でエラーとなる。
Symfony\HttpFoundation\Session が改良されている。
Session 自体に単一の flash プロパティという構成から、
flash という概念を FlashBag というクラスに表し、更にコレクションに変更されている。
hasFlash のように存在を確認する必要はなく、for in で処理することが可能。
{% if app.session.hasFlash('blogger-notice') %}
<div class="blogger-notice">
{{ app.session.flash('blogger-notice') }}
</div>
{% endif %}
{% 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
Twig render の記法が変わっている
[パート4] {% render ~ %} でエラー「unexpected name of value ~」
render の記法はこう
{{ render(controller('bundle:controller:action', { 'with': param })) }}
Assetic のデフォルト設定に注意
[パート5] Assetic の使用で例外発生
Assetic の設定について特に言及がないが、デフォルトで Assetic の使用を許可するバンドルを設定する項目が有効になっていた。
# 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!」 となる。
[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 に以下の設定を追記することで回避できる。
xdebug.max_nesting_level=500
Entity ORM テーブル名マッピング情報を変更後、マイグレーションしても反映されない
アノテーションでテーブル名を変更し、doctrine コマンドでマイグレーションを試みたがどうしても反映されない。
一度 DB を Drop してから doctrine:schema:create しても、以前のテーブル名で作成されていまう。
Doctrine メタデータがキャッシュされていることが原因だった模様。
念のためすべての Doctrine キャッシュを削除し、改めて doctrine:schema:create したら反映された。
[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()