From e7f770ed68ab8612e09c2430000306b8ef3ebe25 Mon Sep 17 00:00:00 2001 From: Nobuo Kihara Date: Thu, 5 Feb 2015 08:14:11 +0900 Subject: [PATCH 1/4] docs/guide-ja/concept - minor fixes [ci skip] --- docs/guide-ja/concept-behaviors.md | 2 +- docs/guide-ja/concept-configurations.md | 2 +- docs/guide-ja/concept-events.md | 4 ++-- docs/guide-ja/concept-properties.md | 5 +++-- 4 files changed, 7 insertions(+), 6 deletions(-) diff --git a/docs/guide-ja/concept-behaviors.md b/docs/guide-ja/concept-behaviors.md index c955d25..f614099 100644 --- a/docs/guide-ja/concept-behaviors.md +++ b/docs/guide-ja/concept-behaviors.md @@ -100,7 +100,7 @@ function ($event) { ビヘイビアのアタッチ ------------------- -[[yii\base\Component|component]] へのビヘイビアのアタッチは、静的にも動的にも可能です。実際は、前者のほうがより一般的ですが。 +[[yii\base\Component|コンポーネント]] へのビヘイビアのアタッチは、静的にも動的にも可能です。実際は、前者のほうがより一般的ですが。 ビヘイビアを静的にアタッチするには、ビヘイビアをアタッチしたいコンポーネントクラスの [[yii\base\Component::behaviors()|behaviors()]] メソッドをオーバーライドします。 [[yii\base\Component::behaviors()|behaviors()]] メソッドは、ビヘイビアの [構成](concept-configurations.md) のリストを返さなければなりません。 diff --git a/docs/guide-ja/concept-configurations.md b/docs/guide-ja/concept-configurations.md index 2270ae7..e0901a1 100644 --- a/docs/guide-ja/concept-configurations.md +++ b/docs/guide-ja/concept-configurations.md @@ -82,7 +82,7 @@ Yii::configure($object, $config); ### アプリケーションの構成 [アプリケーション](structure-applications.md) の構成は、おそらく Yii の中で最も複雑な配列のひとつです。 -それは [[yii\web\Application|application]] クラスが、設定可能なプロパティとイベントを数多く持つためです。 +それは [[yii\web\Application|アプリケーション]] クラスが、設定可能なプロパティとイベントを数多く持つためです。 さらに重要なことは、その [[yii\web\Application::components|components]] プロパティが、アプリケーションに登録されている コンポーネント生成用の構成情報配列を受け取ることができることです。以下は、 [basic application template](start-basic.md) のアプリケーション構成ファイルの概要です。 diff --git a/docs/guide-ja/concept-events.md b/docs/guide-ja/concept-events.md index 011540b..e067c27 100644 --- a/docs/guide-ja/concept-events.md +++ b/docs/guide-ja/concept-events.md @@ -13,12 +13,12 @@ Yiiはイベントをサポートするために、 [[yii\base\Component]] と イベントハンドラ -------------- -イベントハンドラとは、関連するイベントがトリガされたときに実行される、 [PHP コールバック](http://www.php.net/manual/en/language.types.callable.php) +イベントハンドラとは、関連するイベントがトリガされたときに実行される、 [PHP コールバック](http://www.php.net/manual/ja/language.types.callable.php) です。次のコールバックのいずれも使用可能です: - 文字列で指定されたグローバル PHP 関数 (括弧を除く) `'trim'` など - オブジェクトとメソッド名文字列の配列で指定された、オブジェクトのメソッド (括弧を除く) `[$object, 'methodName']` など -- クラス名文字列とメソッド名文字列の配列で指定された、静的なクラスメソッド `[$class, 'methodName']` など +- クラス名文字列とメソッド名文字列の配列で指定された、静的なクラスメソッド (括弧を除く) `['ClassName', 'methodName']` など - 無名関数 `function ($event) { ... }` など イベントハンドラのシグネチャはこのようになります: diff --git a/docs/guide-ja/concept-properties.md b/docs/guide-ja/concept-properties.md index d2a3dd1..56a7d50 100644 --- a/docs/guide-ja/concept-properties.md +++ b/docs/guide-ja/concept-properties.md @@ -11,7 +11,8 @@ $object->label = trim($label); ``` 上記のコードの欠点は、 `label` プロパティを設定するすべてのコードで、`trim()` を呼び出す必要があるということです。もし将来的に、 -`label` プロパティに、最初の文字を大文字にしなければならない、といった新たな要件が発生したら、 `label` に値を代入するすべてのコードを変更しなければなりません。コー​​ドの繰り返しはバグを誘発するので、できれば避けたいところです。 +`label` プロパティに、最初の文字を大文字にしなければならない、といった新たな要件が発生したら、 `label` に値を代入するすべてのコードを変更しなければなりません。 +コードの繰り返しはバグを誘発するので、できれば避けたいところです。 この問題を解決するために、Yii は *getter* メソッドと *setter* メソッドをベースにしたプロパティ定義をサポートする、 [[yii\base\Object]] 基底クラスを提供します。 クラスがその機能を必要とするなら、 [[yii\base\Object]] またはその子クラスを継承しましょう。 @@ -61,7 +62,7 @@ setter なしの getter で定義されたプロパティは、 *読み取り専 [[yii\base\InvalidCallException|InvalidCallException]] が発生します。同様に、getter なしの setter で定義されたプロパティは、 *書き込み専用* で、そのようなプロパティを読み取りしようとしても、例外が発生します。書き込み専用のプロパティを持つのは一般的ではありませんが。 -getter と ​​setter で定義されたプロパティには、いくつかの特別なルールと制限があります: +getter と setter で定義されたプロパティには、いくつかの特別なルールと制限があります: * この種のプロパティでは、名前の *大文字と小文字を区別しません* 。たとえば、 `$object->label` と `$object->Label` は同じです。 これは、PHPのメソッド名が大文字と小文字を区別しないためです。 From 81fcab59f2514d65c34a6f2a3dda14b2dee8f0e7 Mon Sep 17 00:00:00 2001 From: Nobuo Kihara Date: Mon, 9 Feb 2015 08:10:45 +0900 Subject: [PATCH 2/4] docs/guide-ja/concept small changes [ci skip] --- docs/guide-ja/concept-autoloading.md | 2 +- docs/guide-ja/concept-behaviors.md | 2 +- docs/guide-ja/concept-components.md | 4 +++- docs/guide-ja/concept-configurations.md | 6 ++++-- docs/guide-ja/concept-service-locator.md | 2 +- 5 files changed, 10 insertions(+), 6 deletions(-) diff --git a/docs/guide-ja/concept-autoloading.md b/docs/guide-ja/concept-autoloading.md index 9f62b98..b834cad 100644 --- a/docs/guide-ja/concept-autoloading.md +++ b/docs/guide-ja/concept-autoloading.md @@ -1,7 +1,7 @@ クラスのオートローディング ================= -Yiiは、必要となるすべてのクラスファイルを、特定してインクルードするにあたり、 [クラスのオートローディングメカニズム](http://www.php.net/manual/en/language.oop5.autoload.php) +Yiiは、必要となるすべてのクラスファイルを、特定してインクルードするにあたり、 [クラスのオートローディングメカニズム](http://www.php.net/manual/ja/language.oop5.autoload.php) を頼りにします。[PSR-4 標準](https://github.com/php-fig/fig-standards/blob/master/proposed/psr-4-autoloader/psr-4-autoloader.md) に準拠した、高性能なクラスのオートローダーを提供します。 このオートローダーは、あなたが `Yii.php` ファイルをインクルードするときにインストールされます。 diff --git a/docs/guide-ja/concept-behaviors.md b/docs/guide-ja/concept-behaviors.md index f614099..e2368a3 100644 --- a/docs/guide-ja/concept-behaviors.md +++ b/docs/guide-ja/concept-behaviors.md @@ -313,7 +313,7 @@ $user->touch('login_time'); ビヘイビアは通常のクラスのように、継承をサポートしています。いっぽうトレイトは、 言語サポートされたコピー&ペーストとみなすことができます。トレイトは継承をサポートしません。 -ビヘイビアは、コンポーネントクラスの変更を必要とせずに、動的なコンポーネントへのアタッチとデタッチが可能です。トレイトを使用するには、クラスをトレイトを使って書き換える必要があります。 +ビヘイビアは、コンポーネントクラスの変更を必要とせず、コンポーネントに動的にアタッチまたはデタッチすることが可能です。トレイトを使用するには、トレイトを使ってクラスのコードを書き換える必要があります。 ビヘイビアは構成可能ですがトレイトは不可能です。 diff --git a/docs/guide-ja/concept-components.md b/docs/guide-ja/concept-components.md index 466fae5..d6d0850 100644 --- a/docs/guide-ja/concept-components.md +++ b/docs/guide-ja/concept-components.md @@ -9,7 +9,7 @@ * [ビヘイビア](concept-behaviors.md) 個々にでも、組み合わせでも、これらの機能は Yii のクラスのカスタマイズ性と使いやすさをとても高めてくれます。たとえば、[[yii\jui\DatePicker|日付選択]] を行うユーザインターフェース·コンポーネントは、 -対話型の日付選択UIを生成するとき、ビューで次のように使用することができます: +対話型の日付選択UIを生成するとき、[ビュー](structure-view.md) で次のように使用することができます: ```php use yii\jui\DatePicker; @@ -39,6 +39,8 @@ echo DatePicker::widget([ 例: ```php +get('cache'); $cache = $locator->cache; ``` -以上のように、 [[yii\di\ServiceLocator]] はコンポーネント ID を使用したプロパティのように、コンポーネントにアクセスすることができます。 +上記のように、 [[yii\di\ServiceLocator]] を使うと、コンポーネント ID を使用して、プロパティのようにコンポーネントにアクセスすることができます。 あなたが最初にコンポーネントにアクセスしたとき、 [[yii\di\ServiceLocator]] はコンポーネントの登録情報を使用してコンポーネントの新しいインスタンスを作成し、 それを返します。後でそのコンポーネントが再度アクセスされた場合、サービスロケータは同じインスタンスを返します。 From 06fdfa977e18d41b9f3e4ecc0ad8c0b54ee37d79 Mon Sep 17 00:00:00 2001 From: Nobuo Kihara Date: Mon, 9 Feb 2015 08:11:09 +0900 Subject: [PATCH 3/4] docs/guide-ja/concept-di-container.md - revised [ci skip] --- docs/guide-ja/concept-di-container.md | 89 ++++++++++++++++++----------------- 1 file changed, 47 insertions(+), 42 deletions(-) diff --git a/docs/guide-ja/concept-di-container.md b/docs/guide-ja/concept-di-container.md index bec68c4..86a3967 100644 --- a/docs/guide-ja/concept-di-container.md +++ b/docs/guide-ja/concept-di-container.md @@ -1,15 +1,15 @@ -依存性注入コンテナ -============================== +依存注入コンテナ +================ -依存性注入 (DI) コンテナは、オブジェクトとそのすべての依存オブジェクトを、インスタンス化し、設定する方法を知っているオブジェクトです。 +依存注入 (DI) コンテナは、オブジェクトとそれが依存するすべてのブジェクトを、インスタンス化し、設定する方法を知っているオブジェクトです。 なぜ DI コンテナが便利なのかは、[Martin の記事](http://martinfowler.com/articles/injection.html) の説明がわかりやすいでしょう。 ここでは、主に Yii の提供する DI コンテナの使用方法を説明します。 -依存性注入 --------------------- +依存注入 +-------- -Yii は [[yii\di\Container]] クラスを通して DI コンテナの機能を提供します。これは、次の種類の依存性注入をサポートしています: +Yii は [[yii\di\Container]] クラスを通して DI コンテナの機能を提供します。これは、次の種類の依存注入をサポートしています: * コンストラクタ·インジェクション * セッター/プロパティ·インジェクション @@ -19,8 +19,8 @@ Yii は [[yii\di\Container]] クラスを通して DI コンテナの機能を ### コンストラクタ·インジェクション DI コンテナは、コンストラクタパラメータの型ヒントの助けを借りた、コンストラクタ·インジェクションをサポートしています。 -型ヒントは、クラスやインタフェースが新しいオブジェクトの作成で使用されるさい、どれが依存であるのかということをコンテナに教えます。 -コンテナは、依存クラスやインタフェースのインスタンスを取得し、コンストラクタを通して、新しいオブジェクトにそれらの注入を試みます。 +型ヒントは、コンテナが新しいオブジェクトの作成に使用されるさい、オブジェクトがどういうクラスやインタフェースに依存しているかをコンテナに教えます。 +コンテナは、依存クラスやインタフェースのインスタンスを取得することを試み、コンストラクタを通して、新しいオブジェクトにそれらの注入します。 たとえば ```php @@ -41,8 +41,8 @@ $foo = new Foo($bar); ### セッター/プロパティ·インジェクション セッター/プロパティ·インジェクションは、[構成情報](concept-configurations.md) を通してサポートされます。 -依存関係を登録するときや、新しいオブジェクトを作成するとき、コンテナが使用する構成情報を提供することができ、 -それに対応するセッターまたはプロパティを通じて依存関係が注入されます。たとえば +依存がそれに対応するセッターまたはプロパティを通して注入される場合、依存関係を登録するときや、新しいオブジェクトを作成するときに、依存注入のためにコンテナが使用する構成情報を提供することが出来ます。 +たとえば ```php use yii\base\Object; @@ -73,8 +73,9 @@ $container->get('Foo', [], [ ### PHP コーラブル・インジェクション -この場合、コンテナは、登録された PHP のコーラブルオブジェクトを使用し、クラスの新しいインスタンスを構築します。 -コーラブルは、依存関係を解決し、新しく作成されたオブジェクトに適切にそれらを注入する責任があります。たとえば +この場合、コンテナは、登録された PHP のコーラブルを使用して、クラスの新しいインスタンスを構築します。 +コーラブルは、依存関係を解決し、新しく作成されたオブジェクトに適切に依存を注入する責務を負います。 +たとえば ```php $container->set('Foo', function () { @@ -86,26 +87,30 @@ $foo = $container->get('Foo'); 依存関係の登録 ------------------------- +-------------- -あなたは、[[yii\di\Container::set()]] 使って依存関係を登録することができます。登録には依存関係の名前だけでなく、 -依存関係の定義が必要です。依存関係の名前は、クラス名、インタフェース名、エイリアス名を指定することができます。 -依存関係の定義には、クラス名、構成情報配列、PHPのコーラブルを指定できます。 +あなたは、[[yii\di\Container::set()]] を使って依存関係を登録することができます。 +登録には依存の名前だけでなく、依存の定義が必要です。 +依存の名前は、クラス名、インタフェース名、エイリアス名を指定することができます。 +依存の定義には、クラス名、構成情報配列、PHPのコーラブルを指定できます。 ```php $container = new \yii\di\Container; -// クラス名そのまま。これはなくてもかまいません。 +// クラス名そのままの登録。これは省略可能です。 $container->set('yii\db\Connection'); // インターフェースの登録 -// クラスがインターフェースに依存する場合、対応するクラスが依存オブジェクトとしてインスタンス化されます +// クラスがインターフェースに依存する場合、対応するクラスが +// 依存オブジェクトとしてインスタンス化されます $container->set('yii\mail\MailInterface', 'yii\swiftmailer\Mailer'); -// エイリアス名の登録。$container->get('foo') を使って Connection のインスタンスを作成できます +// エイリアス名の登録。$container->get('foo') を使って +// Connection のインスタンスを作成できます $container->set('foo', 'yii\db\Connection'); -// 構成情報をともなうクラスの登録。クラスが get() でインスタンス化されるとき構成情報が適用されます +// 構成情報をともなうクラスの登録。クラスが get() でインスタンス化 +// されるとき構成情報が適用されます $container->set('yii\db\Connection', [ 'dsn' => 'mysql:host=127.0.0.1;dbname=demo', 'username' => 'root', @@ -134,10 +139,10 @@ $container->set('db', function ($container, $params, $config) { $container->set('pageCache', new FileCache); ``` -> 補足: 依存関係名が、対応する依存関係の定義と同じである場合は、それを DI コンテナに登録する必要はありません。 +> 補足: 依存の名前が対応する依存の定義と同じである場合は、それを DI コンテナに登録する必要はありません。 -`set()` を介して登録された依存性は、依存性が必要とされるたびにインスタンスを生成します。 -[[yii\di\Container::setSingleton()]] を使うと、単一のインスタンスをひとつだけ生成する依存関係を登録することができます: +`set()` を介して登録された依存は、依存が必要とされるたびにインスタンスを生成します。 +[[yii\di\Container::setSingleton()]] を使うと、単一のインスタンスしか生成しない依存を登録することができます: ```php $container->setSingleton('yii\db\Connection', [ @@ -150,16 +155,16 @@ $container->setSingleton('yii\db\Connection', [ 依存関係の解決 ----------------------- +-------------- -依存関係を登録すると、新しいオブジェクトを作成するのに DI コンテナを使用することができ、 -コンテナが自動的に、依存性をインスタンス化して新しく作成されたオブジェクトに注入することで、 -依存関係を解決します。依存関係の解決は再帰的、つまり、ある依存性が他の依存関係を持っている場合、 +依存関係を登録すると、新しいオブジェクトを作成するのに DI コンテナを使用することができます。 +そして、コンテナが自動的に依存をインスタンス化し、新しく作成されたオブジェクトに注入して、 +依存関係を解決します。依存関係の解決は再帰的に行われます。つまり、ある依存が他の依存関係を持っている場合、 それらの依存関係も自動的に解決されます。 [[yii\di\Container::get()]] を使って、新しいオブジェクトを作成することができます。 -このメソッドは、クラス名、インタフェース名、エイリアス名で指定できる依存関係の名前を受け取ります。 -依存関係名は、 `set()` や `setSingleton()` を介して登録されていたりされていなかったりする +このメソッドは、クラス名、インタフェース名、エイリアス名で指定できる依存の名前を受け取ります。 +依存の名前は、 `set()` や `setSingleton()` を介して登録されていたりされていなかったりする 可能性があります。オプションで、クラスのコンストラクタのパラメータのリストや、新しく作成された オブジェクトを設定するための [設定情報](concept-configurations.md) を渡すことができます。 たとえば @@ -173,12 +178,12 @@ $engine = $container->get('app\components\SearchEngine', [$apiKey], ['type' => 1 ``` 見えないところで、DIコンテナは、単に新しいオブジェクトを作成するよりもはるかに多くの作業を行います。 -コンテナは、最初の依存クラスまたはインタフェースの名前を見つけるために、クラスのコンストラクタを検査し、 -自動的にそれらの依存関係を再帰で解決します。 +コンテナは、最初にクラスのコンストラクタを調査し、依存クラスまたはインタフェースの名前を見つけると、 +自動的にそれらの依存関係を再帰的に解決します。 次のコードでより洗練された例を示します。 `UserLister` クラスは `UserFinderInterface` インタフェースを実装するオブジェクトに依存します。 `UserFinder` クラスはこのインターフェイスを実装していて、かつ、 -`Connection` オブジェクトに依存します。これらのすべての依存関係は、クラスのコンストラクタのパラメータのタイプヒンティングで宣言されています。 +`Connection` オブジェクトに依存します。これらのすべての依存関係は、クラスのコンストラクタのパラメータの型ヒントによって宣言されています。 プロパティ依存性の登録をすれば、DI コンテナは自動的にこれらの依存関係を解決し、単純に `get('userLister')` を呼び出すだけで新しい `UserLister` インスタンスを作成できます。 @@ -240,13 +245,13 @@ $lister = new UserLister($finder); 実際の使いかた ---------------- +-------------- あなたのアプリケーションの [エントリスクリプト](structure-entry-scripts.md) で `Yii.php` ファイルをインクルードするとき、 Yii は DI コンテナを作成します。この DI コンテナは [[Yii::$container]] を介してアクセス可能です。 [[Yii::createObject()]] を呼び出したとき、 このメソッドは実際には、新しいオブジェクトを作成ために、コンテナの [[yii\di\Container::get()|get()]] メソッドを呼び出しています。 前述のとおり、DI コンテナは(もしあれば)自動的に依存関係を解決し、新しく作成されたオブジェクトにそれらを注入します。 -Yii は、新しいオブジェクトを作成するさいそのコアコードのほとんどで [[Yii::createObject()]] を使用しているため、これは、 +Yii は、新しいオブジェクトを作成するさい、そのコアコードのほとんどで [[Yii::createObject()]] を使用しているため、これは、 [[Yii::$container]] を扱えばグローバルにオブジェクトをカスタマイズすることができることを意味しています。 たとえば、 [[yii\widgets\LinkPager]] のページネーションボタンのデフォルト個数をグローバルにカスタマイズすることができます: @@ -262,7 +267,7 @@ Yii は、新しいオブジェクトを作成するさいそのコアコード echo \yii\widgets\LinkPager::widget(); ``` -DIコンテナを経由して設定された値は、こうやって、まだまだ上書きすることができます: +ただし、DI コンテナを経由して設定された値を上書きすることは、まだ可能です: ```php echo \yii\widgets\LinkPager::widget(['maxButtonCount' => 20]); @@ -301,8 +306,8 @@ class HotelController extends Controller のインスタンスが作成され、コントローラのコンストラクタに3番目のパラメータとして注入されるようになります。 -依存関係を登録するときに ------------------------------ +いつ依存関係を登録するか +------------------------ 依存関係は、新しいオブジェクトが作成されるとき必要とされるので、それらの登録は可能な限り早期に行われるべきです。 推奨プラクティス以下のとおりです: @@ -314,13 +319,13 @@ class HotelController extends Controller まとめ -------- +------ -依存性注入と [サービスロケータ](concept-service-locator.md) はともに、疎結合でよりテストしやすい方法でのソフトウェア構築を可能にする、 -定番のデザインパターンです。依存性注入とサービスロケータへのより深い理解を得るために、 [Martin の記事](http://martinfowler.com/articles/injection.html) +依存注入と [サービスロケータ](concept-service-locator.md) はともに、疎結合でよりテストしやすい方法でのソフトウェア構築を可能にする、 +定番のデザインパターンです。依存注入とサービスロケータへのより深い理解を得るために、 [Martin の記事](http://martinfowler.com/articles/injection.html) を読むことを強くお勧めします。 -Yiiはその [サービスロケータ](concept-service-locator.md) を、依存性注入(DI)コンテナの上に実装しています。 -サービスロケータは、新しいオブジェクトのインスタンスを作成しようとしたとき、DI コンテナに呼び出しを転送します。 +Yii はその [サービスロケータ](concept-service-locator.md) を、依存注入 (DI) コンテナの上に実装しています。 +サービスロケータは、新しいオブジェクトのインスタンスを作成しようとするとき、DI コンテナに呼び出しを転送します。 後者は、依存関係を、上で説明したように自動的に解決します。 From 965f748bda88ad06ab1dd88fae2512670565db17 Mon Sep 17 00:00:00 2001 From: Nobuo Kihara Date: Wed, 4 Feb 2015 18:59:31 +0900 Subject: [PATCH 4/4] docs/guide-ja/concept-components.md - typo fixed [ci skip] --- docs/guide-ja/concept-components.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guide-ja/concept-components.md b/docs/guide-ja/concept-components.md index d6d0850..cb21f15 100644 --- a/docs/guide-ja/concept-components.md +++ b/docs/guide-ja/concept-components.md @@ -87,6 +87,6 @@ $component = \Yii::createObject([ 3. [[yii\base\Object::init()|init()]] 内の事後初期化。サニティ・チェックやプロパティの正規化を行いたいときは、このメソッドをオーバーライドします。 4. オブジェクトのメソッド呼び出し。 -最初の 3 つのステップは、すべてのオブジェクトのコンストラクタ内で発生します。これは、あなたがクラスインスタンス (つまり、オブジェクト) を得たときには、 +最初の 3 つのステップは、すべて、オブジェクトのコンストラクタ内で発生します。これは、あなたがクラスインスタンス (つまり、オブジェクト) を得たときには、 すでにそのオブジェクトが適切な、信頼性の高い状態に初期化されていることを意味します。