Symfony2.0から2.8へのバージョンアップ

こんにちは、光永です。
今回は(も?)Symfonyのバージョンアップをやったのでその記事を書きました。バージョンアップマン
2.0からのバージョンアップは苦痛だ~~~

はりきっていきましょう!

はじめに

今回はSymfony2.0→2.3→2.8と経由してあげてみることにしました。
理由は単に直接上げたらエラーがいっぱい出すぎて心折れそうだったからです。
ということでだらっとやったことを書いておきます

めも

手順

※ 2.0→2.3・2.3→2.8とも、基本的には以下の手順です
※ 2.3→2.8は以下の記事もご参考に~~
http://www.kuzilla.co.jp/20160516_symfony2_2_3_to_2_8

2.0 => 2.3

1. SymfonyのUPDATE

  • app/AppKernel.phpを修正
    // new Symfony\Bundle\DoctrineBundle\DoctrineBundle(),
    new Doctrine\Bundle\DoctrineBundle\DoctrineBundle(),
  • app/config/config.ymlを修正

    # 追記
    parameters:
      locale: ja
    ...
    framework:
    #    charset:         UTF-8
      session:
          #auto_start:     true
          cookie_lifetime: 86400
          #lifetime: 86400
      #    default_locale: %locale%
      default_locale: %locale%
  • composer.pharをDLor適当なプロジェクトからコピーしてくる

  • composer.jsonをつくる。Symfony2.3のcomposer.jsonをgithubからコピー
  • いつものコマンドを実行
    php composer.phar update
    • 以下のエラーが発生
      • app/config/parameter.yml,app/config/parameter.yml.distがないよ!
        →githubから取ってきて作成+parameter.iniから内容をコピー
      • bootstrapファイル作成に失敗!
        →autoload.phpがの内容がだいぶ違っていたので、githubから取ってきてひとまず2.3の内容に修正
        Fatal error: Class 'Symfony\Component\ClassLoader\UniversalClassLoader'
        not found in D:\PhpProjects\HogehogeProject\app\autoload.php on line 9
        Script Sensio\Bundle\DistributionBundle\Composer\ScriptHandler::buildBootstrap
        handling the post-update-cmd event terminated with an exception
      • AppKernelで呼び出してるサードパーティ製バンドルがないよ!
        →depsファイルにあるプラグインの情報を参考に、composer.jsonに追記
      • JSM\SecurityExtraBundle\JMSSecurityExtraBundle() でエラー
        →(そもそもJMSSecurityExtraBundleは必要なのかしら・・・)
        [JMS\SecurityExtraBundle\Exception\RuntimeException]
        The JMSSecurityExtraBundle requires the JMSAopBundle, please make sure to enable it in your AppKernel.

        →対象のプロジェクトでは@Secureのアノテーションが利用されていない=使ってないのでとりあえずすてちゃえ→AppKernelからコメントアウト+configからコメントアウト

2. 古いファイルの差し替え

  • 古いファイルがそのままになっていますので、以下ファイルをgithubから取ってきて適宜作成・差し替えします
    • web/app.php
    • web/app_dev.php
    • web/config.php
    • app/SymfonyRequirements.php(作成)
    • app/check.php
  • 以下でエラーが出てなければおおよそOKです
    • app/check.phpを実行
      php app/check.php
      • ここでapp/cache、app/logsにアクセスできません!と言われました
        [[ ERROR ]] Checking that app/cache/ directory is writable: FAILED
        *** Change the permissions of the app/cache/ directory so that the w
        eb server can write in it ***
        You must fix this problem before resuming the check.

        フォルダがないのが原因ですので、作ります。

    • config.phpのページにアクセス

3. ひとまず動作確認

ここでapp_dev.phpにアクセスしてみるのですが・・・

Cannot load resource ".".

http://stackoverflow.com/questions/10949525/symfony2-cannot-load-resource

4. ソースを修正

※ 詳細はSymfonyのUPGRADEをみてね!★ミ
※ とりあえず対応が面倒だったものなどをピックアップしてお届け

  • twig: render問題
    {# 旧 #}
    {# {% render `HogehogeBundle:HugaHuga:show` with {'someparam': value} %} #}
    {# 新 #}
    {{ render(controller('HogehogeBundle:HugaHuga:show', {'someparam': value})) }}
    • 正規表現マンだ!!新しい顔よ!\一発置換/
      パラメータついてるやつ
      {% render (['"].+['"])( ?with ?)({.+}) %}

      {{ render(controller($1, $3)) }}

      ついてないやつ

      {% render (['"].+['"]) %}

      {{ render(controller($1)) }}
  • twig: app.session問題(2.0=>2.1)
  • twig: _form_is_choice_group問題(2.0=>2.1)
    • https://github.com/symfony/symfony/blob/2.8/UPGRADE-2.1.md#bc-breaks-in-themes-and-html
    • メソッドなくなった・・・ TwigExtensionで実装
      /**
      * {@inheritdoc}
      */
      public function getFunctions()
      {
        return array(
            // ...
            '_form_is_choice_group' => new \Twig_Function_Method($this, 'ficgSymfony2'),
        );
      }
      /**
      * symfony2.0にしか存在しないメソッドをラップ
      * @param mixed $label
      */
      public function ficgSymfony2($label)
      {
        return is_array($label);
      }
  • symfony: ChoiceListInterface問題(2.0=>2.1)
  • symfony: FormBuilder問題(2.0=>2.1)
  • symfony: $form->bindRequest/bind/submit 問題(2.0~)
    • Symfonyあるある2の気に入るまでメソッド名直し続ける問題だ~~~~
      この関連はほんと計画性なさすぎとりあえず以下で置換だ!
      $form->handleRequest($request);
  • symfony: addValidator削除
    • 以下の通り修正
      BEFORE
      $builder->addValidator(new CallbackValidator(function(FormInterface $form) {
        ...
      });

      AFTER

      $builder->addEventListener(\Symfony\Component\Form\FormEvents::POST_BIND, function($event) {
        $form = $event->getForm();
        ...
      });
  • symfony: form defaultOptions問題
    • エラーが出たよーーー
    • setDefaultOptionsでなくgetDefaultOptionsで定義されていたのが問題らしい
      public function getDefaultOptions(array $options)
      {
        return array(
            // options!
        );
      }

      public function setDefaultOptions(\Symfony\Component\OptionsResolver\OptionsResolverInterface $resolver)
      {
        $resolver->setDefaults(array(
            // options!
        ));
      }

一旦動いたのでとりあえず終了!
ここで多少問題が残っても、2.8系の素晴らしいデバッグ環境にしてから対応したほうが効率は良いです!

2.3 => 2.8

1. composer update

2. ファイルの差し替え

  • web/app.php, web/app_dev.php, app/console が変わっていたので2.3のときもやりましたが再度差し替えます
  • 差し替え終了したら、キャッシュをけしてから再実行します
    面倒なのでcache以下のフォルダをザクッと物理削除だ!
  • \うごいた/

3. もんくをいう

  • 2.3から2.8は2.0=>他に比べてだいぶ簡単なんですよね~・・・やっぱ*.0ってつくものはちょっと危険ですわいぶちぶち

おわりに

2.1系~composerが導入されたりconfig.ymlの書き換えとBundleの追加、Form周りの変更がやたらおおくて地獄でした。
差分を一覧にしてくれたらいいのに・・・

以上!お役に立てましたら幸い!
光永でした