LoginSignup
13

More than 5 years have passed since last update.

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

Last updated at Posted at 2013-06-24

Symfony2 でブログを作ろう で勉強中。
バージョンアップによる相違やはまったところをメモ。
随時更新します。

相違点

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

旧API
Form->bindRequest($request);
新API
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

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

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

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

render の記法はこう

render
{{ render(controller('bundle:controller:action', { 'with': param })) }}

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

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

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

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!」 となる。

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 に以下の設定を追記することで回避できる。

php.ini
xdebug.max_nesting_level=500

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

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

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

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()

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13