Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
Y
yii2
Project
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
PSDI Army
yii2
Commits
b4cbee17
Commit
b4cbee17
authored
Nov 29, 2014
by
Nobuo Kihara
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
docs/guide-ja/structure-modules.md - revised [ci skip]
parent
3e8b9edc
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
55 additions
and
72 deletions
+55
-72
structure-modules.md
docs/guide-ja/structure-modules.md
+55
-72
No files found.
docs/guide-ja/structure-modules.md
View file @
b4cbee17
モジュール
モジュール
==========
==========
モジュールは、
[
モデル
](
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>
モジュールは、それぞれ密接に関係する一連の機能を含む数個のグループに分割できるような、規模の大きなアプリケーションに
モジュールは、それぞれ密接に関係する一連の機能を含む数個のグループに分割できるような、規模の大きなアプリケーションに
最も適しています。
最も適しています。
そのような機能グループをそれぞれモジュールとして、特定の個人やチームによって開発することが出来ます。
そのような機能グループをそれぞれモジュールとして、特定の個人やチームによって開発することが出来ます。
モジュールは、また、機能グループレベルでコードを再利用するための良い方法でもあります。ある種のよく使われる機能、
モジュールは、また、機能グループレベルでコードを再利用するための良い方法でもあります。
例えばユーザ管理やコメント管理などは、全て、将来のプロジェクトで容易に再利用できるように、モジュールの形式で
ある種のよく使われる機能、例えばユーザ管理やコメント管理などは、全て、将来のプロジェクトで容易に再利用できるように、モジュールの形式で開発することが出来ます。
開発することが出来ます。
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment