Browse Source

Merge pull request #16155 from yiijan/guide-rev-0424

guide-ja/concept revised [ci skip]
tags/2.0.16
Dmitry Naumenko 7 years ago committed by GitHub
parent
commit
3047b8d461
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 24
      docs/guide-ja/concept-aliases.md
  2. 31
      docs/guide-ja/concept-autoloading.md
  3. 48
      docs/guide-ja/concept-behaviors.md
  4. 25
      docs/guide-ja/concept-components.md
  5. 44
      docs/guide-ja/concept-configurations.md
  6. 87
      docs/guide-ja/concept-di-container.md
  7. 39
      docs/guide-ja/concept-events.md
  8. 41
      docs/guide-ja/concept-properties.md
  9. 21
      docs/guide-ja/concept-service-locator.md

24
docs/guide-ja/concept-aliases.md

@ -8,7 +8,6 @@
Yii はすでに利用可能な多くの事前定義エイリアスを持っています。 Yii はすでに利用可能な多くの事前定義エイリアスを持っています。
たとえば、 `@yii` というエイリアスは Yii フレームワークのインストール・パスを表し、`@web` は現在実行中のウェブ・アプリケーションのベース URL を表します。 たとえば、 `@yii` というエイリアスは Yii フレームワークのインストール・パスを表し、`@web` は現在実行中のウェブ・アプリケーションのベース URL を表します。
エイリアスを定義する <span id="defining-aliases"></span> エイリアスを定義する <span id="defining-aliases"></span>
-------------------- --------------------
@ -40,7 +39,7 @@ Yii::setAlias('@foobar', '@foo/bar');
ルート・エイリアスは通常、 [ブートストラップ](runtime-bootstrapping.md) 段階で定義されます。 ルート・エイリアスは通常、 [ブートストラップ](runtime-bootstrapping.md) 段階で定義されます。
たとえば、[エントリ・スクリプト](structure-entry-scripts.md) で [[Yii::setAlias()]] を呼び出すことができます。 たとえば、[エントリ・スクリプト](structure-entry-scripts.md) で [[Yii::setAlias()]] を呼び出すことができます。
便宜上、 [アプリケーション](structure-applications.md) は、`aliases` という名前の書き込み可能なプロパティを提供しており、 便利なように、 [アプリケーション](structure-applications.md) は、`aliases` という名前の書き込み可能なプロパティを提供しており、
それをアプリケーションの [構成情報](concept-configurations.md) で設定することが可能です。 それをアプリケーションの [構成情報](concept-configurations.md) で設定することが可能です。
```php ```php
@ -66,12 +65,15 @@ echo Yii::getAlias('@bar'); // http://www.example.com を表示
echo Yii::getAlias('@foo/bar/file.php'); // /path/to/foo/bar/file.php を表示 echo Yii::getAlias('@foo/bar/file.php'); // /path/to/foo/bar/file.php を表示
``` ```
派生エイリアスによって表されるパスや URL は、派生エイリアス内のルート・エイリアス部分を対応するパスや URL で置換して決定されます。 派生エイリアスによって表されるパスや URL は、
派生エイリアス内のルート・エイリアス部分を対応するパスや URL で置換して決定されます。
> Note: [[Yii::getAlias()]] メソッドは、 結果のパスや URL が実在するファイルやリソースを参照しているかをチェックしません。 > Note: [[Yii::getAlias()]] メソッドは、 結果のパスや URL が実在するファイルやリソースを参照しているかをチェックしません。
ルート・エイリアス名にはスラッシュ `/` 文字を含むことができます。 [[Yii::getAlias()]] メソッドは、 ルート・エイリアス名にはスラッシュ `/` 文字を含むことができます。 [[Yii::getAlias()]] メソッドは、
エイリアスのどの部分がルート・エイリアスであるかを賢く判別し、正確に対応するファイル・パスや URL を決定します: エイリアスのどの部分がルート・エイリアスであるかを賢く判別し、
正確に対応するファイル・パスや URL を決定します:
```php ```php
Yii::setAlias('@foo', '/path/to/foo'); Yii::setAlias('@foo', '/path/to/foo');
@ -86,7 +88,8 @@ Yii::getAlias('@foo/bar/file.php'); // /path2/bar/file.php を表示
エイリアスを使用する <span id="using-aliases"></span> エイリアスを使用する <span id="using-aliases"></span>
-------------------- --------------------
Yii では、多くの場所で、パスや URL に変換する [[Yii::getAlias()]] を呼び出す必要なく、エイリアスが認識されます。 Yii では、多くの場所で、パスや URL に変換する [[Yii::getAlias()]] を呼び出す必要なく、
エイリアスが認識されます。
たとえば、 [[yii\caching\FileCache::cachePath]] は、ファイル・パスとファイル・パスを表すエイリアスの両方を受け入れることが出来ます。 たとえば、 [[yii\caching\FileCache::cachePath]] は、ファイル・パスとファイル・パスを表すエイリアスの両方を受け入れることが出来ます。
これは、接頭辞 `@` によって、ファイル・パスとエイリアスを区別することが出来るためです。 これは、接頭辞 `@` によって、ファイル・パスとエイリアスを区別することが出来るためです。
@ -109,14 +112,17 @@ Yii では、一般的に使用されるファイルのパスと URL を簡単
- `@yii`, `BaseYii.php` ファイルがあるディレクトリ (フレームワーク・ディレクトリとも呼ばれます) - `@yii`, `BaseYii.php` ファイルがあるディレクトリ (フレームワーク・ディレクトリとも呼ばれます)
- `@app`, 現在実行中のアプリケーションの [[yii\base\Application::basePath|ベース・パス]] - `@app`, 現在実行中のアプリケーションの [[yii\base\Application::basePath|ベース・パス]]
- `@runtime`, 現在実行中のアプリケーションの [[yii\base\Application::runtimePath|ランタイム・パス]] 。デフォルトは `@app/runtime` - `@runtime`, 現在実行中のアプリケーションの [[yii\base\Application::runtimePath|ランタイム・パス]] 。デフォルトは `@app/runtime`
- `@webroot`, 現在実行中のウェブ・アプリケーションのウェブ・ルート・ディレクトリ。エントリス・クリプトを含むディレクトリによって決定されます。 - `@webroot`, 現在実行中のウェブ・アプリケーションのウェブ・ルート・ディレクトリ。
エントリス・クリプトを含むディレクトリによって決定されます。
- `@web`, 現在実行中のウェブ・アプリケーションのベース URL。これは、 [[yii\web\Request::baseUrl]] と同じ値を持ちます。 - `@web`, 現在実行中のウェブ・アプリケーションのベース URL。これは、 [[yii\web\Request::baseUrl]] と同じ値を持ちます。
- `@vendor`, [[yii\base\Application::vendorPath|Composer のベンダー・ディレクトリ]] 。デフォルトは `@app/vendor` - `@vendor`, [[yii\base\Application::vendorPath|Composer のベンダー・ディレクトリ]] 。デフォルトは `@app/vendor`
- `@bower`, [bower パッケージ](http://bower.io/) が含まれるルート・ディレクトリ。デフォルトは `@vendor/bower` - `@bower`, [bower パッケージ](http://bower.io/) が含まれるルート・ディレクトリ。デフォルトは `@vendor/bower`
- `@npm`, [npm パッケージ](https://www.npmjs.org/) が含まれるルート・ディレクトリ。デフォルトは `@vendor/npm` - `@npm`, [npm パッケージ](https://www.npmjs.org/) が含まれるルート・ディレクトリ。デフォルトは `@vendor/npm`
`@yii` エイリアスは [エントリ・スクリプト](structure-entry-scripts.md) に `Yii.php` ファイルを読み込んだ時点で定義されます。 `@yii` エイリアスは [エントリ・スクリプト](structure-entry-scripts.md) に `Yii.php` ファイルを読み込んだ時点で定義されます。
エイリアスの残りの部分は、アプリケーションのコンストラクタ内で、アプリケーションの [構成情報](concept-configurations.md) を適用するときに定義されます。 エイリアスの残りの部分は、アプリケーションのコンストラクタ内で、アプリケーションの [構成情報](concept-configurations.md)
を適用するときに定義されます。
エクステンションのエイリアス <span id="extension-aliases"></span> エクステンションのエイリアス <span id="extension-aliases"></span>
---------------------------- ----------------------------
@ -124,10 +130,8 @@ Yii では、一般的に使用されるファイルのパスと URL を簡単
Composer でインストールされる [エクステンション](structure-extensions.md) のそれぞれに対してエイリアスが自動的に定義されます。 Composer でインストールされる [エクステンション](structure-extensions.md) のそれぞれに対してエイリアスが自動的に定義されます。
各エイリアスは、その `composer.json` ファイルで宣言されたエクステンションのルート名前空間にちなんで名付けられ、 各エイリアスは、その `composer.json` ファイルで宣言されたエクステンションのルート名前空間にちなんで名付けられ、
パッケージのルート・ディレクトリを表します。たとえば、あなたが `yiisoft/yii2-jui` エクステンションをインストールしたとすると、 パッケージのルート・ディレクトリを表します。たとえば、あなたが `yiisoft/yii2-jui` エクステンションをインストールしたとすると、
自動的に `@yii/jui` というエイリアスが [ブートストラップ](runtime-bootstrapping.md) 段階で定義されます。 自動的に `@yii/jui` というエイリアスが [ブートストラップ](runtime-bootstrapping.md) 段階で定義されます。これは次のものと等価です。
これは次のものと等価です。
```php ```php
Yii::setAlias('@yii/jui', 'VendorPath/yiisoft/yii2-jui'); Yii::setAlias('@yii/jui', 'VendorPath/yiisoft/yii2-jui');
``` ```

31
docs/guide-ja/concept-autoloading.md

@ -1,18 +1,19 @@
クラスのオートローディング クラスのオートローディング
========================== ==========================
Yiiは、必要となるすべてのクラス・ファイルを特定してインクルードするにあたり、 [クラスのオートローディング・メカニズム](http://www.php.net/manual/ja/language.oop5.autoload.php) Yiiは、必要となるすべてのクラス・ファイルを特定してインクルードするにあたり、
を頼りにします。Yii は、[PSR-4 標準](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-4-autoloader.md) に準拠した、高性能なクラスのオートローダを提供しています。 [クラスのオートローディング・メカニズム](http://www.php.net/manual/ja/language.oop5.autoload.php) を頼りにします。
Yii は、[PSR-4 標準](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-4-autoloader.md) に準拠した、高性能なクラスのオートローダを提供しています。
このオートローダは、あなたが `Yii.php` ファイルをインクルードするときにインストールされます。 このオートローダは、あなたが `Yii.php` ファイルをインクルードするときにインストールされます。
> Note: 説明を簡単にするため、このセクションではクラスのオートローディングについてのみ話します。しかし、 > Note: 説明を簡単にするため、このセクションではクラスのオートローディングについてのみ話します。しかし、
ここに記述されている内容は、インタフェイスとトレイトのオートローにも同様に適用されることに注意してください。 ここに記述されている内容は、インタフェイスとトレイトのオートローディングにも同様に適用されることに注意してください。
Yii オートローダを使用する <span id="using-yii-autoloader"></span> Yii オートローダを使用する <span id="using-yii-autoloader"></span>
-------------------------- --------------------------
Yii のクラス・オートローダを使用するには、クラスを作成して名前を付けるとき、次の2つの単純なルールに従わなければなりません: Yii のクラス・オートローダを使用するには、クラスを作成して名前を付けるとき、次のつの単純なルールに従わなければなりません:
* 各クラスは [名前空間](http://php.net/manual/ja/language.namespaces.php) の下になければなりません (例 `foo\bar\MyClass`) * 各クラスは [名前空間](http://php.net/manual/ja/language.namespaces.php) の下になければなりません (例 `foo\bar\MyClass`)
* 各クラスは次のアルゴリズムで決定される個別のファイルに保存されなければなりません: * 各クラスは次のアルゴリズムで決定される個別のファイルに保存されなければなりません:
@ -21,6 +22,7 @@ Yii のクラス・オートローダを使用するには、クラスを作成
// $className は先頭にバック・スラッシュを持たない完全修飾クラス名 // $className は先頭にバック・スラッシュを持たない完全修飾クラス名
$classFile = Yii::getAlias('@' . str_replace('\\', '/', $className) . '.php'); $classFile = Yii::getAlias('@' . str_replace('\\', '/', $className) . '.php');
``` ```
たとえば、クラス名と名前空間が `foo\bar\MyClass` であれば、対応するクラス・ファイルのパスの [エイリアス](concept-aliases.md) は、 たとえば、クラス名と名前空間が `foo\bar\MyClass` であれば、対応するクラス・ファイルのパスの [エイリアス](concept-aliases.md) は、
`@foo/bar/MyClass.php` になります。このエイリアスがファイル・パスとして解決できるようにするためには、`@foo` または `@foo/bar` `@foo/bar/MyClass.php` になります。このエイリアスがファイル・パスとして解決できるようにするためには、`@foo` または `@foo/bar`
のどちらかが、 [ルート・エイリアス](concept-aliases.md#defining-aliases) でなければなりません。 のどちらかが、 [ルート・エイリアス](concept-aliases.md#defining-aliases) でなければなりません。
@ -35,14 +37,16 @@ $classFile = Yii::getAlias('@' . str_replace('\\', '/', $className) . '.php');
フロントエンド・クラスを置き、バックエンド・クラスを `backend` の下に置けます。これで、これらのクラスは Yii のオートローダによって フロントエンド・クラスを置き、バックエンド・クラスを `backend` の下に置けます。これで、これらのクラスは Yii のオートローダによって
オートロードできるようになります。 オートロードできるようになります。
独自の名前空間をオートローダに追加するためには、[[Yii::setAlias()]] を使って、その名前空間のベース・ディレクトリに対するエイリアスを定義する必要があります。
例えば、`path/to/foo` ディレクトリに配置されている `foo` 名前空間に属するクラスをロードするためには、`Yii::setAlias('@foo', 'path/to/foo') を呼び出します。
クラス・マップ <span id="class-map"></span> クラス・マップ <span id="class-map"></span>
-------------- --------------
Yii のクラス・オートローダは、 *クラス・マップ* 機能をサポートしており、クラス名を対応するクラス・ファイルのパスにマップできます。 Yii のクラス・オートローダは、 *クラス・マップ* 機能をサポートしており、クラス名を対応するクラス・ファイルのパスにマップできます。
オートローダがクラスをロードしているとき、クラスがマップに見つかるかどうかを最初にチェックします。もしあれば、対応する オートローダがクラスをロードするときは、クラスがマップに見つかるかどうかを最初にチェックします。もしあれば、対応する
ファイルパスは、それ以上チェックされることなく、直接インクルードされます。これでクラスのオートローディングを非常に高速化できます。 ファイルパスは、それ以上チェックされることなく、直接インクルードされます。これでクラスのオートローディングを非常に高速化できます。
実際、すべての Yii のコア・クラスは、この方法でオートロードされています。 実際のところ、すべての Yii のコア・クラスは、この方法でオートロードされています。
次の方法で、 `Yii::$classMap` に格納されるクラス・マップにクラスを追加できます: 次の方法で、 `Yii::$classMap` に格納されるクラス・マップにクラスを追加できます:
@ -51,18 +55,20 @@ Yii::$classMap['foo\bar\MyClass'] = 'path/to/MyClass.php';
``` ```
クラス・ファイルのパスを指定するのに、 [エイリアス](concept-aliases.md) を使うことができます。クラスが使用される前にマップが準備できるように、 クラス・ファイルのパスを指定するのに、 [エイリアス](concept-aliases.md) を使うことができます。クラスが使用される前にマップが準備できるように、
[ブートストラップ](runtime-bootstrapping.md) プロセス内でクラス・マップを設定する必要があります。 クラス・マップの設定は [ブートストラップ](runtime-bootstrapping.md) プロセス内でする必要があります。
他のオートローダの使用 <span id="using-other-autoloaders"></span> 他のオートローダの使用 <span id="using-other-autoloaders"></span>
----------------------- -----------------------
Yii はパッケージ依存関係マネージャとして Composer を包含しているので、Composer のオートローダもインストールすることをお勧めします。 Yii はパッケージ依存関係マネージャとして Composer を包含しているので、Composer のオートローダもインストールすることをお勧めします。
あなたが独自のオートローダを持つサードパーティ・ライブラリを使用している場合、それらもインストールする必要があります。 あなたが独自のオートローダを持つサードパーティ・ライブラリを使用している場合は、
それらもインストールする必要があります。
Yii オートローダを他のオートローダと一緒に使うときは、他のすべてのオートローダがインストールされた *後で*`Yii.php` Yii オートローダを他のオートローダと一緒に使うときは、他のすべてのオートローダがインストールされた *後で*`Yii.php`
ファイルをインクルードする必要があります。これで Yii のオートローダが、任意クラスのオートローディング要求に応答する最初のものになります。 ファイルをインクルードする必要があります。これで Yii のオートローダが、任意クラスのオートローディング要求に応答する最初のものになります。
たとえば、次のコードは [ベーシック・プロジェクト・テンプレート](start-installation.md) の [エントリ・エントリ・スクリプト](structure-entry-scripts.md) から抜粋したものです。 たとえば、次のコードは [ベーシック・プロジェクト・テンプレート](start-installation.md) の
[エントリ・スクリプト](structure-entry-scripts.md) から抜き出したものです。
最初の行は、Composer のオートローダをインストールしており、二行目は Yii のオートローダをインストールしています。 最初の行は、Composer のオートローダをインストールしており、二行目は Yii のオートローダをインストールしています。
```php ```php
@ -71,9 +77,10 @@ require __DIR__ . '/../vendor/yiisoft/yii2/Yii.php';
``` ```
あなたは Yii のオートローダを使わず、Composer のオートローダだけを単独で使用することもできます。しかし、そうすることによって、 あなたは Yii のオートローダを使わず、Composer のオートローダだけを単独で使用することもできます。しかし、そうすることによって、
あなたのクラスのオートローディングのパフォーマンスは低下し、クラスをオートロード可能にするために Composer が設定したルールに従わなければならなくなります。 あなたのクラスのオートローディングのパフォーマンスは低下し、クラスをオートロード可能にするために
Composer が設定したルールに従わなければならなくなります。
> Info: Yiiのオートローダを使用したくない場合は、 `Yii.php` ファイルのあなた独自のバージョンを作成し、 > Info: Yiiのオートローダを使用したくない場合は、`Yii.php` ファイルのあなた独自のバージョンを作成し、
それを [エントリ・スクリプト](structure-entry-scripts.md) でインクルードする必要があります。 それを [エントリ・スクリプト](structure-entry-scripts.md) でインクルードする必要があります。

48
docs/guide-ja/concept-behaviors.md

@ -6,8 +6,7 @@
機能を、クラスの継承を変更せずに拡張することができます。コンポーネントにビヘイビアをアタッチすると、その 機能を、クラスの継承を変更せずに拡張することができます。コンポーネントにビヘイビアをアタッチすると、その
コンポーネントにはビヘイビアのメソッドとプロパティが "注入" され、それらのメソッドとプロパティは、 コンポーネントにはビヘイビアのメソッドとプロパティが "注入" され、それらのメソッドとプロパティは、
コンポーネント・クラス自体に定義されているかのようにアクセスできるようになります。また、ビヘイビアは、 コンポーネント・クラス自体に定義されているかのようにアクセスできるようになります。また、ビヘイビアは、
コンポーネントによってトリガされた [イベント](concept-events.md) に応答することができるので、 コンポーネントによってトリガされた [イベント](concept-events.md) に応答することができるので、ビヘイビアでコンポーネントの通常のコード実行をカスタマイズすることができます。
ビヘイビアでコンポーネントの通常のコード実行をカスタマイズすることができます。
ビヘイビアを定義する <span id="defining-behaviors"></span> ビヘイビアを定義する <span id="defining-behaviors"></span>
@ -51,14 +50,14 @@ class MyBehavior extends Behavior
> Tip: ビヘイビア内から、[[yii\base\Behavior::owner]] プロパティを介して、ビヘイビアをアタッチしたコンポーネントにアクセスすることができます。 > Tip: ビヘイビア内から、[[yii\base\Behavior::owner]] プロパティを介して、ビヘイビアをアタッチしたコンポーネントにアクセスすることができます。
> Note: ビヘイビアの [[yii\base\Behavior::__get()]] および/または [[yii\base\Behavior::__set()]] メソッドをオーバーライドする場合は、同時に [[yii\base\Behavior::canGetProperty()]] および/または [[yii\base\Behavior::canSetProperty()]] もオーバーライドする必要があります。 > Note: ビヘイビアの [[yii\base\Behavior::__get()]] および/または [[yii\base\Behavior::__set()]] メソッドをオーバーライドする場合は、
同時に [[yii\base\Behavior::canGetProperty()]] および/または [[yii\base\Behavior::canSetProperty()]] もオーバーライドする必要があります。
コンポーネントのイベントを処理する コンポーネントのイベントを処理する
---------------------------------- ----------------------------------
ビヘイビアが、アタッチされたコンポーネントがトリガするイベントに応答する必要がある場合は、 ビヘイビアが、アタッチされたコンポーネントがトリガするイベントに応答する必要がある場合は、
[[yii\base\Behavior::events()]] メソッドをオーバーライドしましょう。たとえば: [[yii\base\Behavior::events()]] メソッドをオーバーライドしなければなりません。たとえば:
```php ```php
namespace app\components; namespace app\components;
@ -148,7 +147,7 @@ class User extends ActiveRecord
`myBehavior2``myBehavior4` があります。ビヘイビアが名前と関連付けられていない場合は、 *無名ビヘイビア* と呼ばれます。 `myBehavior2``myBehavior4` があります。ビヘイビアが名前と関連付けられていない場合は、 *無名ビヘイビア* と呼ばれます。
ビヘイビアを動的にアタッチするには、ビヘイビアをアタッチしようとしているコンポーネントの [[yii\base\Component::attachBehavior()]] メソッドを呼びます: ビヘイビアを動的にアタッチするには、ビヘイビアがアタッチされるコンポーネントの [[yii\base\Component::attachBehavior()]] メソッドを呼びます:
```php ```php
use app\components\MyBehavior; use app\components\MyBehavior;
@ -166,6 +165,7 @@ $component->attachBehavior('myBehavior3', [
'prop2' => 'value2', 'prop2' => 'value2',
]); ]);
``` ```
[[yii\base\Component::attachBehaviors()]] メソッドを使うと、いちどに複数のビヘイビアをアタッチできます: [[yii\base\Component::attachBehaviors()]] メソッドを使うと、いちどに複数のビヘイビアをアタッチできます:
```php ```php
@ -189,14 +189,16 @@ $component->attachBehaviors([
] ]
``` ```
詳しくは [構成情報](concept-configurations.md#configuration-format) セクションを参照してください。 詳しくは [構成情報](concept-configurations.md#configuration-format)
のセクションを参照してください。
ビヘイビアを使用する <span id="using-behaviors"></span> ビヘイビアを使用する <span id="using-behaviors"></span>
-------------------- --------------------
ビヘイビアを使用するには、まず上記の方法に従って [[yii\base\Component|コンポーネント]] にアタッチします。ビヘイビアがコンポーネントにアタッチされれば、その使用方法はシンプルです。 ビヘイビアを使用するには、まず上記の方法に従って [[yii\base\Component|コンポーネント]] にアタッチします。ビヘイビアがコンポーネントにアタッチされれば、その使用方法はシンプルです。
あなたは、アタッチされているコンポーネントを介して、ビヘイビアの *パブリック* メンバ変数、または getter や setter によって定義されたプロパティにアクセスすることができます: あなたは、アタッチされているコンポーネントを介して、ビヘイビアの *パブリック* メンバ変数、
または getter や setter によって定義されたプロパティにアクセスすることができます:
```php ```php
// "prop1" はビヘイビア・クラス内で定義されたプロパティ // "prop1" はビヘイビア・クラス内で定義されたプロパティ
@ -204,7 +206,7 @@ echo $component->prop1;
$component->prop1 = $value; $component->prop1 = $value;
``` ```
また同様に、ビヘイビアの *パブリック* メソッドも呼ぶことができます: また同様に、ビヘイビアの *パブリック*メソッドも呼ぶことができます:
```php ```php
// foo() はビヘイビア・クラス内で定義されたパブリック・メソッド // foo() はビヘイビア・クラス内で定義されたパブリック・メソッド
@ -285,7 +287,8 @@ class User extends ActiveRecord
上のビヘイビア構成は、レコードが: 上のビヘイビア構成は、レコードが:
* 挿入されるとき、ビヘイビアは現在の UNIX タイムスタンプを `created_at``updated_at` 属性に割り当てます * 挿入されるとき、ビヘイビアは現在の UNIX タイムスタンプを
`created_at``updated_at` 属性に割り当てます
* 更新されるとき、ビヘイビアは現在の UNIX タイムスタンプを `updated_at` 属性に割り当てます * 更新されるとき、ビヘイビアは現在の UNIX タイムスタンプを `updated_at` 属性に割り当てます
> Note: 上記の実装が MySQL データベースで動作するようにするためには、`created_at` と `updated_at` のカラムを UNIX タイムスタンプ になるように int(11) として宣言してください。 > Note: 上記の実装が MySQL データベースで動作するようにするためには、`created_at` と `updated_at` のカラムを UNIX タイムスタンプ になるように int(11) として宣言してください。
@ -301,7 +304,8 @@ echo $user->created_at; // 現在のタイムスタンプが表示される
``` ```
[[yii\behaviors\TimestampBehavior|TimestampBehavior]] は、また、指定された属性に現在のタイムスタンプを割り当てて [[yii\behaviors\TimestampBehavior|TimestampBehavior]] は、また、指定された属性に現在のタイムスタンプを割り当てて
それをデータベースに保存する、便利なメソッド [[yii\behaviors\TimestampBehavior::touch()|touch()]] を提供しています。 それをデータベースに保存する、便利なメソッド [[yii\behaviors\TimestampBehavior::touch()|touch()]]
を提供しています。
```php ```php
$user->touch('login_time'); $user->touch('login_time');
@ -313,11 +317,14 @@ $user->touch('login_time');
その他にも、内蔵または外部ライブラリによって利用できるビヘイビアがいくつかあります。 その他にも、内蔵または外部ライブラリによって利用できるビヘイビアがいくつかあります。
- [[yii\behaviors\BlameableBehavior]] - 指定された属性に現在のユーザ ID を自動的に設定します。 - [[yii\behaviors\BlameableBehavior]] - 指定された属性に現在のユーザ ID を自動的に設定します。
- [[yii\behaviors\SluggableBehavior]] - 指定された属性に、URL のスラグとして使用できる値を自動的に設定します。 - [[yii\behaviors\SluggableBehavior]] - 指定された属性に、URL のスラグとして使用できる値を
- [[yii\behaviors\AttributeBehavior]] - 特定のイベントが発生したときに、ActiveRecord オブジェクトの一つまたは複数の属性に、指定された値を自動的に設定します。 自動的に設定します。
- [yii2tech\ar\softdelete\SoftDeleteBehavior](https://github.com/yii2tech/ar-softdelete) - ActiveRecord をソフト・デリートおよびソフト・リストアする、すなわち、レコードの削除を示すフラグまたはステータスを設定するメソッドを提供します。 - [[yii\behaviors\AttributeBehavior]] - 特定のイベントが発生したときに、ActiveRecord オブジェクトの一つまたは複数の属性に、
- [yii2tech\ar\position\PositionBehavior](https://github.com/yii2tech/ar-position) - レコードの順序を整数のフィールドによって管理することが出来るように、順序変更メソッドを提供します。 指定された値を自動的に設定します。
- [yii2tech\ar\softdelete\SoftDeleteBehavior](https://github.com/yii2tech/ar-softdelete) - ActiveRecord をソフト・デリートおよびソフト・リストアするメソッド、
すなわち、レコードの削除を示すフラグまたはステータスを設定するメソッドを提供します。
- [yii2tech\ar\position\PositionBehavior](https://github.com/yii2tech/ar-position) - レコードの順序を整数のフィールドによって管理することが出来るように、
順序変更メソッドを提供します。
ビヘイビアとトレイトの比較 <span id="comparison-with-traits"></span> ビヘイビアとトレイトの比較 <span id="comparison-with-traits"></span>
-------------------------- --------------------------
@ -332,7 +339,8 @@ $user->touch('login_time');
ビヘイビアは通常のクラスのように、継承をサポートしています。いっぽうトレイトは、 ビヘイビアは通常のクラスのように、継承をサポートしています。いっぽうトレイトは、
言語サポートされたコピー&ペーストとみなすことができます。トレイトは継承をサポートしません。 言語サポートされたコピー&ペーストとみなすことができます。トレイトは継承をサポートしません。
ビヘイビアは、コンポーネント・クラスの変更を必要とせず、コンポーネントに動的にアタッチまたはデタッチすることが可能です。トレイトを使用するには、トレイトを使ってクラスのコードを書き換える必要があります。 ビヘイビアは、コンポーネント・クラスの変更を必要とせず、コンポーネントに動的にアタッチまたはデタッチすることが可能です。
トレイトを使用するには、トレイトを使うクラスのコードを書き換える必要があります。
ビヘイビアは構成可能ですがトレイトは不可能です。 ビヘイビアは構成可能ですがトレイトは不可能です。
@ -340,13 +348,13 @@ $user->touch('login_time');
同じコンポーネントにアタッチされた異なるビヘイビア間で名前の競合がある場合、その競合は自動的に、 同じコンポーネントにアタッチされた異なるビヘイビア間で名前の競合がある場合、その競合は自動的に、
先にコンポーネントにアタッチされたものを優先することで解消されます。 先にコンポーネントにアタッチされたものを優先することで解消されます。
別のトレイトが起こした名前競合の場合、影響を受けるプロパティやメソッドの名前変更による、手動での解決が必要です。 異なるトレイトによって引き起こされる名前競合の場合は、
影響を受けるプロパティやメソッドの名前変更による、手動での解決が必要です。
### トレイトを使う理由 <span id="pros-for-traits"></span> ### トレイトを使う理由 <span id="pros-for-traits"></span>
ビヘイビアは時間もメモリも食うオブジェクトなので、トレイトはビヘイビアよりはるかに効率的です。 ビヘイビアは時間もメモリも食うオブジェクトなので、トレイトはビヘイビアよりはるかに効率的です。
+9 トレイトはネイティブな言語構造であるため、IDE との相性に優れています。
トレイトは言語構造であるため、IDE との相性に優れています。

25
docs/guide-ja/concept-components.md

@ -8,8 +8,9 @@
* [イベント](concept-events.md) * [イベント](concept-events.md)
* [ビヘイビア](concept-behaviors.md) * [ビヘイビア](concept-behaviors.md)
個々にでも、組み合わせでも、これらの機能は Yii のクラスのカスタマイズ性と使いやすさをとても高めてくれます。たとえば、[[yii\jui\DatePicker|日付選択]] を行うユーザ・インタフェイス·コンポーネントは、 個々にでも、組み合わせでも、これらの機能は Yii のクラスのカスタマイズ性と使いやすさをとても高めてくれます。
対話型の日付選択 UI を生成するとき、[ビュー](structure-views.md) で次のように使用することができます: たとえば、ユーザ・インタフェイス·コンポーネントである [[yii\jui\DatePicker|デイト・ピッカー]] は、
[ビュー](structure-views.md) で次のように使用して、対話型の日付選択 UI を生成することができます:
```php ```php
use yii\jui\DatePicker; use yii\jui\DatePicker;
@ -27,16 +28,19 @@ echo DatePicker::widget([
コンポーネントは非常に強力ですが、 [イベント](concept-events.md) と [ビヘイビア](concept-behaviors.md) をサポートするため、 コンポーネントは非常に強力ですが、 [イベント](concept-events.md) と [ビヘイビア](concept-behaviors.md) をサポートするため、
余分にメモリと CPU 時間を要し、通常のオブジェクトよりも少し重くなります。 余分にメモリと CPU 時間を要し、通常のオブジェクトよりも少し重くなります。
あなたのコンポーネントがこれら2つの機能を必要としない場合、[[yii\base\Component]] の代わりに、 [[yii\base\BaseObject]] からコンポーネント・クラスを派生することを検討してもよいでしょう。 あなたのコンポーネントがこれら2つの機能を必要としない場合、[[yii\base\Component]] の代わりに、
[[yii\base\BaseObject]] からコンポーネント・クラスを派生することを検討してもよいでしょう。
そうすることで、あなたのコンポーネントは、 [プロパティ](concept-properties.md) のサポートが維持されたまま、通常の PHP オブジェクトのように効率的になります。 そうすることで、あなたのコンポーネントは、 [プロパティ](concept-properties.md) のサポートが維持されたまま、通常の PHP オブジェクトのように効率的になります。
[[yii\base\Component]] または [[yii\base\BaseObject]] からクラスを派生するときは、次の規約に従うことが推奨されます: [[yii\base\Component]] または [[yii\base\BaseObject]] からクラスを派生するときは、
次の規約に従うことが推奨されます:
- コンストラクタをオーバーライドする場合は、コンストラクタの *最後の* パラメータとして `$config` パラメータを指定し、親のコンストラクタにこのパラメータを渡すこと。 - コンストラクタをオーバーライドする場合は、コンストラクタの *最後の* パラメータとして `$config` パラメータを指定し、
親のコンストラクタにこのパラメータを渡すこと。
- 自分がオーバーライドしたコンストラクタの *最後で* 、必ず親クラスのコンストラクタを呼び出すこと。 - 自分がオーバーライドしたコンストラクタの *最後で* 、必ず親クラスのコンストラクタを呼び出すこと。
- [[yii\base\BaseObject::init()]] メソッドをオーバーライドする場合は、自分の `init()` メソッドの *最初に* 、必ず `init()` の親実装を呼び出すようにすること。 - [[yii\base\BaseObject::init()]] メソッドをオーバーライドする場合は、自分の `init()` メソッドの *最初に* 、必ず `init()` の親実装を呼び出すようにすること。
: えば、
```php ```php
<?php <?php
@ -65,11 +69,12 @@ class MyClass extends BaseObject
} }
} }
``` ```
このガイドラインに従うことで、あなたのコンポーネントは生成時に [コンフィグ可能](concept-configurations.md) になります。例:
このガイドラインに従うことで、あなたのコンポーネントは生成時に [コンフィグ可能](concept-configurations.md) になります。例えば、
```php ```php
$component = new MyClass(1, 2, ['prop1' => 3, 'prop2' => 4]); $component = new MyClass(1, 2, ['prop1' => 3, 'prop2' => 4]);
// とする代わりに // あるいは、また
$component = \Yii::createObject([ $component = \Yii::createObject([
'class' => MyClass::className(), 'class' => MyClass::className(),
'prop1' => 3, 'prop1' => 3,
@ -77,7 +82,8 @@ $component = \Yii::createObject([
], [1, 2]); ], [1, 2]);
``` ```
> Note: [[Yii::createObject()]] を呼び出すアプローチは複雑に見えますが、より強力です。というのも、それが [依存性注入コンテナ](concept-di-container.md) 上に実装されているからです。 > Note: [[Yii::createObject()]] を呼び出すアプローチは複雑に見えますが、より強力です。
> というのも、それが [依存性注入コンテナ](concept-di-container.md) 上に実装されているからです。
[[yii\base\BaseObject]] クラスには、次のオブジェクト・ライフサイクルが適用されます: [[yii\base\BaseObject]] クラスには、次のオブジェクト・ライフサイクルが適用されます:
@ -89,4 +95,3 @@ $component = \Yii::createObject([
最初の 3 つのステップは、すべて、オブジェクトのコンストラクタ内で発生します。これは、あなたがクラス・インスタンス (つまり、オブジェクト) を得たときには、 最初の 3 つのステップは、すべて、オブジェクトのコンストラクタ内で発生します。これは、あなたがクラス・インスタンス (つまり、オブジェクト) を得たときには、
すでにそのオブジェクトが適切な、信頼性の高い状態に初期化されていることを意味します。 すでにそのオブジェクトが適切な、信頼性の高い状態に初期化されていることを意味します。

44
docs/guide-ja/concept-configurations.md

@ -1,9 +1,10 @@
構成情報 構成情報
============== ==============
新しいオブジェクトを作成したり、既存のオブジェクトを初期化するとき、Yiiでは構成情報が広く使用されています。 新しいオブジェクトを作成したり、既存のオブジェクトを初期化するとき、Yii では構成情報が広く使用されています。
構成情報は通常、作成されるオブジェクトのクラス名、およびオブジェクトの [プロパティ](concept-properties.md) 構成情報は通常、作成されるオブジェクトのクラス名、およびオブジェクトの [プロパティ](concept-properties.md)
に割り当てられる初期値のリストを含みます。構成情報は、オブジェクトの [イベント](concept-events.md) にアタッチされるハンドラのリストや、オブジェクトにアタッチされる に割り当てられる初期値のリストを含みます。
構成情報は、オブジェクトの [イベント](concept-events.md) にアタッチされるハンドラのリストや、オブジェクトにアタッチされる
[ビヘイビア](concept-behaviors.md) のリストを含むこともできます。 [ビヘイビア](concept-behaviors.md) のリストを含むこともできます。
以下では、データベース接続を作成して初期化するために、構成情報が使用されています: 以下では、データベース接続を作成して初期化するために、構成情報が使用されています:
@ -19,11 +20,13 @@ $config = [
$db = Yii::createObject($config); $db = Yii::createObject($config);
``` ```
[[Yii::createObject()]] メソッドは引数に構成情報の配列を受け取り、構成情報で名前指定されたクラスをインスタンス化してオブジェクトを作成します。 [[Yii::createObject()]] メソッドは引数に構成情報の配列を受け取り、構成情報で名前指定されたクラスをインスタンス化してオブジェクトを作成します。
オブジェクトがインスタンス化されるとき、その他の設定を使って、 オブジェクトがインスタンス化されるとき、構成情報の残りの部分を使って、
オブジェクトのプロパティ、イベント・ハンドラ、およびビヘイビアが初期化されます。 オブジェクトのプロパティ、イベント・ハンドラ、およびビヘイビアが初期化されます。
すでにオブジェクトがある場合は、構成情報配列でオブジェクトのプロパティを初期化するのに [[Yii::configure()]] を使用することができます: すでにオブジェクトがある場合は、構成情報配列でオブジェクトのプロパティを初期化するのに [[Yii::configure()]]
を使用することができます:
```php ```php
Yii::configure($object, $config); Yii::configure($object, $config);
@ -48,7 +51,8 @@ Yii::configure($object, $config);
ここで ここで
* `class` 要素は、作成されるオブジェクトの完全修飾クラス名を指定します。 * `class` 要素は、作成されるオブジェクトの完全修飾クラス名を指定します。
* `propertyName` 要素は、名前で指定されたプロパティの初期値を指定します。キーはプロパティ名で、値はそれに対応する初期値です。 * `propertyName` 要素は、名前で指定されたプロパティの初期値を指定します。
キーはプロパティ名で、値はそれに対応する初期値です。
パブリック・メンバ変数と getter/setter によって定義されている [プロパティ](concept-properties.md) のみを設定することができます。 パブリック・メンバ変数と getter/setter によって定義されている [プロパティ](concept-properties.md) のみを設定することができます。
* `on eventName` 要素は、どのようなハンドラがオブジェクトの [イベント](concept-events.md) にアタッチされるかを指定します。 * `on eventName` 要素は、どのようなハンドラがオブジェクトの [イベント](concept-events.md) にアタッチされるかを指定します。
配列のキーが `on` に続けてイベント名という書式になることに注意してください。サポートされているイベント・ハンドラの形式については、 配列のキーが `on` に続けてイベント名という書式になることに注意してください。サポートされているイベント・ハンドラの形式については、
@ -78,12 +82,12 @@ Yii::configure($object, $config);
構成情報は Yii の多くの場所で使用されています。このセクションの冒頭では、 [[Yii::createObject()]] 構成情報は Yii の多くの場所で使用されています。このセクションの冒頭では、 [[Yii::createObject()]]
を使って、構成情報に応じてオブジェクトを作成する方法を示しました。この項では、 を使って、構成情報に応じてオブジェクトを作成する方法を示しました。この項では、
アプリケーションの構成とウィジェットの構成という、2つの主要な構成情報の用途を説明します。 アプリケーションの構成とウィジェットの構成という、つの主要な構成情報の用途を説明します。
### アプリケーションの構成 <span id="application-configurations"></span> ### アプリケーションの構成 <span id="application-configurations"></span>
[アプリケーション](structure-applications.md) の構成は、おそらく Yii の中で最も複雑な配列のひとつです。 [アプリケーション](structure-applications.md) の構成情報は、おそらく Yii の中で最も複雑な配列のひとつです。
それは [[yii\web\Application|アプリケーション]] クラスが、設定可能なプロパティとイベントを数多く持つためです。 それは [[yii\web\Application|アプリケーション]] クラスが、設定可能なプロパティとイベントを数多く持つためです。
さらに重要なことは、その [[yii\web\Application::components|components]] プロパティが、アプリケーションに登録されている さらに重要なことは、その [[yii\web\Application::components|components]] プロパティが、アプリケーションに登録されている
コンポーネントの生成用の構成情報配列を受け取ることができることです。以下は、 [ベーシック・プロジェクト・テンプレート](start-basic.md) コンポーネントの生成用の構成情報配列を受け取ることができることです。以下は、 [ベーシック・プロジェクト・テンプレート](start-basic.md)
@ -128,9 +132,11 @@ $config = [
(new yii\web\Application($config))->run(); (new yii\web\Application($config))->run();
``` ```
アプリケーションの `components` プロパティ構成の詳細については、 [アプリケーション](structure-applications.md) のセクションと [サービス・ロケータ](concept-service-locator.md) のセクションにあります。 アプリケーションの `components` プロパティ構成の詳細については、 [アプリケーション](structure-applications.md) のセクションと
[サービス・ロケータ](concept-service-locator.md) のセクションにあります。
バージョン 2.0.11 以降では、アプリケーション構成で `container` プロパティを使って [依存注入コンテナ](concept-di-container.md) を構成することがサポートされています。 バージョン 2.0.11 以降では、アプリケーション構成で `container` プロパティを使って
[依存注入コンテナ](concept-di-container.md) を構成することがサポートされています。例えば、
```php ```php
$config = [ $config = [
@ -149,12 +155,14 @@ $config = [
``` ```
`definitions``singletons` の構成情報配列に使用できる値とその実例についてさらに知るためには、 `definitions``singletons` の構成情報配列に使用できる値とその実例についてさらに知るためには、
[依存注入コンテナ](concept-di-container.md) の記事の [高度な実際の使用方法](concept-di-container.md#advanced-practical-usage) のセクションを読んでください。 [依存注入コンテナ](concept-di-container.md) の記事の [高度な実際の使用方法](concept-di-container.md#advanced-practical-usage)
のセクションを読んでください。
### ウィジェットの構成 <span id="widget-configurations"></span> ### ウィジェットの構成 <span id="widget-configurations"></span>
[ウィジェット](structure-widgets.md) を使用するときは、多くの場合、ウィジェットのプロパティをカスタマイズするために、構成情報を使用する必要があります。 [ウィジェット](structure-widgets.md) を使用するときは、多くの場合、ウィジェットのプロパティをカスタマイズするために、構成情報を使用する必要があります。
[[yii\base\Widget::widget()]] と [[yii\base\Widget::begin()]] の両メソッドを使って、ウィジェットを作成できます。それらは、以下のような構成情報配列を取ります。 [[yii\base\Widget::widget()]] と [[yii\base\Widget::begin()]] の両メソッドを使って、ウィジェットを作成できます。
それらは、以下のような構成情報配列を取ります。
```php ```php
use yii\widgets\Menu; use yii\widgets\Menu;
@ -178,8 +186,8 @@ echo Menu::widget([
## 構成情報ファイル <span id="configuration-files"></span> ## 構成情報ファイル <span id="configuration-files"></span>
構成情報がとても複雑になる場合、一般的な方法は、 *構成情報ファイル* と呼ばれる、ひとつまたは複数の PHP ファイルにそれを格納することです。 構成情報がとても複雑になる場合、一般的な方法は、 *構成情報ファイル* と呼ばれる、ひとつまたは複数の PHP ファイルにそれを格納することです。
構成情報ファイルは、構成情報を表す PHP 配列を return します。 構成情報ファイルは、構成情報を表す PHP 配列をします。
たとえば、次のように、 `web.php` と名づけたファイルにアプリケーション構成を保持することができます。 たとえば、次のように、 `web.php` と名づけたファイルにアプリケーション構成情報を保持することができます。
```php ```php
return [ return [
@ -189,7 +197,8 @@ return [
'components' => require __DIR__ . '/components.php', 'components' => require __DIR__ . '/components.php',
]; ];
``` ```
`components` の構成もまた複雑になるため、上記のように、 `components.php` と呼ぶ別のファイルにそれを格納し `web.php` でそのファイルを "require" しています。
`components` の構成情報もまた複雑になるため、上記のように、 `components.php` と呼ぶ別のファイルにそれを格納し `web.php` でそのファイルを "require" しています。
この `components.php` の内容は、次のようになっています。 この `components.php` の内容は、次のようになっています。
```php ```php
@ -232,7 +241,7 @@ $config = require 'path/to/web.php';
[[Yii::createObject()]] メソッドは、 [依存性注入コンテナ](concept-di-container.md) をベースに実装されています。 [[Yii::createObject()]] メソッドは、 [依存性注入コンテナ](concept-di-container.md) をベースに実装されています。
そのため、指定されたクラスが [[Yii::createObject()]] を使用して作成されるとき、そのすべてのインスタンスに適用される、 そのため、指定されたクラスが [[Yii::createObject()]] を使用して作成されるとき、そのすべてのインスタンスに適用される、
いわゆる *デフォルト設定* のセットを指定することができます。デフォルト設定は、 いわゆる *デフォルト設定* のセットを指定することができます。デフォルト設定は、
[ブートストラップ](runtime-bootstrapping.md) コード内の `Yii::$container->set()` を呼び出すことで指定することができます。 [ブートストラップ](runtime-bootstrapping.md) 段階のコード内で `Yii::$container->set()` を呼び出すことで指定することができます。
たとえばあなたが、すべてのリンク・ページャが最大で5つのページ・ボタン (デフォルト値は10) を伴って表示されるよう たとえばあなたが、すべてのリンク・ページャが最大で5つのページ・ボタン (デフォルト値は10) を伴って表示されるよう
[[yii\widgets\LinkPager]] をカスタマイズしたいとき、その目標を達成するには次のコードを使用することができます。 [[yii\widgets\LinkPager]] をカスタマイズしたいとき、その目標を達成するには次のコードを使用することができます。
@ -243,7 +252,8 @@ $config = require 'path/to/web.php';
]); ]);
``` ```
デフォルト設定を使用しなければ、あなたは、リンク・ページャを使うすべての箇所で `maxButtonCount` を設定しなければなりません。 デフォルト設定を使用しなければ、あなたは、リンク・ページャを使うすべての箇所で
`maxButtonCount` を設定しなければなりません。
## 環境定数 <span id="environment-constants"></span> ## 環境定数 <span id="environment-constants"></span>
@ -266,7 +276,7 @@ defined('YII_ENV') or define('YII_ENV', 'dev');
- `test`: テスト環境。定数 `YII_ENV_TEST``true` と評価されます。 - `test`: テスト環境。定数 `YII_ENV_TEST``true` と評価されます。
これらの環境定数を使用すると、現在の環境に基づいて条件付きで構成情報を指定することもできます。 これらの環境定数を使用すると、現在の環境に基づいて条件付きで構成情報を指定することもできます。
たとえば、アプリケーション構成情報には、開発環境での [デバッグツールバーとデバッガ](tool-debugger.md) たとえば、アプリケーション構成情報には、開発環境での [デバッグツールバーとデバッガ](tool-debugger.md)
を有効にするために、次のコードを含むことができます。 を有効にするために、次のコードを含むことができます。
```php ```php

87
docs/guide-ja/concept-di-container.md

@ -9,7 +9,8 @@
依存注入 <span id="dependency-injection"></span> 依存注入 <span id="dependency-injection"></span>
-------- --------
Yii は [[yii\di\Container]] クラスを通して DI コンテナの機能を提供します。これは、次の種類の依存注入をサポートしています: Yii は [[yii\di\Container]] クラスを通して DI コンテナの機能を提供します。
これは、次の種類の依存注入をサポートしています:
* コンストラクタ・インジェクション * コンストラクタ・インジェクション
* メソッド・インジェクション * メソッド・インジェクション
@ -19,10 +20,10 @@ Yii は [[yii\di\Container]] クラスを通して DI コンテナの機能を
### コンストラクタ・インジェクション <span id="constructor-injection"></span> ### コンストラクタ・インジェクション <span id="constructor-injection"></span>
DI コンテナは、コンストラクタのパラメータの型ヒントの助けを借りた、コンストラクタ・インジェクションをサポートしています。 DI コンテナは、コンストラクタ引数の型ヒントの助けを借りて、コンストラクタ・インジェクションをサポートしています。
型ヒントは、コンテナが新しいオブジェクトの作成に使用されるさい、オブジェクトがどういうクラスやインタフェイスに依存しているかをコンテナに教えます。 コンテナが新しいオブジェクトの作成に使用されるさい、そのオブジェクトがどういうクラスやインタフェイスに依存しているかを、型ヒントがコンテナに教えます。
コンテナは、依存クラスやインタフェイスのインスタンスを取得することを試み、コンストラクタを通して、新しいオブジェクトにそれらを注入します。 コンテナは、依存するクラスやインタフェイスのインスタンスを取得して、
たとえば コンストラクタを通して、新しいオブジェクトにそれらを注入しようと試みます。たとえば
```php ```php
class Foo class Foo
@ -42,9 +43,10 @@ $foo = new Foo($bar);
### メソッド・インジェクション <span id="method-injection"></span> ### メソッド・インジェクション <span id="method-injection"></span>
通常、クラスの依存はコンストラクタに渡されて、そのクラスの内部でライフサイクル全体にわたって利用可能になります。 通常、クラスの依存はコンストラクタに渡されて、そのクラスの内部でライフサイクル全体にわたって利用可能になります。
メソッド・インジェクションを使うと、クラスのメソッドの一つだけに必要となる依存、例えば、コンストラクタに渡すことが不可能であったり、大半のユースケースにおいてはオーバーヘッドが大きすぎるような依存を提供することが可能になります。 メソッド・インジェクションを使うと、クラスのメソッドの一つだけに必要となる依存、例えば、コンストラクタに渡すことが不可能であったり、
大半のユース・ケースにおいてはオーバーヘッドが大きすぎるような依存を提供することが可能になります。
クラスメソッドを次の例の `doSomething` メソッドのように定義することが出来ます。 クラスメソッドを次の例の `doSomething` メソッドのように定義することが出来ます。
```php ```php
class MyClass extends \yii\base\Component class MyClass extends \yii\base\Component
@ -61,19 +63,18 @@ class MyClass extends \yii\base\Component
} }
``` ```
このメソッドを呼ぶためには、あなた自身で `\my\heavy\Dependency` のインスタンスを渡すか、または、次のように このメソッドを呼ぶためには、あなた自身で `\my\heavy\Dependency` のインスタンスを渡すか、または、次のように [[yii\di\Container::invoke()]] を使います。
[[yii\di\Container::invoke()]] を使います。
```php ```php
$obj = new MyClass(/*...*/); $obj = new MyClass(/*...*/);
Yii::$container->invoke([$obj, 'doSomething'], ['param1' => 42]); // $something は DI コンテナによって提供される Yii::$container->invoke([$obj, 'doSomething'], ['param1' => 42]); // $something は DI コンテナによって提供される
``` ```
### セッター/プロパティ・インジェクション <span id="setter-and-property-injection"></span> ### セッター/プロパティ・インジェクション <span id="setter-and-property-injection"></span>
セッター/プロパティ・インジェクションは、[構成情報](concept-configurations.md) を通してサポートされます。 セッター/プロパティ・インジェクションは、[構成情報](concept-configurations.md) を通してサポートされます。
依存を登録するときや、新しいオブジェクトを作成するときに、対応するセッターまたはプロパティを通しての依存注入に使用される構成情報を、コンテナに提供することが出来ます。 依存を登録するときや、新しいオブジェクトを作成するときに、対応するセッターまたはプロパティを通しての依存注入に使用される構成情報を、
コンテナに提供することが出来ます。
たとえば たとえば
```php ```php
@ -103,9 +104,11 @@ $container->get('Foo', [], [
``` ```
> Info: [[yii\di\Container::get()]] メソッドは三番目のパラメータを、生成されるオブジェクトに適用されるべき構成情報配列として受け取ります。 > Info: [[yii\di\Container::get()]] メソッドは三番目のパラメータを、生成されるオブジェクトに適用されるべき構成情報配列として受け取ります。
クラスが [[yii\base\Configurable]] インタフェイスを実装している場合 (例えば、クラスが [[yii\base\BaseObject]] である場合) には、この構成情報配列がクラスのコンストラクタの最後のパラメータとして渡されます。 クラスが [[yii\base\Configurable]] インタフェイスを実装している場合 (例えば、クラスが [[yii\base\BaseObject]] である場合) には、
この構成情報配列がクラスのコンストラクタの最後のパラメータとして渡されます。
そうでない場合は、構成情報はオブジェクトが生成された *後で* 適用されることになります。 そうでない場合は、構成情報はオブジェクトが生成された *後で* 適用されることになります。
### PHP コーラブル・インジェクション <span id="php-callable-injection"></span> ### PHP コーラブル・インジェクション <span id="php-callable-injection"></span>
この場合、コンテナは、登録された PHP のコーラブルを使用して、クラスの新しいインスタンスを構築します。 この場合、コンテナは、登録された PHP のコーラブルを使用して、クラスの新しいインスタンスを構築します。
@ -123,8 +126,7 @@ $container->set('Foo', function ($container, $params, $config) {
$foo = $container->get('Foo'); $foo = $container->get('Foo');
``` ```
新しいオブジェクトを構築するための複雑なロジックを隠蔽するために、スタティックなクラスメソッドをコーラブルとして使うことが出来ます。 新しいオブジェクトを構築するための複雑なロジックを隠蔽するために、スタティックなクラスメソッドをコーラブルとして使うことが出来ます。例えば、
例えば、
```php ```php
class FooBuilder class FooBuilder
@ -148,8 +150,7 @@ $foo = $container->get('Foo');
依存を登録する <span id="registering-dependencies"></span> 依存を登録する <span id="registering-dependencies"></span>
-------------- --------------
[[yii\di\Container::set()]] を使って依存を登録することができます。 [[yii\di\Container::set()]] を使って依存を登録することができます。登録には依存の名前だけでなく、依存の定義が必要です。
登録には依存の名前だけでなく、依存の定義が必要です。
依存の名前は、クラス名、インタフェイス名、エイリアス名を指定することができます。 依存の名前は、クラス名、インタフェイス名、エイリアス名を指定することができます。
依存の定義には、クラス名、構成情報配列、PHPのコーラブルを指定できます。 依存の定義には、クラス名、構成情報配列、PHPのコーラブルを指定できます。
@ -198,10 +199,12 @@ $container->set('db', function ($container, $params, $config) {
$container->set('pageCache', new FileCache); $container->set('pageCache', new FileCache);
``` ```
> Note: 依存の名前が対応する依存の定義と同じである場合は、それを DI コンテナに登録する必要はありません。 > Note: 依存の名前が対応する依存の定義と同じである場合は、
それを DI コンテナに登録する必要はありません。
`set()` を介して登録された依存は、依存が必要とされるたびにインスタンスを生成します。 `set()` を介して登録された依存は、依存が必要とされるたびにインスタンスを生成します。
[[yii\di\Container::setSingleton()]] を使うと、単一のインスタンスしか生成しない依存を登録することができます: [[yii\di\Container::setSingleton()]] を使うと、
単一のインスタンスしか生成しない依存を登録することができます:
```php ```php
$container->setSingleton('yii\db\Connection', [ $container->setSingleton('yii\db\Connection', [
@ -221,9 +224,10 @@ $container->setSingleton('yii\db\Connection', [
依存を解決します。依存の解決は再帰的に行われます。つまり、ある依存が他の依存を持っている場合、 依存を解決します。依存の解決は再帰的に行われます。つまり、ある依存が他の依存を持っている場合、
それらの依存も自動的に解決されます。 それらの依存も自動的に解決されます。
[[yii\di\Container::get()|get()]] を使って、オブジェクトのインスタンスを取得または作成することができます。 [[yii\di\Container::get()|get()]] を使って、オブジェクトのインスタンスを作成または取得することができます。
このメソッドは依存の名前を引数として取ります、依存の名前は、クラス名、インタフェイス名、あるいは、エイリアス名で指定できます。 このメソッドは依存の名前を引数として取りますが、依存の名前は、クラス名、インタフェイス名、あるいは、エイリアス名で指定できます。
依存の名前は、 [[yii\di\Container::set()|set()]] または [[yii\di\Container::setSingleton()|setSingleton()]] を介して登録されている場合もあります。 依存の名前は、 [[yii\di\Container::set()|set()]] を介して登録されていることもあれば、
[[yii\di\Container::setSingleton()|setSingleton()]] を介して登録されていることもあります。
オプションで、クラスのコンストラクタのパラメータのリストや、[設定情報](concept-configurations.md) を渡して、新しく作成されるオブジェクトを構成することも出来ます。 オプションで、クラスのコンストラクタのパラメータのリストや、[設定情報](concept-configurations.md) を渡して、新しく作成されるオブジェクトを構成することも出来ます。
たとえば、 たとえば、
@ -237,13 +241,13 @@ $engine = $container->get('app\components\SearchEngine', [$apiKey, $apiSecret],
``` ```
見えないところで、DIコンテナは、単に新しいオブジェクトを作成するよりもはるかに多くの作業を行います。 見えないところで、DIコンテナは、単に新しいオブジェクトを作成するよりもはるかに多くの作業を行います。
コンテナは、最初にクラスのコンストラクタを調査し、依存クラスまたはインタフェイスの名前を見つけると、 コンテナは、最初にクラスのコンストラクタを調査し、依存するクラスまたはインタフェイスの名前を見つけると、
自動的にそれらの依存を再帰的に解決します。 自動的にそれらの依存を再帰的に解決します。
次のコードでより洗練された例を示します。`UserLister` クラスは `UserFinderInterface` 次のコードでより洗練された例を示します。`UserLister` クラスは `UserFinderInterface`
インタフェイスを実装するオブジェクトに依存します。`UserFinder` クラスはこのインタフェイスを実装していて、かつ、 インタフェイスを実装するオブジェクトに依存します。`UserFinder` クラスはこのインタフェイスを実装していて、かつ、
`Connection` オブジェクトに依存します。これらのすべての依存は、クラスのコンストラクタのパラメータの型ヒントによって宣言されています。 `Connection` オブジェクトに依存します。これらのすべての依存は、クラスのコンストラクタのパラメータの型ヒントによって宣言されています。
プロパティ依存性の登録をすれば、DI コンテナは自動的にこれらの依存を解決し、単純に `get('userLister')` 依存の登録が適切にされていれば、DI コンテナは自動的にこれらの依存を解決し、単純に `get('userLister')`
を呼び出すだけで新しい `UserLister` インスタンスを作成できます。 を呼び出すだけで新しい `UserLister` インスタンスを作成できます。
```php ```php
@ -313,7 +317,7 @@ Yii は DI コンテナを作成します。この DI コンテナは [[Yii::$co
Yii は、新しいオブジェクトを作成するコアコードのほとんどにおいて [[Yii::createObject()]] を使用しています。このことは、 Yii は、新しいオブジェクトを作成するコアコードのほとんどにおいて [[Yii::createObject()]] を使用しています。このことは、
[[Yii::$container]] を操作することでグローバルにオブジェクトをカスタマイズすることができるということを意味しています。 [[Yii::$container]] を操作することでグローバルにオブジェクトをカスタマイズすることができるということを意味しています。
例として、 [[yii\widgets\LinkPager]] のページネーションボタンのデフォルト個数をグローバルにカスタマイズしてみましょう。 例として、 [[yii\widgets\LinkPager]] のページネーションボタンのデフォルト個数をグローバルにカスタマイズしてみましょう。
```php ```php
\Yii::$container->set('yii\widgets\LinkPager', ['maxButtonCount' => 5]); \Yii::$container->set('yii\widgets\LinkPager', ['maxButtonCount' => 5]);
@ -332,7 +336,9 @@ echo \yii\widgets\LinkPager::widget();
echo \yii\widgets\LinkPager::widget(['maxButtonCount' => 20]); echo \yii\widgets\LinkPager::widget(['maxButtonCount' => 20]);
``` ```
> Tip: どのような型の値であろうとも上書きされますので、オプションの配列の指定には気を付けてください。オプションの配列はマージされません。 > Tip: ウィジェットの呼び出しで与えられたプロパティは常に DI コンテナが持つ定義を上書きします。
> たとえ、`'options' => ['id' => 'mypager']` のように配列を指定したとしても、
> それらは他のオプションとマージされるのでなく、他のオプションを置換えてしまいます。
もう一つの例は、DI コンテナの自動コンストラクタ・インジェクションの利点を活かすものです。 もう一つの例は、DI コンテナの自動コンストラクタ・インジェクションの利点を活かすものです。
あなたのコントローラ・クラスが、ホテル予約サービスのような、いくつかの他のオブジェクトに依存するとします。 あなたのコントローラ・クラスが、ホテル予約サービスのような、いくつかの他のオブジェクトに依存するとします。
@ -366,14 +372,14 @@ class HotelController extends Controller
これで、あなたが再びコントローラにアクセスするときは、`app\components\BookingService` これで、あなたが再びコントローラにアクセスするときは、`app\components\BookingService`
のインスタンスが作成され、コントローラのコンストラクタに3番目のパラメータとして注入されるようになります。 のインスタンスが作成され、コントローラのコンストラクタに3番目のパラメータとして注入されるようになります。
高度な実際の使用方法 <span id="advanced-practical-usage"></span> 高度な実際の使用方法 <span id="advanced-practical-usage"></span>
-------------------- --------------------
API アプリケーションを開発していて、以下のクラスを持っているとします。 API アプリケーションを開発していて、以下のクラスを持っているとします。
- `app\components\Request` クラス。`yii\web\Request` から拡張され、追加の機能を提供する。 - `app\components\Request` クラス。`yii\web\Request` から拡張され、追加の機能を提供する。
- `app\components\Response` クラス。`yii\web\Response` から拡張。生成されるときに、`format` プロパティが `json` に設定されなければならない。 - `app\components\Response` クラス。`yii\web\Response` から拡張。
生成されるときに、`format` プロパティが `json` に設定されなければならない。
- `app\storage\FileStorage` および `app\storage\DocumentsReader` クラス。 - `app\storage\FileStorage` および `app\storage\DocumentsReader` クラス。
何らかのファイルストレージに配置されているドキュメントを操作するロジックを実装する。 何らかのファイルストレージに配置されているドキュメントを操作するロジックを実装する。
@ -395,14 +401,16 @@ API アプリケーションを開発していて、以下のクラスを持っ
[[yii\di\Container::setDefinitions()|setDefinitions()]] または [[yii\di\Container::setSingletons()|setSingletons()]] [[yii\di\Container::setDefinitions()|setDefinitions()]] または [[yii\di\Container::setSingletons()|setSingletons()]]
のメソッドに構成情報の配列を渡して、複数の定義を一度に構成することが可能です。 のメソッドに構成情報の配列を渡して、複数の定義を一度に構成することが可能です。
これらのメソッドは、構成情報配列を反復して、各アイテムに対し、それぞれ [[yii\di\Container::set()|set()]] を呼び出します。 これらのメソッドは、構成情報配列を反復して、各アイテムに対し、
それぞれ [[yii\di\Container::set()|set()]] を呼び出します。
構成情報配列のフォーマットは、 構成情報配列のフォーマットは、
- `key`: クラス名、インタフェイス名、または、エイリアス名。 - `key`: クラス名、インタフェイス名、または、エイリアス名。
このキーが [[yii\di\Container::set()|set()]] メソッドの最初の引数 `$class` として渡されます。 このキーが [[yii\di\Container::set()|set()]] メソッドの最初の引数 `$class` として渡されます。
- `value`: `$class` と関連づけられる定義。指定できる値は、[[yii\di\Container::set()|set()]] の `$definition` - `value`: `$class` と関連づけられる定義。指定できる値は、[[yii\di\Container::set()|set()]] の `$definition`
パラメータのドキュメントで説明されています。[[set()]] メソッドに二番目のパラメータ `$definition` として渡されます。 パラメータのドキュメントで説明されています。
[[set()]] メソッドに二番目のパラメータ `$definition` として渡されます。
例として、上述の要求に従うように私たちのコンテナを構成しましょう。 例として、上述の要求に従うように私たちのコンテナを構成しましょう。
@ -424,9 +432,10 @@ $reader = $container->get('app\storage\DocumentsReader);
``` ```
> Tip: バージョン 2.0.11 以降では、アプリケーションの構成情報を使って、宣言的なスタイルでコンテナを構成することが出来ます。 > Tip: バージョン 2.0.11 以降では、アプリケーションの構成情報を使って、宣言的なスタイルでコンテナを構成することが出来ます。
[構成情報](concept-configurations.md) のガイドの [アプリケーションの構成](concept-configurations.md#application-configurations) のセクションを参照してください。 [構成情報](concept-configurations.md) のガイドの [アプリケーションの構成](concept-configurations.md#application-configurations)
これで全部動きますが、`DocumentWriter` クラスを生成する必要がある場合には、 のセクションを参照してください。
`FileStorage` オブジェクトを生成する行をコピペすることになるでしょう。
これで全部動きますが、`DocumentWriter` クラスを生成する必要がある場合には、`FileStorage` オブジェクトを生成する行をコピペすることになるでしょう。
もちろん、それが一番スマートな方法ではありません。 もちろん、それが一番スマートな方法ではありません。
[依存を解決する](#resolving-dependencies) のセクションで説明したように、[[yii\di\Container::set()|set()]] と [[yii\di\Container::setSingleton()|setSingleton()]] は、 [依存を解決する](#resolving-dependencies) のセクションで説明したように、[[yii\di\Container::set()|set()]] と [[yii\di\Container::setSingleton()|setSingleton()]] は、
@ -435,7 +444,8 @@ $reader = $container->get('app\storage\DocumentsReader);
- `key`: クラス名、インタフェイス名、または、エイリアス名。 - `key`: クラス名、インタフェイス名、または、エイリアス名。
このキーが [[yii\di\Container::set()|set()]] メソッドの最初の引数 `$class` として渡されます。 このキーが [[yii\di\Container::set()|set()]] メソッドの最初の引数 `$class` として渡されます。
- `value`: 二つの要素を持つ配列。最初の要素は [[set()]] メソッドに二番目のパラメータ `$definition` として渡され、第二の要素が `$params` として渡されます。 - `value`: 二つの要素を持つ配列。最初の要素は [[set()]] メソッドに二番目のパラメータ `$definition`
として渡され、第二の要素が `$params` として渡されます。
では、私たちの例を修正しましょう。 では、私たちの例を修正しましょう。
@ -468,9 +478,10 @@ $reader = $container->get('app\storage\DocumentsReader);
構成情報の最適化にかかわるもう一つのステップは、いくつかの依存をシングルトンとして登録することです。 構成情報の最適化にかかわるもう一つのステップは、いくつかの依存をシングルトンとして登録することです。
[[yii\di\Container::set()|set()]] を通じて登録された依存は、必要になるたびに、毎回インスタンス化されます。 [[yii\di\Container::set()|set()]] を通じて登録された依存は、必要になるたびに、毎回インスタンス化されます。
しかし、ある種のクラスは実行時を通じて状態を変化させませんので、アプリケーションのパフォーマンスを高めるためにシングルトンとして登録することが出来ます。 しかし、ある種のクラスは実行時を通じて状態を変化させませんので、
アプリケーションのパフォーマンスを高めるためにシングルトンとして登録することが出来ます。
`app\storage\FileStorage` クラスが好例でしょう。これは単純な API によってファイルシステムに対する何らかの操作を実行するもの `app\storage\FileStorage` クラスが好例でしょう。これは単純な API によってファイルシステムに対する何らかの操作を実行するもの
(例えば `$fs->read()``$fs->write()`) ですが、これらの操作はクラスの内部状態を変化させないものです。 (例えば `$fs->read()``$fs->write()`) ですが、これらの操作はクラスの内部状態を変化させないものです。
従って、このクラスのインスタンスを一度だけ生成して、それを複数回使用することが可能です。 従って、このクラスのインスタンスを一度だけ生成して、それを複数回使用することが可能です。
@ -503,7 +514,8 @@ $reader = $container->get('app\storage\DocumentsReader');
推奨されるプラクティスは以下のとおりです: 推奨されるプラクティスは以下のとおりです:
* あなたがアプリケーションの開発者である場合は、アプリケーションの構成情報を使って依存を登録することが出来ます。 * あなたがアプリケーションの開発者である場合は、アプリケーションの構成情報を使って依存を登録することが出来ます。
[構成情報](concept-configurations.md) のガイドの [アプリケーションの構成](concept-configurations.md#application-configurations) のセクションを読んでください。 [構成情報](concept-configurations.md) のガイドの [アプリケーションの構成](concept-configurations.md#application-configurations)
のセクションを読んでください。
* あなたが再配布可能な [エクステンション](structure-extensions.md) の開発者である場合は、エクステンションのブートストラップ・クラス内で * あなたが再配布可能な [エクステンション](structure-extensions.md) の開発者である場合は、エクステンションのブートストラップ・クラス内で
依存を登録することができます。 依存を登録することができます。
@ -512,7 +524,8 @@ $reader = $container->get('app\storage\DocumentsReader');
------ ------
依存注入と [サービス・ロケータ](concept-service-locator.md) はともに、疎結合でよりテストしやすい方法でのソフトウェア構築を可能にする、 依存注入と [サービス・ロケータ](concept-service-locator.md) はともに、疎結合でよりテストしやすい方法でのソフトウェア構築を可能にする、
定番のデザインパターンです。依存注入とサービス・ロケータへのより深い理解を得るために、 [Martin の記事](http://martinfowler.com/articles/injection.html) 定番のデザインパターンです。
依存注入とサービス・ロケータへのより深い理解を得るために、 [Martin の記事](http://martinfowler.com/articles/injection.html)
を読むことを強くお勧めします。 を読むことを強くお勧めします。
Yii はその [サービス・ロケータ](concept-service-locator.md) を、依存注入 (DI) コンテナの上に実装しています。 Yii はその [サービス・ロケータ](concept-service-locator.md) を、依存注入 (DI) コンテナの上に実装しています。

39
docs/guide-ja/concept-events.md

@ -13,12 +13,12 @@ Yiiはイベントをサポートするために、 [[yii\base\Component]] と
イベント・ハンドラ <span id="event-handlers"></span> イベント・ハンドラ <span id="event-handlers"></span>
------------------ ------------------
イベント・ハンドラとは、関連するイベントがトリガされたときに実行される [PHP コールバック](http://www.php.net/manual/ja/language.types.callable.php) イベント・ハンドラとは、アタッチされたイベントがトリガされたときに実行される [PHP コールバック](http://www.php.net/manual/ja/language.types.callable.php)
です。次のコールバックのいずれも使用可能です: です。次のコールバックのいずれも使用可能です:
- 文字列で指定されたグローバル PHP 関数 (括弧を除く)、例えば `'trim'` - 文字列で指定されたグローバル PHP 関数 (括弧を除く)、例えば `'trim'`
- オブジェクトとメソッド名文字列の配列で指定された、オブジェクトのメソッド (括弧を除く)、例えば `[$object, 'methodName']` - オブジェクトとメソッド名文字列の配列で指定された、オブジェクトのメソッド (括弧を除く)、例えば `[$object, 'methodName']`
- クラス名文字列とメソッド名文字列の配列で指定された、静的なクラスメソッド (括弧を除く)、例えば `['ClassName', 'methodName']` - クラス名文字列とメソッド名文字列の配列で指定された、静的なクラスメソッド (括弧を除く)、例えば `['ClassName', 'methodName']`
- 無名関数、例えば `function ($event) { ... }` - 無名関数、例えば `function ($event) { ... }`
イベント・ハンドラのシグネチャはこのようになります: イベント・ハンドラのシグネチャはこのようになります:
@ -32,8 +32,8 @@ function ($event) {
`$event` パラメータを介して、イベント・ハンドラは発生したイベントに関して次の情報を得ることができます: `$event` パラメータを介して、イベント・ハンドラは発生したイベントに関して次の情報を得ることができます:
- [[yii\base\Event::name|イベント名]] - [[yii\base\Event::name|イベント名]]
- [[yii\base\Event::sender|イベント送信元]]: `trigger()` メソッドを呼び出したオブジェクト - [[yii\base\Event::sender|イベント送信元]]: `trigger()` メソッドが呼ばれたオブジェクト
- [[yii\base\Event::data|カスタムデータ]]: イベント・ハンドラを接続するときに提供されたデータ (後述) - [[yii\base\Event::data|カスタム・データ]]: イベント・ハンドラをアタッチするときに提供されたデータ (次の項で説明します)
イベント・ハンドラをアタッチする <span id="attaching-event-handlers"></span> イベント・ハンドラをアタッチする <span id="attaching-event-handlers"></span>
@ -62,6 +62,7 @@ $foo->on(Foo::EVENT_HELLO, function ($event) {
また、 [構成情報](concept-configurations.md) を通じてイベント・ハンドラをアタッチすることもできます。詳細については また、 [構成情報](concept-configurations.md) を通じてイベント・ハンドラをアタッチすることもできます。詳細については
[構成情報](concept-configurations.md) の章を参照してください。 [構成情報](concept-configurations.md) の章を参照してください。
イベント・ハンドラをアタッチするとき、 [[yii\base\Component::on()]] の3番目のパラメータとして、付加的なデータを提供することができます。 イベント・ハンドラをアタッチするとき、 [[yii\base\Component::on()]] の3番目のパラメータとして、付加的なデータを提供することができます。
そのデータは、イベントがトリガされてハンドラが呼び出されるときに、ハンドラ内で利用きます。たとえば: そのデータは、イベントがトリガされてハンドラが呼び出されるときに、ハンドラ内で利用きます。たとえば:
@ -90,7 +91,7 @@ $foo->on(Foo::EVENT_HELLO, function ($event) {
デフォルトでは、新たに接続されたハンドラは、イベントの既存のハンドラのキューに追加されます。その結果、 デフォルトでは、新たに接続されたハンドラは、イベントの既存のハンドラのキューに追加されます。その結果、
イベントがトリガされたとき、そのハンドラは一番最後に呼び出されます。もし、そのハンドラが最初に呼び出されるよう、 イベントがトリガされたとき、そのハンドラは一番最後に呼び出されます。もし、そのハンドラが最初に呼び出されるよう、
ハンドラのキューの先頭に新しいハンドラを挿入したい場合は、[[yii\base\Component::on()]] を呼び出とき、4番目のパラメータ `$append``false` を渡します: ハンドラのキューの先頭に新しいハンドラを挿入したい場合は、[[yii\base\Component::on()]] を呼び出とき、4番目のパラメータ `$append``false` を渡します:
```php ```php
$foo->on(Foo::EVENT_HELLO, function ($event) { $foo->on(Foo::EVENT_HELLO, function ($event) {
@ -130,7 +131,8 @@ class Foo extends Component
イベントをトリガするとき、イベント・ハンドラに追加情報を渡したいことがあります。たとえば、メーラーが `messageSent` イベントのハンドラに イベントをトリガするとき、イベント・ハンドラに追加情報を渡したいことがあります。たとえば、メーラーが `messageSent` イベントのハンドラに
メッセージ情報を渡して、ハンドラが送信されたメッセージの詳細を知ることができるようにしたいかもしれません。 メッセージ情報を渡して、ハンドラが送信されたメッセージの詳細を知ることができるようにしたいかもしれません。
これを行うために、 [[yii\base\Component::trigger()]] メソッドの2番目のパラメータとして、イベント・オブジェクトを与えることができます。 これを行うために、 [[yii\base\Component::trigger()]] メソッドの2番目のパラメータとして、イベント・オブジェクトを与えることができます。
イベント・オブジェクトは [[yii\base\Event]] クラスあるいはその子クラスのインスタンスでなければなりません。たとえば: イベント・オブジェクトは [[yii\base\Event]] クラスあるいはその子クラスのインスタンスでなければなりません。
たとえば:
```php ```php
namespace app\components; namespace app\components;
@ -194,10 +196,11 @@ $foo->off(Foo::EVENT_HELLO);
クラス・レベル・イベント・ハンドラ <span id="class-level-event-handlers"></span> クラス・レベル・イベント・ハンドラ <span id="class-level-event-handlers"></span>
---------------------------------- ----------------------------------
ここまでの項では、 *インスタンス・レベル* でのイベントにハンドラをアタッチする方法を説明してきました。 ここまでの項では、*インスタンス・レベル* でのイベントにハンドラをアタッチする方法を説明してきました。
場合によっては、特定のインスタンスだけではなく、クラスのすべてのインスタンスがトリガした 場合によっては、特定のインスタンスだけではなく、
イベントに応答したいことがあります。すべてのインスタンスにイベント・ハンドラをアタッチする代わりに、静的メソッド クラスのすべてのインスタンスがトリガしたイベントに応答したいことがあります。
[[yii\base\Event::on()]] を呼び出すことで、 *クラス・レベル* でハンドラをアタッチすることができます。 すべてのインスタンスにイベント・ハンドラをアタッチする代わりに、静的メソッド [[yii\base\Event::on()]] を呼び出すことで、
*クラス・レベル* でハンドラをアタッチすることができます。
たとえば、[アクティブ・レコード](db-active-record.md) オブジェクトは、データベースに新しいレコードを挿入するたびに、 たとえば、[アクティブ・レコード](db-active-record.md) オブジェクトは、データベースに新しいレコードを挿入するたびに、
[[yii\db\BaseActiveRecord::EVENT_AFTER_INSERT|EVENT_AFTER_INSERT]] イベントをトリガします。 *すべての* [[yii\db\BaseActiveRecord::EVENT_AFTER_INSERT|EVENT_AFTER_INSERT]] イベントをトリガします。 *すべての*
@ -233,7 +236,7 @@ Event::on(Foo::className(), Foo::EVENT_HELLO, function ($event) {
Event::trigger(Foo::className(), Foo::EVENT_HELLO); Event::trigger(Foo::className(), Foo::EVENT_HELLO);
``` ```
この場合、`$event->sender` は、オブジェクト・インスタンスではなく、イベントをトリガするクラスの名前を指すことに注意してください。 この場合、`$event->sender` は、オブジェクト・インスタンスではなく、`null` になることに注意してください。
> Note: クラス・レベルのハンドラは、そのクラスのあらゆるインスタンス、またはあらゆる子クラスのインスタンスがトリガしたイベントに応答 > Note: クラス・レベルのハンドラは、そのクラスのあらゆるインスタンス、またはあらゆる子クラスのインスタンスがトリガしたイベントに応答
してしまうため、よく注意して使わなければなりません。 [[yii\base\BaseObject]] のように、クラスが低レベルの基底クラスの場合は特にそうです。 してしまうため、よく注意して使わなければなりません。 [[yii\base\BaseObject]] のように、クラスが低レベルの基底クラスの場合は特にそうです。
@ -288,7 +291,8 @@ class Developer extends Component implements DanceEventInterface
} }
``` ```
これらのクラスのどれかによってトリガされた `EVENT_DANCE` を扱うためには、インタフェイスの名前を最初の引数にして [[yii\base\Event::on()|Event::on()]] を呼びます。 これらのクラスのどれかによってトリガされた `EVENT_DANCE` を扱うためには、インタフェイス・クラスの名前を最初の引数にして
[[yii\base\Event::on()|Event::on()]] を呼びます。
```php ```php
Event::on('app\interfaces\DanceEventInterface', DanceEventInterface::EVENT_DANCE, function ($event) { Event::on('app\interfaces\DanceEventInterface', DanceEventInterface::EVENT_DANCE, function ($event) {
@ -309,12 +313,11 @@ Event::trigger(Developer::className(), DanceEventInterface::EVENT_DANCE);
ただし、このインタフェイスを実装する全クラスのイベントをトリガすることは出来ない、ということに注意して下さい。 ただし、このインタフェイスを実装する全クラスのイベントをトリガすることは出来ない、ということに注意して下さい。
```php ```php
// これは動かない // これは動かない。このインタフェイスを実装するクラスのイベントはトリガされない。
Event::trigger('app\interfaces\DanceEventInterface', DanceEventInterface::EVENT_DANCE); Event::trigger('app\interfaces\DanceEventInterface', DanceEventInterface::EVENT_DANCE);
``` ```
イベント・ハンドラをデタッチするためには、[[yii\base\Event::off()|Event::off()]] を呼びます。 イベント・ハンドラをデタッチするためには、[[yii\base\Event::off()|Event::off()]] を呼びます。例えば、
例えば、
```php ```php
// $handler をデタッチ // $handler をデタッチ
@ -328,7 +331,7 @@ Event::off('app\interfaces\DanceEventInterface', DanceEventInterface::EVENT_DANC
グローバル・イベント <span id="global-events"></span> グローバル・イベント <span id="global-events"></span>
-------------------- --------------------
Yiiは、実際に上記のイベント・メカニズムに基づいたトリックである、いわゆる *グローバル・イベント* をサポートしています。 Yiiは、いわゆる *グローバル・イベント* をサポートしています。これは、実際には、上記のイベント・メカニズムに基づいたトリックです。
グローバル・イベントは、 [アプリケーション](structure-applications.md) インスタンス自身などの、グローバルにアクセス可能なシングルトンを必要とします。 グローバル・イベントは、 [アプリケーション](structure-applications.md) インスタンス自身などの、グローバルにアクセス可能なシングルトンを必要とします。
グローバル・イベントを作成するには、イベント送信者は、送信者の自前の `trigger()` メソッドを呼び出す代わりに、シングルトンの グローバル・イベントを作成するには、イベント送信者は、送信者の自前の `trigger()` メソッドを呼び出す代わりに、シングルトンの
@ -353,6 +356,7 @@ Yii::$app->trigger('bar', new Event(['sender' => new Foo]));
しかし、グローバル・イベントの名前空間はあらゆる部分から共有されているので、ある種の名前空間 ("frontend.mail.sent"、"backend.mail.sent" など) しかし、グローバル・イベントの名前空間はあらゆる部分から共有されているので、ある種の名前空間 ("frontend.mail.sent"、"backend.mail.sent" など)
を導入するというような、賢いグローバル・イベントの名前付けをする必要があります。 を導入するというような、賢いグローバル・イベントの名前付けをする必要があります。
ワイルドカード・イベント <span id="wildcard-events"></span> ワイルドカード・イベント <span id="wildcard-events"></span>
------------------------ ------------------------
@ -400,8 +404,7 @@ Event::on('*', '*', function ($event) {
ワイルドカード・パターンで指定されたイベント・ハンドラをデタッチするためには、[[yii\base\Component::off()]] または [[yii\base\Event::off()]] の呼び出しにおいて、 ワイルドカード・パターンで指定されたイベント・ハンドラをデタッチするためには、[[yii\base\Component::off()]] または [[yii\base\Event::off()]] の呼び出しにおいて、
同じパターンを使用しなければなりません。 同じパターンを使用しなければなりません。
イベント・ハンドラをデタッチする際にワイルドカードを指定すると、そのワイルドカードで指定されたハンドラだけがデタッチされることに留意して下さい。 イベント・ハンドラをデタッチする際にワイルドカードを指定すると、そのワイルドカードで指定されたハンドラだけがデタッチされることに留意して下さい。
通常のイベント名でアタッチされたハンドラは、パターンに合致する場合であっても、デタッチされません。 通常のイベント名でアタッチされたハンドラは、パターンに合致する場合であっても、デタッチされません。例えば、
例えば、
```php ```php
use Yii; use Yii;

41
docs/guide-ja/concept-properties.md

@ -1,21 +1,24 @@
プロパティ プロパティ
========== ==========
PHPでは、クラスのメンバ変数は *プロパティ* とも呼ばれます。これらの変数は、クラス定義の一部で、クラスのインスタンスの状態を表すために PHPでは、クラスのメンバ変数は *プロパティ* とも呼ばれます。
(すなわち、クラスのあるインスタンスを別のものと区別するために) 使用されます。現実には、特別な方法でこのプロパティの読み書きを扱いたい これらの変数は、クラス定義の一部で、クラスのインスタンスの状態を表すために(すなわち、クラスのあるインスタンスを別のものと区別するために) 使用されます。
場合がよくあります。たとえば、`label` プロパティに割り当てられる文字列が常にトリミングされるようにしたい、など。その仕事を成し遂げるために、 現実には、特別な方法でこのプロパティの読み書きを扱いたい場合がよくあります。
あなたは次のようなコードを使ってきたのではありませんか: たとえば、`label` プロパティに割り当てられる文字列が常にトリミングされるようにしたい、など。
その仕事を成し遂げるために、あなたは次のようなコードを使おうと思えば使うことも出来ます。
```php ```php
$object->label = trim($label); $object->label = trim($label);
``` ```
上記のコードの欠点は、 `label` プロパティを設定するすべてのコードで、`trim()` を呼び出す必要があるということです。もし将来的に、 上記のコードの欠点は、`label` プロパティを設定するすべてのコードで、`trim()` を呼び出す必要があるということです。
`label` プロパティに、最初の文字を大文字にしなければならない、といった新たな要件が発生したら、 `label` に値を代入するすべてのコードを変更しなければなりません。 もし将来的に、`label` プロパティに、最初の文字を大文字にしなければならない、といった新たな要件が発生したら、
コードの繰り返しはバグを誘発するので、できれば避けたいところです。 `label` に値を代入するすべてのコードを変更しなければなりません。
コードの繰り返しはバグを誘発するので、可能な限り避けたいところです。
この問題を解決するために、Yii は *getter* メソッドと *setter* メソッドをベースにしたプロパティ定義をサポートする、 [[yii\base\BaseObject]] 基底クラスを提供します。 この問題を解決するために、Yii は *getter* メソッドと *setter* メソッドをベースにしたプロパティ定義をサポートする、
クラスがその機能を必要とするなら、 [[yii\base\BaseObject]] またはその子クラスを継承しましょう。 [[yii\base\BaseObject]] 基底クラスを提供しています。
クラスがその機能を必要とするなら、[[yii\base\BaseObject]] またはその子クラスを継承しましょう。
> Note: Yiiのフレームワークのほぼすべてのコア・クラスは、 [[yii\base\BaseObject]] またはその子クラスを継承しています。 > Note: Yiiのフレームワークのほぼすべてのコア・クラスは、 [[yii\base\BaseObject]] またはその子クラスを継承しています。
これは、コア・クラスに getter または setter があれば、それをプロパティのように使用できることを意味します。 これは、コア・クラスに getter または setter があれば、それをプロパティのように使用できることを意味します。
@ -44,11 +47,13 @@ class Foo extends BaseObject
} }
} }
``` ```
詳しく言うと、getter および setter メソッドは、この場合には、内部的に `_label` と名付けられた private 属性を参照する `label` プロパティを作っています。
詳しく言うと、getter および setter メソッドは、この場合には、内部的に `_label` と名付けられた private な属性を参照する
`label` というプロパティを作っています。
getter と setter によって定義されたプロパティは、クラスのメンバ変数のように使用することができます。主な違いは、 getter と setter によって定義されたプロパティは、クラスのメンバ変数のように使用することができます。主な違いは、
それらのプロパティが読み取りアクセスされるときは、対応する getter ソッドが呼び出されることであり、プロパティに値が割り当てられるときには、 それらのプロパティが読み取りアクセスされるときは、対応する getter ソッドが呼び出されることであり、プロパティに値が割り当てられるときには、
対応する setter メソッドが呼び出されるということです。例: 対応する setter メソッドが呼び出されるということです。例えば、
```php ```php
// $label = $object->getLabel(); と同じ // $label = $object->getLabel(); と同じ
@ -60,7 +65,8 @@ $object->label = 'abc';
setter なしの getter で定義されたプロパティは、 *読み取り専用* です。そのようなプロパティに値を代入しようとすると、 setter なしの getter で定義されたプロパティは、 *読み取り専用* です。そのようなプロパティに値を代入しようとすると、
[[yii\base\InvalidCallException|InvalidCallException]] が発生します。同様に、getter なしの setter で定義されたプロパティは、 [[yii\base\InvalidCallException|InvalidCallException]] が発生します。同様に、getter なしの setter で定義されたプロパティは、
*書き込み専用* で、そのようなプロパティを読み取りしようとしても、例外が発生します。書き込み専用のプロパティを持つのは一般的ではありませんが。 *書き込み専用* で、そのようなプロパティを読み取りしようとしても、例外が発生します。
書き込み専用のプロパティを持つのは一般的ではありませんが。
getter と setter で定義されたプロパティには、いくつかの特別なルールと制限があります: getter と setter で定義されたプロパティには、いくつかの特別なルールと制限があります:
@ -69,11 +75,12 @@ getter と setter で定義されたプロパティには、いくつかの特
* この種のプロパティの名前と、クラスのメンバ変数の名前とが同じである場合、後者が優先されます。 * この種のプロパティの名前と、クラスのメンバ変数の名前とが同じである場合、後者が優先されます。
たとえば、上記の `Foo` クラスがメンバ変数 `label` を持っている場合は、`$object->label = 'abc'` たとえば、上記の `Foo` クラスがメンバ変数 `label` を持っている場合は、`$object->label = 'abc'`
という代入は *メンバ変数の* `label` に作用することになります。その行から `setLabel()` setter メソッドは呼び出されません。 という代入は *メンバ変数の* `label` に作用することになります。その行から `setLabel()` setter メソッドは呼び出されません。
* これらのプロパティは可視性をサポートしていません。プロパティが public、protected、private であるかどうかを、 * これらのプロパティは可視性をサポートしていません。プロパティが public、protected、private であるかどうかを、getter または setter メソッドの定義によって決めることは出来ません。
getter または setter メソッドの定義によって決めることは出来ません。
* プロパティは、 *静的でない* getter および setter によってのみ定義することが出来ます。静的なメソッドは同様には扱われません。 * プロパティは、 *静的でない* getter および setter によってのみ定義することが出来ます。静的なメソッドは同様には扱われません。
* 通常の `property_exists()` の呼び出しでは、マジック・プロパティが存在するかどうかを知ることは出来ません。 * 通常の `property_exists()` の呼び出しでは、マジック・プロパティが存在するかどうかを知ることは出来ません。
それぞれ、[[yii\base\BaseObject::canGetProperty()|canGetProperty()]] または [[yii\base\BaseObject::canSetProperty()|canSetProperty()]] を呼び出さなければなりません。 それぞれ、[[yii\base\BaseObject::canGetProperty()|canGetProperty()]] または [[yii\base\BaseObject::canSetProperty()|canSetProperty()]] を呼び出さなければなりません。
このガイドの冒頭で説明した問題に戻ると、 `label` に値が代入されているあらゆる箇所で `trim()` を呼ぶのではなく、もう `setLabel()` という setter の内部だけで `trim()` を呼べば済むのです。 このガイドの冒頭で説明した問題に戻ると、 `label` に値が代入されているあらゆる箇所で `trim()` を呼ぶのではなく、
さらに、新しい要求でラベルの先頭を大文字にする必要が発生しても、他のいっさいのコードに触れることなく、すぐに `setLabel()` メソッドを変更することができます。一箇所の変更は、すべての `label` への代入に普遍的に作用します。 もう `setLabel()` という setter の内部だけで `trim()` を呼べば済むのです。
さらに、新しい要求でラベルの先頭を大文字にする必要が発生しても、他のいっさいのコードに触れることなく、
すぐに `setLabel()` メソッドを変更することができます。一箇所の変更は、すべての `label` への代入に普遍的に作用します。

21
docs/guide-ja/concept-service-locator.md

@ -7,11 +7,12 @@
Yii では、サービス・ロケータは単純に [[yii\di\ServiceLocator]] のインスタンス、またはその子クラスのインスタンスです。 Yii では、サービス・ロケータは単純に [[yii\di\ServiceLocator]] のインスタンス、またはその子クラスのインスタンスです。
Yii の中で最も一般的に使用されるサービス・ロケータは、`\Yii::$app` を通じてアクセスできる *アプリケーション*・オブジェクトです。これが提供するサービスは、 *アプリケーション・コンポーネント* と呼ばれる `request` Yii の中で最も一般的に使用されるサービス・ロケータは、`\Yii::$app` を通じてアクセスできる *アプリケーション*・オブジェクトです。
これが提供するサービスは、 *アプリケーション・コンポーネント* と呼ばれる `request`
`response``urlManager` などのコンポーネントです。あなたはサービス・ロケータによって提供される機能を通じて、 `response``urlManager` などのコンポーネントです。あなたはサービス・ロケータによって提供される機能を通じて、
簡単に、これらのコンポーネントを構成、あるいは独自の実装に置き換え、といったことができます。 簡単に、これらのコンポーネントを構成、あるいは独自の実装に置き換え、といったことができます。
アプリケーション・オブジェクトの他に、各モジュール・オブジェクトもまたサービス・ロケータです。 モジュールは [ツリー走査](#tree-traversal) を実装しています。 アプリケーション・オブジェクトの他に、各モジュール・オブジェクトもまたサービス・ロケータです。モジュールは [ツリー走査](#tree-traversal) を実装しています。
サービス・ロケータを使用する最初のステップは、コンポーネントを登録することです。コンポーネントは、 [[yii\di\ServiceLocator::set()]] サービス・ロケータを使用する最初のステップは、コンポーネントを登録することです。コンポーネントは、 [[yii\di\ServiceLocator::set()]]
を通じて登録することができます。次のコードは、コンポーネントを登録するさまざまな方法を示しています。 を通じて登録することができます。次のコードは、コンポーネントを登録するさまざまな方法を示しています。
@ -42,7 +43,7 @@ $locator->set('search', function () {
$locator->set('pageCache', new FileCache); $locator->set('pageCache', new FileCache);
``` ```
いったんコンポーネントが登録されたら、次の 2 つの方法のいずれかで、その ID を使ってそれにアクセスすることができます: いったんコンポーネントが登録されたら、次のつの方法のいずれかで、その ID を使ってそれにアクセスすることができます:
```php ```php
$cache = $locator->get('cache'); $cache = $locator->get('cache');
@ -50,17 +51,20 @@ $cache = $locator->get('cache');
$cache = $locator->cache; $cache = $locator->cache;
``` ```
上記のように、 [[yii\di\ServiceLocator]] を使うと、コンポーネント ID を使用して、プロパティのようにコンポーネントにアクセスすることができます。 上記のように、[[yii\di\ServiceLocator]] を使うと、コンポーネント ID を使用して、プロパティのようにコンポーネントにアクセスすることができます。
あなたが最初にコンポーネントにアクセスしたとき、 [[yii\di\ServiceLocator]] はコンポーネントの登録情報を使用してコンポーネントの新しいインスタンスを作成し、 あなたが最初にコンポーネントにアクセスしたとき、[[yii\di\ServiceLocator]] は
コンポーネントの登録情報を使用してコンポーネントの新しいインスタンスを作成し、
それを返します。後でそのコンポーネントが再度アクセスされた場合、サービス・ロケータは同じインスタンスを返します。 それを返します。後でそのコンポーネントが再度アクセスされた場合、サービス・ロケータは同じインスタンスを返します。
[[yii\di\ServiceLocator::has()]] を使って、コンポーネント ID がすでに登録されているかをチェックできます。 [[yii\di\ServiceLocator::has()]] を使って、コンポーネント ID がすでに登録されているかをチェックできます。
無効な ID で [[yii\di\ServiceLocator::get()]] を呼び出した場合、例外がスローされます。 無効な ID で [[yii\di\ServiceLocator::get()]] を呼び出した場合、例外が投げられます。
サービス・ロケータは多くの場合、 [構成情報](concept-configurations.md) で作成されるため、 サービス・ロケータは多くの場合、 [構成情報](concept-configurations.md) で作成されるため、
[[yii\di\ServiceLocator::setComponents()|components]] という名前の書き込み可能プロパティが提供されています。 [[yii\di\ServiceLocator::setComponents()|components]] という名前の書き込み可能プロパティが提供されています。
これで一度に複数のコンポーネントを設定して登録することができます。 これで一度に複数のコンポーネントを設定して登録することができます。
次のコードは、サービス・ロケータ (例えば [アプリケーション](structure-applications.md)) を `db`、`cache`、`tz`、`search` コンポーネントとともに構成するための構成情報配列を示しています。 次のコードは、サービス・ロケータ (例えば [アプリケーション](structure-applications.md)) を
`db`、`cache`、`tz`、`search` コンポーネントとともに構成するための構成情報配列を示しています。
```php ```php
return [ return [
@ -86,7 +90,8 @@ return [
``` ```
上記において、`search` コンポーネントを構成する別の方法があります。 上記において、`search` コンポーネントを構成する別の方法があります。
`SolrService` のインスタンスを構築する PHP コールバックを直接に書く代りに、下記のように、そういうコールバックを返すスタティックなクラス・メソッドを使うことが出来ます。 `SolrService` のインスタンスを構築する PHP コールバックを直接に書く代りに、
下記のように、そういうコールバックを返すスタティックなクラス・メソッドを使うことが出来ます。
```php ```php
class SolrServiceBuilder class SolrServiceBuilder

Loading…
Cancel
Save