symfony 1.0 から 1.1へアップグレード(UPGRADE_TO_1_1)
このファイルは http://trac.symfony-project.org/browser/branches/1.2/UPGRADE_TO_1_1 の翻訳です。
注意
このページはUPGRADE_TO_1_1(日本語訳)の体裁を整え読みやすくした記事です。
このドキュメントではsymfony1.1での変更点とsymfony1.0系のプロジェクトをアップグレードするためには何をする必要があるかについて説明しています。
注意: symfony 1.1はPHP5.1より新しいものとのみ互換性があります。
アップグレード方法
プロジェクトをアップグレードする方法
- SCM(バージョン管理システム)ツールを使っていない場合は、プロジェクトのバックアップをとっておいて下さい。symfonyはアップグレード中にファイルを置き換えるので(例えばフロンとコントローラー)、アップグレード後にあなたのカスタマイズ部分をマージするための手段が必要です。
- プロジェクトルートにある`symfony`ファイルにある次の3行を
PHP:
以下に変更してください
PHP:
また、symfonyのskeletonディレクトリからスケルトンファイルをコピーすることでも可能です。
$ cp /path/to/symfony/lib/task/generator/skeleton/project/symfony symfony
- `config/ProjectConfiguration.class.php`ファイルを以下の内容で作成してください。
PHP:
-
<?php
-
require_once '##SYMFONY_LIB_DIR##/autoload/sfCoreAutoload.class.php';
-
sfCoreAutoload::register();
-
-
class ProjectConfiguration extends sfProjectConfiguration
-
{
-
public function setup()
-
{
-
}
-
}
そして、`##SYMFONY_LIB_DIR##` をあなたの環境のsymfony1.1の`lib/`ディレクトリへのパスに書き換えてください。これでプロジェクトで使用されているsymfonyのバージョンを変更することができます。
また、symfonyプロジェクトのskeletonディレクトリからスケルトンファイルをコピーすることでも可能です。
$ cp /path/to/symfony/lib/task/generator/skeleton/project/config/ProjectConfiguration.class.php config/ProjectConfiguration.class.php
- 自動でアップグレードを行うために、プロジェクトディレクトリから`project:upgrade1.1` タスクを実行します。
PHP:
-
$ ./symfony project:upgrade1.1
このタスクは副作用なく複数回繰り返して実行することができます。つまり、新しいバージョンのsymfony 1.1, beta / RC または最終的にリリースされたsymfony1.1へアップグレードする度に、このタスクを実行する必要があります。
- もし、バリデーションやメール送信システムを新しいシステムにアップグレードする計画がないのであれば、互換性モードを`settings.yml`で有効にしなければなりません。
CSS:
-
all:
-
.settings:
-
compat_10: on
以下は互換性モードが有効になっているときの互換性の一覧です。(バンドルされている`sfCompat10Plugin`プラグインにあるもっと詳しい情報を参照してください。)
- Zend Framework と ezComponentsブリッジ
- sfProcessCache
- バリデーションシステム(validate.yml, バリデータクラスなど)
- フィルターに記入する
- phpmailerを使用したsfMail
プロジェクトをアップグレードする方法
- SCM(バージョン管理システム)ツールを使っていない場合は、プロジェクトのバックアップをとっておいて下さい。symfonyはアップグレード中にファイルを置き換えるので(例えばフロンとコントローラー)、アップグレード後にあなたのカスタマイズ部分をマージするための手段が必要です。
- プロジェクトルートにある`symfony`ファイルにある次の3行を
PHP:
以下に変更してください
PHP:また、symfonyのskeletonディレクトリからスケルトンファイルをコピーすることでも可能です。
$ cp /path/to/symfony/lib/task/generator/skeleton/project/symfony symfony
- `config/ProjectConfiguration.class.php`ファイルを以下の内容で作成してください。
PHP:
-
<?php
-
require_once '##SYMFONY_LIB_DIR##/autoload/sfCoreAutoload.class.php';
-
sfCoreAutoload::register();
-
-
class ProjectConfiguration extends sfProjectConfiguration
-
{
-
public function setup()
-
{
-
}
-
}
そして、`##SYMFONY_LIB_DIR##` をあなたの環境のsymfony1.1の`lib/`ディレクトリへのパスに書き換えてください。これでプロジェクトで使用されているsymfonyのバージョンを変更することができます。
また、symfonyプロジェクトのskeletonディレクトリからスケルトンファイルをコピーすることでも可能です。
$ cp /path/to/symfony/lib/task/generator/skeleton/project/config/ProjectConfiguration.class.php config/ProjectConfiguration.class.php
-
- 自動でアップグレードを行うために、プロジェクトディレクトリから`project:upgrade1.1` タスクを実行します。
PHP:
-
$ ./symfony project:upgrade1.1
このタスクは副作用なく複数回繰り返して実行することができます。つまり、新しいバージョンのsymfony 1.1, beta / RC または最終的にリリースされたsymfony1.1へアップグレードする度に、このタスクを実行する必要があります。
-
- もし、バリデーションやメール送信システムを新しいシステムにアップグレードする計画がないのであれば、互換性モードを`settings.yml`で有効にしなければなりません。
CSS:
-
all:
-
.settings:
-
compat_10: on
以下は互換性モードが有効になっているときの互換性の一覧です。(バンドルされている`sfCompat10Plugin`プラグインにあるもっと詳しい情報を参照してください。)
- Zend Framework と ezComponentsブリッジ
- sfProcessCache
- バリデーションシステム(validate.yml, バリデータクラスなど)
- フィルターに記入する
- phpmailerを使用したsfMail
-
ここからは互換性のない変更点について説明します。
バッチスクリプト
バッチスクリプトの利用は廃止され、CLIタスクに代わりました。新しいCLIシステムは簡単に新しいsymfonyコマンドをプロジェクトに追加することができます。詳しくはドキュメントの16章を参照してください。
もし古いバッチスクリプトを動作させたいなら、各バッチスクリプトの最初の行をフロントコントローラーと同じよううに変更する必要があります。そのため以下の部分を
-
<?php
-
-
require_once(SF_ROOT_DIR.DIRECTORY_SEPARATOR.'apps'.DIRECTORY_SEPARATOR.SF_APP.DIRECTORY_SEPARATOR.'config'.DIRECTORY_SEPARATOR.'config.php');
-
// your batch code here
次のように変更しなければなりません。
-
<?php
-
$configuration = ProjectConfiguration::getApplicationConfiguration('frontend', 'prod', false);
-
sfContext::createInstance($configuration);
-
-
// your batch code here
データベース接続を初期化する必要があるなら、さらに以下の行を追加するだけです。
-
$databaseManager = new sfDatabaseManager($configuration);
-
$databaseManager->loadConfiguration();
Flash属性
Flash属性は`sfUser`によって直接管理されるようになります。新しい使い方は以下の通りです。
-
// action
-
$this->getUser()->setFlash('notice', 'foo');
-
$notice = $this->getUser()->getFlash('notice');
-
// template
-
<?php $sf_user->hasFlash('notice'): ?>
-
<?php endif; ?>
`filters.yml`にある`flash`項目は`sfFlashFilter`と同じく削除しなければなりません。
これらの変更作業は`project:upgrade1.1`タスクがあなたに代わって全て行ってくれます。
sfComponentにある廃止されたメソッド
次の`sfComponent`にあるメソッドは削除されました。
- `->getPresentationFor()`
- `->sendEmail()`
これらは`sfController`からアクセスできます。
-
// action
-
$this->getController()->getPresentationFor(...);
これらの変更作業は`project:upgrade1.1`タスクがあなたに代わって全て行ってくれます。
シングルトン
sfI18N, sfRoutingそしてsfLoggerオブジェクトはファクトリメソッドパターンであり、シングルトンではありません。
もし、コードの中でこれらのオブジェクトをたった1つだけ取得したい場合は、`sfContext`から利用できます。
-
sfContext::getInstance()->getI18N()
-
sfContext::getInstance()->getRouting()
-
sfContext::getInstance()->getLogger()
ルーティング
以下は`factories.yml`にあるルーティングのための標準の設定です。
-
routing:
-
class: sfPatternRouting
-
param:
-
load_configuration: true
これらの変更作業は`project:upgrade1.1`タスクがあなたに代わって全て行ってくれます。
ロギング
以下は`factories.yml`にあるロギングのための標準の設定です。
-
logger:
-
class: sfAggregateLogger
-
param:
-
level: debug
-
loggers:
-
sf_web_debug:
-
class: sfWebDebugLogger
-
param:
-
condition: %SF_WEB_DEBUG%
-
xdebug_logging: true
-
sf_file_debug:
-
class: sfFileLogger
-
param:
-
file: %SF_LOG_DIR%/%SF_APP%_%SF_ENVIRONMENT%.log
`logging.yml`設定ファイルはもう使われません。代わりに、`factories.yml`でロギングの設定が行えます。
製品環境でロギングを無効にするためには、アプリケーションの`factories.yml`に変更を加えなければなりません。
-
prod:
-
logger:
-
class: sfNoLogger
-
param:
-
level: err
-
loggers: ~
`logging_enabled`設定が`settings.yml`に新しく存在しています。
この項目でも製品環境でロギングされないように設定することができます。
-
prod:
-
.settings:
-
logging_enabled: off
これらの変更作業は`project:upgrade1.1`タスクがあなたに代わって全て行ってくれます。
i18n
以下は`factories.yml`にあるi18nのための標準設定です。
-
i18n:
-
class: sfI18N
-
param:
-
source: XLIFF
-
debug: off
-
untranslated_prefix: "[T]"
-
untranslated_suffix: "[/T]"
-
cache:
-
class: sfFileCache
-
param:
-
automatic_cleaning_factor: 0
-
cache_dir: %SF_I18N_CACHE_DIR%
-
lifetime: 86400
-
prefix: %SF_APP_DIR%
`i18n.yml`設定ファイルはもう使われません。代わりに、`factories.yml`でi18nについて設定することができます。
唯一の例外は`settings.yml`に今もある`default_culture`設定でi18nフレームワークに依存していません。
-
default_culture: en
もし、あなたのプロジェクトが特別な設定になっているのなら、現在の設定を`i18n.yml`から`factories.yml`に移動させ、上にあるように`settings.yml`にdefault_cultureの設定を追加しなければなりません。
キャッシュフレームワーク
`sfFunctionCache`クラスは`sfFileCache`クラスの拡張ではなくなりました。
現在は、キャッシュオブジェクトをコンストラクタに渡さなければなりません。
->call()への最初の引数はPHPが呼び出せるものでなければなりません。
`sfCache`設定パラメータの名前がアンダースコア形式の名前に変更されました。
- automaticCleaningFactor -> automatic_cleaning_factor
- cacheDir -> cache_dir
これらの変更作業は`project:upgrade1.1`タスクがあなたに代わって全て行ってくれます。
オートローディング
`settings.yml`にある`autoloading_function`設定はもう使われません。
あなたのアプリケーションにある設定クラスにautoloadingを登録できます。
新しい`sfAutoload::autoloadAgain()`メソッドのおかげで、プロジェクトにクラスを追加したり移動したりしてもキャッシュをクリアする必要がありません。このメソッドは自動的に変更点をみつけ、自動読み込みのためのキャッシュを更新します。
VERSIONファイル
lib/VERSION ファイルは削除されました。もし現在のsymfonyのバージョンを知りたい場合は、`SYMFONY_VERSION`定数を使うことができます。この定数は`autoload/sfCoreAutoload.class.php`で定義されます。
ルーティング
標準のルーティングのためのパラメータを注入するために、これからは`sf_routing_defaults`設定を使う代わりに`->setDefaultParameter()`メソッドを使うことができます。
-
$this->context->getRouting()->setDefaultParameter($key, $value);
I18N
symfonyのコアクラスは国際化された文字列を返しません。
この動作は以下のメソッドと関数に代わりました。
-
sfWebRequest::getError()
-
sfWebResponse::addMeta()
以下の(sfCompat10Pluginにある)ヘルパーでは、まだ国際化されたデータを返します。
-
form_error()
-
include_metas()
`getGlobalMessageSource()`と`getGlobalMessageFormat()`メソッドはsfI18Nクラスから削除されました。それらは現在では`getMessageSource()`と`getMessageFormat()`に実装されています。
Logger
ロガーのプライオリティは現在では次のような定数になっています。
-
sfLogger::INFO
これらの変更作業は`project:upgrade1.1`タスクがあなたに代わって全て行ってくれます。
sfActionで廃止されたメソッド
以下の`sfAction`にあるメソッドは廃止され、`sf_compat_10`が`false`に設定されていたなら`sfConfigurationException`の例外を投げます。
- `->validate()`
- `->handleError()`
sfRequestで廃止されたメソッド
以下の`sfRequest`にあるメソッドは廃止され、`sf_compat_10`が`false`に設定されていたなら`sfConfigurationException`の例外を投げます。
- `->getError()`
- `->getErrors()`
- `->getErrorNames()`
- `->hasError()`
- `->hasErrors()`
- `->setError()`
- `->setErrors()`
- `->removeError()`
sfWebRequestで廃止されたメソッド
以下の`sfWebRequest`にあるメソッドは廃止され、`sf_compat_10`が`false`に設定されていたなら`sfConfigurationException`の例外を投げます。
- `->getFile()`
- `->getFileError()`
- `->getFileName()`
- `->getFileNames()`
- `->getFilePath()`
- `->getFileSize()`
- `->getFileType()`
- `->hasFile()`
- `->hasFileError()`
- `->hasFileErrors()`
- `->hasFiles()`
- `->getFileValue()`
- `->getFileValues()`
- `->getFileExtension()`
- `->moveFile()`
`->initialize()` メソッド
ほとんどのsymfonyのコアクラスは`->initialize()`メソッドのおかげで初期化されます。
symfony1.1においては、このメソッドは自動的に`__construct()`で呼ばれます。そのため、あなた自身が呼び出す必要はありません。
設定ファイルの読み込み
コアクラスの中には`.yml`ファイルで設定できるものがあります。
| Class | Configuration file |
|---|---|
| `sfAction` | `security.yml` |
| `sfAutoload` | `autoload.yml` |
| `sfConfigCache` | `config_handlers.yml` |
| `sfContext` | `factories.yml` |
| `sfController` | `generator.yml` and `module.yml` |
| `sfDatabaseManager` | `databases.yml` |
| `sfFilterChain` | `filters.yml` |
| `sfI18N` | `i18n.yml` |
| `sfPatternRouting` | `routing.yml` |
| `sfPHPView` | `view.yml` |
| `sfViewCacheManager` | `cache.yml` |
symfony1.1では、``独立した``サブフレームワークのための設定ファイルの読み込みは重複したものを消したり、フレームワーク全体で必要とされていないサブフレームワークを再利用できるように`loadConfiguration()`メソッドに移動しました。
- `sfDatabaseManager`
- `sfI18N`
- `sfPatternRouting`
そのため、例えば、バッチスクリプトでデータベースマネージャが必要であれば、次のようなコードから
-
$databaseManager = new sfDatabaseManager();
-
$databaseManager->initialize();
以下のようなコードに書き換えなければなりません。
-
$configuration = ProjectConfiguration::getApplicationConfiguration($application, $env, true);
-
$databaseManager = new sfDatabaseManager($configuration);
-
$databaseManager->loadConfiguration();
`initialize()`の呼び出しはもはや必要ありません。(上記参照)
Web デバッグ
`filters.yml`にある`web_debug`項目は`sfWebDebugFilter`と同じく削除されました。Webデバグツールバーは現在ではレスポンスの中にリスナーによって注入されています。
これらの変更作業は`project:upgrade1.1`タスクがあなたに代わって全て行ってくれます。
セッションのタイムアウト
`sf_timeout`設定はもう使われません。セッションのタイムアウトを変更するためには、`settings.yml`の代わりに`factories.yml`を編集し、`user`部分のパラメータを変更しなければなりません。
-
all:
-
user:
-
class: myUser
-
param:
-
timeout: 1800 # session timeout in seconds
ルーティング設定
`sf_suffix`, `sf_default_module` そして `sf_default_action`設定はもう使用されません。標準の接尾辞(サフィックス)、モジュール、アクションを変更するためには、`setting.yml`の代わりに`factories.yml`を編集し、`routing`部分を変更しなければなりません。
-
all:
-
routing:
-
class: sfPatternRouting
-
param:
-
load_configuration: true
-
suffix: . # Default suffix for generated URLs. If set to a single dot (.), no suffix is added. Possible values: .html, .php, and so on.
-
default_module: default # Default module and action to be called when
-
default_action: index # A routing rule doesn't set it
`php.yml` 設定ファイル
`php.yml`設定は削除されました。
手動でチェックしなければならない設定項目は、`log_errors`という項目が`php.yml`で`on`になっているかです。
`php.yml`は`data/bin`にある`check_configuration.php`ユーティリティにとって代わりました。それはsymfonyが必要とする環境に反していないかどうかを確認します。どこからでも以下のようにして起動できます。
$ php /path/to/symfony/data/bin/check_configuration.php
コマンドラインからこのユーティリティを使うことができるとしても、PHPがCLI版とWEB版で異なるphp.iniを使うことができてしまうので、ウェブルートディレクトリにコピーし、ブラウザから起動することを強く推奨します。
`$sf_symfony_data_dir` の削除
symfony1.1では、`$sf_symfony_data_dir`は削除されました。全ての関連するファイルとディレクトリはsymfonyの`data`ディレクトリから`lib`ディレクトリに移動されました。
| Old Location | New Location |
|---|---|
| `data/config` | `lib/config/config` |
| `data/i18n` | `lib/i18n/data` |
| `data/skeleton` | `lib/task/generator/skeleton` |
| `data/modules/default` | `lib/controller/default` |
| `data/web/errors` | `lib/exception/data` |
| `data/exception.*` | `lib/exception/data` |
symfonyのコアクラスはこれらの変更を考慮するようにアップグレードされました。
sfLoader
全ての`sfLoader`の静的なメソッド(`::getHelperDirs()`と`::loadHelpers()`は除く)は`sfProjectConfiguration`と`sfApplicationCOnfiguration`クラスに移動しました。
- `sfProjectConfiguration`:
- `->getGeneratorSkeletonDirs()`
- `->getGeneratorTemplate()`
- `->getGeneratorTemplateDirs()`
- `->getModelDirs()`
- `sfApplicationConfiguration`:
- `->getControllerDirs()`
- `->getTemplateDirs()`
- `->getTemplateDir()`
- `->getTemplatePath()`
- `->getI18NGlobalDirs()`
- `->getI18NDirs()`
- `->getConfigPaths()`
sfCore
`sfCore`は削除されました。そしてこのコードは`sfProjectConfiguration`, `sfApplicationConfiguration`そして`sfContext`クラスに移動しました。
フロントコントローラー
全てのフロントコントローラーはアップグレードしなければなりません。SF_DEBUG, SF_APP, SF_ENVIRONMENTそしてSF_ROOT_DIRの定数はもうありません。もしこれらの定数が必要であれば、`sfConfig::get('')`を使ってください。
| Old | New |
|---|---|
| `SF_ROOT_DIR` | `sfConfig::get('sf_root_dir')` |
| `SF_ENVIRONMENT` | `sfConfig::get('sf_environment')` |
| `SF_APP` | `sfConfig::get('sf_app')` |
| `SF_DEBUG` | `sfConfig::get('sf_debug')` |
これらの変更作業は`project:upgrade1.1`タスクがあなたに代わって全て行ってくれます。
もし、カスタマイズを行っているならば、タスクを実行すると警告が表示され、自動的にアップグレードできないでしょう。また、symfony: /path/to/symfony/lib/task/generator/skeleton/app/web/index.phpから標準のスケルトンをコピーすることができます。
config.php
全ての`config.php`ファイルは削除されました。`ProjectConfiguration`クラスとアプリケーションの設定クラスに置き換えられました。
`config.php`にカスタマイズを行っている場合は、新しいクラスに移動させなければなりません。
ディレクトリ構造
全ての`_dir_name`で終わっている`sfConfig`定数は削除されました。
Cache keys
`sfViewCacheManager::removePattern()`と`sfToolkit::clearGlob()`は一度に複数のキャッシュ部分を削除するためには動作しなくなりました。しかし、`sfViewCacheManager::remove()`は内部URIをワイルドカードを用いて受け入れることができるようになっています。
そのために、次のようなコードは
-
$cacheManager->removePattern('*/all/user/show/id/*');
以下のように書き換えることができます。
-
$cacheManager->remove('user/show?id=*', '*', 'all');
また、パーシャルや、テンプレートごとの異なるパーシャルに対しても動作します。そのため以下のようなコードは
-
$cacheManager->removePattern('/sf_cache_partial/user/_my_partial/sf_cache_key/*');
以下のように書き換えることができます
-
$cacheManager->remove('@sf_cache_partial?module=user&action=_my_partial&sf_cache_key=*');
そして、最大の利点は `sfFileCache`だけでなく *どんな* キャッシュファクトリでも`glob`スタイルでURIを消去することができることです。
レイアウト
アクションテンプレートの変数はレイアウト内では利用できません。これはレイアウトは**グローバル**な変数(sf_で始まる全ての変数)と、`tempalte.filter_parameters`イベントを通して登録されている変数にのみアクセスすることができるということです。
アップグレードの方法については以下のwikiを参照してください。
http://trac.symfony-project.com/wiki/Symfony11LayoutUpgrade
タスク
symfonyコマンドラインタスクの名前が変更されました。新しい名前空間の構文が使われるようになりました。古いsymfonyタスク名はまだ動作します。そしてそれらは新しいタスク名のエイリアスにすぎません。以下に変更した名前を表にまとめてあります。
| Old task name | New task name |
|---|---|
| clear-cache | cache:clear|| |
| clear-controllers | project:clear-controllers |
| disable | project:disable |
| downgrade | [Not implemented] |
| enable | project:enable |
| fix-perms | project:permissions |
| freeze | project:freeze |
| init-app | generate:app |
| init-batch | [Not implemented] |
| init-controller | [Not implemented] |
| init-module | generate:module |
| init-project | generate:project |
| log-purge | log:clear |
| log-rotate | log:rotate |
| plugin-install | plugin:install |
| plugin-list | plugin:list |
| plugin-uninstall | plugin:uninstall |
| plugin-upgrade | plugin:upgrade |
| propel-build-all | propel:build-all |
| propel-build-all-load | propel:build-all-load |
| propel-build-db | propel:build-db |
| propel-build-model | propel:build-model |
| propel-build-schema | propel:build-schema |
| propel-build-sql | propel:build-sql |
| propel-convert-xml-schema | propel:schema-to-yml |
| propel-convert-yml-schema | propel:schema-to-xml |
| propel-dump-data | propel:data-dump |
| propel-generate-crud | propel:generate-crud |
| propel-init-admin | propel:init-admin |
| propel-init-crud | [Not implemented] |
| propel-insert-sql | propel:insert-sql |
| propel-load-data | propel:data-load |
| sync | project:deploy |
| test-all | test:all |
| test-functional | test:functional |
| test-unit | test:unit |
| unfreeze | project:unfreeze |
| upgrade | project:freeze |
以前ように、利用可能なタスクのリストを表示させたいなら、引数無しで`symfony`コマンドを呼ぶだけです。
> php symfony
早期に適用しようとしている開発者へ
もし、プロジェクトをアップグレードさせて、`lib/Projectconfiguratioun.class.php`ファイルが存在するならば、`project:upgrade1.1`タスクを実行できるようにする前に手動でプロジェクトをアップグレードする必要があります。
以下に手順を示します。
- `lib/ProjectConfiguration.class.php` を `config/ProjectConfiguration.class.php` に移動します。
- 必要があれば、`config/ProjectConfiguration.class.php`にあるsymfonyへのパスを変更します。
- 全てのアプリケーションの設定クラス(`lib/$APP_NAME$Configuration.class.php`)を`apps/$APP_NAME$/config/`ディレクトリに移動します。
- 全てのアプリケーション設定クラスにある`require_once dirname(__FILE__).'/ProjectConfiguration.class.php';`を削除します。
- メインの`symfony`スクリプトにある`ProjectConfiguration.class.php`の位置を`config/`に変更します。
- フロントコントローラを次のように変更します。
-
<?php
-
-
-
$configuration = ProjectConfiguration::getApplicationConfiguration('frontend', 'dev', true);
-
sfContext::createInstance($configuration)->dispatch();
これで`project:upgrade1.1`スクリプトを実行し、アップグレードすることができます。