Commit b4cbee17 by Nobuo Kihara

docs/guide-ja/structure-modules.md - revised [ci skip]

parent 3e8b9edc
モジュール モジュール
========== ==========
モジュールは、[モデル](structure-models.md)[ビュー](structure-views.md)[コントローラ](structure-controllers.md) モジュールは、[モデル](structure-models.md)[ビュー](structure-views.md)[コントローラ](structure-controllers.md)、およびその他の支援コンポーネントから構成される自己充足的なソフトウェアのユニットです。
およびその他の支援コンポーネントから構成される自己充足的なソフトウェアのユニットです。 モジュールが [アプリケーション](structure-applications.md) にインストールされている場合、エンドユーザはモジュールのコントローラにアクセスする事が出来ます。
モジュールが [アプリケーション](structure-applications.md) にインストールされている場合、 これらのことを理由として、モジュールは小さなアプリケーションと見なされることがよくあります。
エンドユーザはモジュールのコントローラにアクセスする事が出来ます。これらのことを理由として、 しかし、モジュールは単独では配置できず、アプリケーションの中に存在しなければならないという点で [アプリケーション](structure-applications.md) とは異なります。
モジュールは小さなアプリケーションと見なされることがよくあります。しかし、モジュールは単独では配置できず、
アプリケーションの中に存在しなければならないという点で [アプリケーション](structure-applications.md) とは異なります。
## モジュールを作成する <a name="creating-modules"></a> ## モジュールを作成する <a name="creating-modules"></a>
...@@ -14,7 +12,7 @@ ...@@ -14,7 +12,7 @@
モジュールは、モジュールの [[yii\base\Module::basePath|ベースパス]] と呼ばれるディレクトリとして組織されます。 モジュールは、モジュールの [[yii\base\Module::basePath|ベースパス]] と呼ばれるディレクトリとして組織されます。
このディレクトリの中に、ちょうどアプリケーションの場合と同じように、`controllers``models``views` このディレクトリの中に、ちょうどアプリケーションの場合と同じように、`controllers``models``views`
のようなサブディレクトリが存在して、コントローラ、モデル、ビュー、その他のコードを収納しています。 のようなサブディレクトリが存在して、コントローラ、モデル、ビュー、その他のコードを収納しています。
次の例は、モジュール内の中身を示すものです: 次の例は、モジュール内の中身を示すものです
``` ```
forum/ forum/
...@@ -32,13 +30,11 @@ forum/ ...@@ -32,13 +30,11 @@ forum/
### モジュールクラス <a name="module-classes"></a> ### モジュールクラス <a name="module-classes"></a>
全てのモジュールは [[yii\base\Module]] から拡張したユニークなモジュールクラスを持たなければなりません。 全てのモジュールは [[yii\base\Module]] から拡張したユニークなモジュールクラスを持たなければなりません。
モジュールクラスは、モジュールの [[yii\base\Module::basePath|ベースパス]] 直下に配置されて モジュールクラスは、モジュールの [[yii\base\Module::basePath|ベースパス]] 直下に配置されて [オートロード可能](concept-autoloading.md) になっていなければなりません。
[オートロード可能](concept-autoloading.md) になっていなければなりません。
モジュールがアクセスされたとき、対応するモジュールクラスの単一のインスタンスが作成されます。 モジュールがアクセスされたとき、対応するモジュールクラスの単一のインスタンスが作成されます。
[アプリケーションのインスタンス](structure-applications.md) と同じように、モジュールのインスタンスは [アプリケーションのインスタンス](structure-applications.md) と同じように、モジュールのインスタンスは、モジュール内のコードがデータとコンポーネントを共有するために使用されます。
モジュール内のコードがデータとコンポーネントを共有するために使用されます。
次のコードは、モジュールクラスがどのように見えるかを示す例です: 次のコードは、モジュールクラスがどのように見えるかを示す例です
```php ```php
namespace app\modules\forum; namespace app\modules\forum;
...@@ -55,28 +51,25 @@ class Module extends \yii\base\Module ...@@ -55,28 +51,25 @@ class Module extends \yii\base\Module
} }
``` ```
`init` メソッドがモジュールのプロパティを初期化するためのコードをたくさん含む場合は、それを `init` メソッドがモジュールのプロパティを初期化するためのコードをたくさん含む場合は、
[コンフィギュレーション](concept-configurations.md) の形で保存し、`init()` の中で次のコードを使って それを [構成情報](concept-configurations.md) の形で保存し、`init()` の中で次のコードを使って読み出すことも可能です。
読み出すことも可能です:
```php ```php
public function init() public function init()
{ {
parent::init(); parent::init();
// config.php からロードしたコンフィギュレーションでモジュールを初期化する // config.php からロードした構成情報でモジュールを初期化する
\Yii::configure($this, require(__DIR__ . '/config.php')); \Yii::configure($this, require(__DIR__ . '/config.php'));
} }
``` ```
ここで、コンフィギュレーションファイル `config.php` は、 ここで、構成情報ファイル `config.php` は、[アプリケーションの構成情報](structure-applications.md#application-configurations) の場合と同じように、次のような内容を含むことが出来ます。
[アプリケーションのコンフィギュレーション](structure-applications.md#application-configurations) の場合と同じように、
次のような内容を含むことが出来ます。
```php ```php
<?php <?php
return [ return [
'components' => [ 'components' => [
// コンポーネントのコンフィギュレーションのリスト // コンポーネントの構成情報のリスト
], ],
'params' => [ 'params' => [
// パラメータのリスト // パラメータのリスト
...@@ -87,11 +80,9 @@ return [ ...@@ -87,11 +80,9 @@ return [
### モジュール内のコントローラ <a name="controllers-in-modules"></a> ### モジュール内のコントローラ <a name="controllers-in-modules"></a>
モジュールの中でコントローラを作成するときは、コントローラクラスをモジュールクラスの名前空間の `controllers` モジュールの中でコントローラを作成するときは、コントローラクラスをモジュールクラスの名前空間の `controllers` サブ名前空間に置くことが規約です。
サブ名前空間に置くことが規約です。このことは、同時に、コントローラのクラスファイルをモジュールの このことは、同時に、コントローラのクラスファイルをモジュールの [[yii\base\Module::basePath|ベースパス]] 内の `controllers` ディレクトリに置くべきことをも意味します。
[[yii\base\Module::basePath|ベースパス]] 内の `controllers` ディレクトリに置くべきことをも意味します。 例えば、前の項で示された `forum` モジュールの中で `post` コントローラを作成するためには、次のようにしてコントローラを宣言しなければなりません。
例えば、前の項で示された `forum` モジュールの中で `post` コントローラを作成するためには、次のようにして
コントローラを宣言しなければなりません:
```php ```php
namespace app\modules\forum\controllers; namespace app\modules\forum\controllers;
...@@ -105,78 +96,72 @@ class PostController extends Controller ...@@ -105,78 +96,72 @@ class PostController extends Controller
``` ```
コントローラクラスの名前空間は、[[yii\base\Module::controllerNamespace]] プロパティを構成してカスタマイズすることが出来ます。 コントローラクラスの名前空間は、[[yii\base\Module::controllerNamespace]] プロパティを構成してカスタマイズすることが出来ます。
いくつかのコントローラがこの名前空間の外にある場合でも、[[yii\base\Module::controllerMap]] プロパティを構成することによって、 いくつかのコントローラがこの名前空間の外にある場合でも、[[yii\base\Module::controllerMap]] プロパティを構成することによって、それらをアクセス可能にすることが出来ます。
それらをアクセス可能にすることが出来ます。これは、[アプリケーションでのコントローラマップ](structure-applications.md#controller-map) これは、[アプリケーションでのコントローラマップ](structure-applications.md#controller-map) の場合と同様です。
の場合と同様です。
### モジュール内のビュー <a name="views-in-modules"></a> ### モジュール内のビュー <a name="views-in-modules"></a>
モジュール内のビューは、モジュールの [[yii\base\Module::basePath|ベースパス]] 内の `views` ディレクトリに置かれなくてはなりません。 モジュール内のビューは、モジュールの [[yii\base\Module::basePath|ベースパス]] 内の `views` ディレクトリに置かれなくてはなりません。
モジュール内のコントローラによってレンダリングされるビューは、ディレクトリ `views/ControllerID` の下に置きます。ここで、 モジュール内のコントローラによってレンダリングされるビューは、ディレクトリ `views/ControllerID` の下に置きます。
`ControllerID`[コントローラ ID](structure-controllers.md#routes) を指します。例えば、コントローラクラスが `PostController` ここで、`ControllerID`[コントローラ ID](structure-controllers.md#routes) を指します。
である場合、ディレクトリはモジュールの [[yii\base\Module::basePath|ベースパス]] の中の `views/post` となります。 例えば、コントローラクラスが `PostController` である場合、ディレクトリはモジュールの [[yii\base\Module::basePath|ベースパス]] の中の `views/post` となります。
モジュールは、そのモジュールのコントローラによってレンダリングされるビューに適用される [レイアウト](structure-views.md#layouts) モジュールは、そのモジュールのコントローラによってレンダリングされるビューに適用される [レイアウト](structure-views.md#layouts) を指定することが出来ます。
を指定することが出来ます。レイアウトは、既定では `views/layouts` ディレクトリに置かれなければならず、また、 レイアウトは、既定では `views/layouts` ディレクトリに置かれなければならず、また、[[yii\base\Module::layout]] プロパティがレイアウトの名前を指すように構成しなければなりません。
[[yii\base\Module::layout]] プロパティがレイアウトの名前を指すように構成しなければなりません。
`layout` プロパティを構成しない場合は、アプリケーションのレイアウトが代りに使用されます。 `layout` プロパティを構成しない場合は、アプリケーションのレイアウトが代りに使用されます。
## モジュールを使う <a name="using-modules"></a> ## モジュールを使う <a name="using-modules"></a>
アプリケーションの中でモジュールを使うためには、アプリケーションの [[yii\base\Application::modules|modules]] プロパティのリストに アプリケーションの中でモジュールを使うためには、アプリケーションの [[yii\base\Application::modules|modules]] プロパティのリストにそのモジュールを載せてアプリケーションを構成するだけで大丈夫です。
そのモジュールを載せてアプリケーションを構成するだけで大丈夫です。次のコードは、 次のコードは、[アプリケーションの構成情報](structure-applications.md#application-configurations) の中で `forum` モジュールを使うようにするものです。
[アプリケーションのコンフィギュレーション](structure-applications.md#application-configurations) の中で
`forum` モジュールを使うようにするものです:
```php ```php
[ [
'modules' => [ 'modules' => [
'forum' => [ 'forum' => [
'class' => 'app\modules\forum\Module', 'class' => 'app\modules\forum\Module',
// ... モジュールのその他のコンフィギュレーション ... // ... モジュールのその他の構成情報 ...
], ],
], ],
] ]
``` ```
[[yii\base\Application::modules|modules]] プロパティは、モジュールのコンフィギュレーションの配列を取ります。各配列のキーは、 [[yii\base\Application::modules|modules]] プロパティは、モジュールの構成情報の配列を取ります。
アプリケーションの全てのモジュールの中でそのモジュールを特定するためのユニークな *モジュール ID* を表します。そして、 各配列のキーは、アプリケーションの全てのモジュールの中でそのモジュールを特定するためのユニークな *モジュール ID* を表します。
対応する配列の値は、そのモジュールを作成するための [コンフィギュレーション](concept-configurations.md) です。 そして、対応する配列の値は、そのモジュールを作成するための [構成情報](concept-configurations.md) です。
### ルート <a name="routes"></a> ### ルート <a name="routes"></a>
アプリケーションの中のコントローラをアクセスするのと同じように、[ルート](structure-controllers.md#routes) アプリケーションの中のコントローラをアクセスするのと同じように、[ルート](structure-controllers.md#routes) がモジュールの中のコントローラを指し示すために使われます。
がモジュールの中のコントローラを指し示すために使われます。モジュール内のコントローラのルートは、モジュール ID で始まり、 モジュール内のコントローラのルートは、モジュール ID で始まり、コントローラ ID、アクション ID と続くものでなければなりません。
コントローラ ID、アクション ID と続くものでなければなりません。例えば、アプリケーションが `forum` という名前のモジュールを 例えば、アプリケーションが `forum` という名前のモジュールを使用している場合、`forum/post/index` というルートは、`forum` モジュール内の `post` コントローラの `index` アクションを表します。
使用している場合、`forum/post/index` というルートは、`forum` モジュール内の `post` コントローラの `index` アクションを表します。 ルートがモジュール ID だけを含む場合は、[[yii\base\Module::defaultRoute]] プロパティ (既定値は `default` です) が、どのコントローラ/アクションが使用されるべきかを決定します。
ルートがモジュール ID だけを含む場合は、[[yii\base\Module::defaultRoute]] プロパティ (その既定値は `default` です) が、 これは、`forum` というルートは `forum` モジュール内の `default` コントローラを表すという意味です。
どのコントローラ/アクションが使用されるべきかを決定します。これは、`forum` というルートは `forum` モジュール内の
`default` コントローラを表すという意味です。
### モジュールにアクセスする <a name="accessing-modules"></a> ### モジュールにアクセスする <a name="accessing-modules"></a>
モジュール内において、モジュール ID や、モジュールのパラメータ、モジュールのコンポーネントなどにアクセスするために、 モジュール内において、モジュール ID や、モジュールのパラメータ、モジュールのコンポーネントなどにアクセスするために、[モジュールクラス](#module-classes) のインスタンスを取得する必要があることがよくあります。
[モジュールクラス](#module-classes) のインスタンスを取得する必要があることがよくあります。次の文を使ってそうすることが出来ます: 次の文を使ってそうすることが出来ます。
```php ```php
$module = MyModuleClass::getInstance(); $module = MyModuleClass::getInstance();
``` ```
ここで `MyModuleClass` は、関心を持っているモジュールクラスの名前を指します。`getInstance()` メソッドは、 ここで `MyModuleClass` は、関心を持っているモジュールクラスの名前を指します。
現在リクエストされているモジュールクラスのインスタンスを返します。モジュールがリクエストされていない場合は、 `getInstance()` メソッドは、現在リクエストされているモジュールクラスのインスタンスを返します。
このメソッドは null を返します。モジュールクラスの新しいインスタンスを手動で作成しようとしてはいけないことに注意してください。 モジュールがリクエストされていない場合は、このメソッドは null を返します。
モジュールクラスの新しいインスタンスを手動で作成しようとしてはいけないことに注意してください。
そのインスタンスは、リクエストに対するレスポンスとして Yii によって作成されたインスタンスとは別のものになります。 そのインスタンスは、リクエストに対するレスポンスとして Yii によって作成されたインスタンスとは別のものになります。
> Info|情報: モジュールを開発するとき、モジュールが固定の ID を使うと仮定してはいけません。なぜなら、モジュールは、 > Info|情報: モジュールを開発するとき、モジュールが固定の ID を使うと仮定してはいけません。
アプリケーションや他のモジュールの中で使うときに、任意の ID と結び付けることが出来るからです。 なぜなら、モジュールは、アプリケーションや他のモジュールの中で使うときに、任意の ID と結び付けることが出来るからです。
モジュール ID を取得するためには、上記の方法を使って最初にモジュールのインスタンスを取得し、そして `$module->id` モジュール ID を取得するためには、上記の方法を使って最初にモジュールのインスタンスを取得し、そして `$module->id` によって ID を取得しなければなりません。
によって ID を取得しなければなりません。
モジュールのインスタンスにアクセスするためには、次の二つの方法を使うことも出来ます: モジュールのインスタンスにアクセスするためには、次の二つの方法を使うことも出来ます
```php ```php
// ID が "forum" である子モジュールを取得する // ID が "forum" である子モジュールを取得する
...@@ -186,8 +171,7 @@ $module = \Yii::$app->getModule('forum'); ...@@ -186,8 +171,7 @@ $module = \Yii::$app->getModule('forum');
$module = \Yii::$app->controller->module; $module = \Yii::$app->controller->module;
``` ```
最初の方法は、モジュール ID を知っている時しか役に立ちません。一方、第二の方法は、 最初の方法は、モジュール ID を知っている時しか役に立ちません。一方、第二の方法は、リクエストされているコントローラについて知っている場合に使うのに最適な方法です。
リクエストされているコントローラについて知っている場合に使うのに最適な方法です。
いったんモジュールのインスタンスをとらえれば、モジュールに登録されたパラメータやコンポーネントにアクセスすることが可能になります。 いったんモジュールのインスタンスをとらえれば、モジュールに登録されたパラメータやコンポーネントにアクセスすることが可能になります。
例えば、 例えば、
...@@ -202,7 +186,7 @@ $maxPostCount = $module->params['maxPostCount']; ...@@ -202,7 +186,7 @@ $maxPostCount = $module->params['maxPostCount'];
いくつかのモジュールは、全てのリクエストで毎回走らせる必要があります。[[yii\debug\Module|デバッグ]] モジュールがその一例です。 いくつかのモジュールは、全てのリクエストで毎回走らせる必要があります。[[yii\debug\Module|デバッグ]] モジュールがその一例です。
そうするためには、そのようなモジュールをアプリケーションの [[yii\base\Application::bootstrap|bootstrap]] プロパティのリストに挙げます。 そうするためには、そのようなモジュールをアプリケーションの [[yii\base\Application::bootstrap|bootstrap]] プロパティのリストに挙げます。
例えば、次のアプリケーションのコンフィギュレーションは、`debug` モジュールが常にロードされることを保証するものです: 例えば、次のアプリケーションの構成情報は、`debug` モジュールが常にロードされることを保証するものです。
```php ```php
[ [
...@@ -219,9 +203,10 @@ $maxPostCount = $module->params['maxPostCount']; ...@@ -219,9 +203,10 @@ $maxPostCount = $module->params['maxPostCount'];
## 入れ子のモジュール <a name="nested-modules"></a> ## 入れ子のモジュール <a name="nested-modules"></a>
モジュールはレベルの制限無く入れ子にすることが出来ます。つまり、モジュールは別のモジュールを含むことが出来、 モジュールはレベルの制限無く入れ子にすることが出来ます。
その含まれたモジュールもさらに別のモジュールを含むことが出来ます。含む側を *親モジュール*、含まれる側を *子モジュール* つまり、モジュールは別のモジュールを含むことが出来、その含まれたモジュールもさらに別のモジュールを含むことが出来ます。
と呼びます。子モジュールは、親モジュールの [[yii\base\Module::modules|modules]] プロパティの中で宣言されなければなりません。 含む側を *親モジュール*、含まれる側を *子モジュール* と呼びます。
子モジュールは、親モジュールの [[yii\base\Module::modules|modules]] プロパティの中で宣言されなければなりません。
例えば、 例えば、
```php ```php
...@@ -244,8 +229,7 @@ class Module extends \yii\base\Module ...@@ -244,8 +229,7 @@ class Module extends \yii\base\Module
``` ```
入れ子にされたモジュールの中にあるコントローラのルートは、全ての祖先のモジュールの ID を含まなければなりません。 入れ子にされたモジュールの中にあるコントローラのルートは、全ての祖先のモジュールの ID を含まなければなりません。
例えば、`forum/admin/dashboard/index` というルートは、`forum` モジュールの子モジュールである `admin` モジュールの 例えば、`forum/admin/dashboard/index` というルートは、`forum` モジュールの子モジュールである `admin` モジュールの `dashboard` コントローラの `index` アクションを表します。
`dashboard` コントローラの `index` アクションを表します。
> Info|情報: [[yii\base\Module::getModule()|getModule()]] メソッドは、親モジュールに直接属する子モジュールだけを返します。 > Info|情報: [[yii\base\Module::getModule()|getModule()]] メソッドは、親モジュールに直接属する子モジュールだけを返します。
[[yii\base\Application::loadedModules]] プロパティがロードされた全てのモジュールのリストを保持しています。 [[yii\base\Application::loadedModules]] プロパティがロードされた全てのモジュールのリストを保持しています。
...@@ -254,9 +238,8 @@ class Module extends \yii\base\Module ...@@ -254,9 +238,8 @@ class Module extends \yii\base\Module
## 最善の慣行 <a name="best-practices"></a> ## 最善の慣行 <a name="best-practices"></a>
モジュールは、それぞれ密接に関係する一連の機能を含む数個のグループに分割できるような、規模の大きなアプリケーションに モジュールは、それぞれ密接に関係する一連の機能を含む数個のグループに分割できるような、規模の大きなアプリケーションに最も適しています。
最も適しています。そのような機能グループをそれぞれモジュールとして、特定の個人やチームによって開発することが出来ます。 そのような機能グループをそれぞれモジュールとして、特定の個人やチームによって開発することが出来ます。
モジュールは、また、機能グループレベルでコードを再利用するための良い方法でもあります。ある種のよく使われる機能、 モジュールは、また、機能グループレベルでコードを再利用するための良い方法でもあります。
例えばユーザ管理やコメント管理などは、全て、将来のプロジェクトで容易に再利用できるように、モジュールの形式で ある種のよく使われる機能、例えばユーザ管理やコメント管理などは、全て、将来のプロジェクトで容易に再利用できるように、モジュールの形式で開発することが出来ます。
開発することが出来ます。
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment