Symfony 2.0から2.6への移行

この記事では、プロジェクトをレガシーSymfony 2.0から現在のSymfony 2.6に移行するために経験しなければならなかったいくつかのニュアンスについてお話したいと思います。



依存関係マネージャー


Symfonyの各プロジェクトには、独自の依存関係(バンドル)があります。 バージョン2.0では、依存関係はdepsファイルで指定され、次のコマンドでプルアップされました。



php bin/vendors install
      
      





これらの目的のために、Composerを使用することが重要です。



Composerをリポジトリのルートにダウンロードします。



 php -r "readfile('https://getcomposer.org/installer');" | php
      
      







次に、プロジェクトルートに次の内容のcomposer.jsonファイルを作成します。

github.com/symfony/symfony/blob/2.6/composer.json

そして、コマンドを実行します:



 php composer.phar update
      
      





その後、Symfony 2.6は必要なすべての依存関係とともにプロジェクトに取り込まれ、composer.lockファイルが作成されます。このファイルには、ダウンロードされた依存関係の現在のバージョンが書き込まれます。



あとは、必要な依存関係をcomposer.jsonファイルに追加するだけです。 これは、ファイルを編集して手動で行うことができます。



 "require": { "{ }":"{ }" },
      
      





または、次のコマンドを使用します。



 php composer.phar require { }:{ }
      
      





必要なすべてのバンドルが揃ったので、depsおよびdeps.lockファイルを削除できますが、フレームワークが正常に機能するためには、web / app.phpおよびweb / app_dev.phpファイルも更新する必要があります。



app.php


 <?php use Symfony\Component\ClassLoader\ApcClassLoader; use Symfony\Component\HttpFoundation\Request; $loader = require_once __DIR__.'/../app/bootstrap.php.cache'; // Enable APC for autoloading to improve performance. // You should change the ApcClassLoader first argument to a unique prefix // in order to prevent cache key conflicts with other applications // also using APC. /* $apcLoader = new ApcClassLoader(sha1(__FILE__), $loader); $loader->unregister(); $apcLoader->register(true); */ require_once __DIR__.'/../app/AppKernel.php'; //require_once __DIR__.'/../app/AppCache.php'; $kernel = new AppKernel('prod', false); $kernel->loadClassCache(); //$kernel = new AppCache($kernel); // When using the HttpCache, you need to call the method in your front controller instead of relying on the configuration parameter //Request::enableHttpMethodParameterOverride(); $request = Request::createFromGlobals(); $response = $kernel->handle($request); $response->send(); $kernel->terminate($request, $response);
      
      





app_dev.php


 <?php use Symfony\Component\HttpFoundation\Request; use Symfony\Component\Debug\Debug; // If you don't want to setup permissions the proper way, just uncomment the following PHP line // read http://symfony.com/doc/current/book/installation.html#configuration-and-setup for more information //umask(0000); // This check prevents access to debug front controllers that are deployed by accident to production servers. // Feel free to remove this, extend it, or make something more sophisticated. if (isset($_SERVER['HTTP_CLIENT_IP']) || isset($_SERVER['HTTP_X_FORWARDED_FOR']) || !(in_array(@$_SERVER['REMOTE_ADDR'], array('127.0.0.1', 'fe80::1', '::1')) || php_sapi_name() === 'cli-server') ) { header('HTTP/1.0 403 Forbidden'); exit('You are not allowed to access this file. Check '.basename(__FILE__).' for more information.'); } $loader = require_once __DIR__.'/../app/bootstrap.php.cache'; Debug::enable(); require_once __DIR__.'/../app/AppKernel.php'; $kernel = new AppKernel('dev', true); $kernel->loadClassCache(); $request = Request::createFromGlobals(); $response = $kernel->handle($request); $response->send(); $kernel->terminate($request, $response);
      
      





パラメータ


Symfony 2.0の場合、パラメーターはapp / config / parameters.iniファイルからロードされました。 必要なのは、app / config / parameters.ymlに名前を変更し、ymlファイルを次のようにすることです。



前:



 [parameters] locale = en
      
      





後:



 parameters: locale: en
      
      





それからapp / config / config.ymlにファイルのパスを書きます:



 imports: - { resource: parameters.yml }
      
      





パラメーターが変更され、接続されました。



機能の後方互換性


バージョン2.0から2.6まで、かなり多くの変更が発生しましたが、そのうちのいくつかについてのみ説明したいと思います。



フォーム:


一部の関数は、既に送信されたフォームで使用された場合に例外をスローするようになりました。

 add(), remove(), setParent(), bind() and setData()
      
      







これらは、フォームを送信する直前にformBuilderのリスナーから呼び出すか、フォームのロジックをわずかに変更できます。 ただし、一時的な手段として、次のコードを使用できます。



 $formData = $form->getData(); $form = $this->createForm(new YourForm()); $form->setData($formData);
      
      





フォームを再作成し、古いフォームからすべてのパラメーターをフォームに渡した後、既に送信されたフォームで使用できなかったすべての関数を使用できます。



フォーム検証:


FormBulderの無効なCallbackValidationクラスを使用する代わりに、フォームが既に送信された後、つまりEventListenerを使用します。 POST_SUBMIT。



前:



  $builder->addValidator(new CallbackValidator(function (FormInterface $form) { $value = $form['date']->getData(); if ($value != null) { $form['date']->addError(new FormError('  ')); } }));
      
      





後:



  $builder->addEventListener(FormEvents::POST_SUBMIT, function (FormEvent $event) { $form = $event->getForm(); $value = $form['date']->getData(); if ($value != null) { $form['date']->addError(new FormError('  ')); } });
      
      







フォームフィールドにオプションを追加する


フォームフィールドMyBundle \ Forms \ ExtensionExtensionForm.phpでオプションを作成するとき; これらのオプションが追加されるフィールドのタイプを示す必要があります。



 public function getExtendedType() { return 'text'; }
      
      





すべてのタイプのフィールドにそれらを追加する場合は、次を指定する必要があります。



  public function getExtendedType() { return 'form'; }
      
      





変更の完全なリスト



github.com/symfony/symfony/blob/2.7/UPGRADE-2.1.md

github.com/symfony/symfony/blob/2.7/UPGRADE-2.2.md

github.com/symfony/symfony/blob/2.7/UPGRADE-2.3.md

github.com/symfony/symfony/blob/2.7/UPGRADE-2.4.md

github.com/symfony/symfony/blob/2.7/UPGRADE-2.5.md

github.com/symfony/symfony/blob/2.7/UPGRADE-2.6.md



symfony公式ドキュメント: symfony.com/doc/current/cookbook/index.html



All Articles