Browse Source

Adding French translation of structure-modules.md [skip ci] (#12153)

* Corrections dans concept-aliases.md version fr

* Some correction in intro-upgrade-from.md French version

* some corrections in start-databases.md French version

* added translation of structure-applications.md  French version

* adding source change in translation of concept-alias.md

* adding source change in translation of intro-upgrade-from-v1.md

* adding French translation of structure-modules.md [skip ci]

* some typos in French translation of structure-modules.md [skip ci]
tags/2.0.10
jaaf 8 years ago committed by Alexander Makarov
parent
commit
46a41ac8fd
  1. 225
      docs/guide-fr/structure-modules.md
  2. 281
      docs/guide/structure-modules.md

225
docs/guide-fr/structure-modules.md

@ -0,0 +1,225 @@
Modules
=======
Les modules sont des unités logicielles auto-suffisantes constituées de [modèles](structure-models.md), [vues](structure-views.md),
[contrôleurs](structure-controllers.md) et autres composants de prise en charge. L'utilisateur final peut accéder aux contrôleurs dans un module lorsqu'il est installé dans une [application](structure-applications.md). Pour ces raisons, les modules sont souvent regardés comme de mini-applications. Les modules diffèrent des [applications](structure-applications.md) par le fait que les modules ne peuvent être déployés seuls et doivent résider dans une application.
## Création de modules <span id="creating-modules"></span>
Un module est organisé comme un dossier qui est appelé le [[yii\base\Module::basePath|dossier de base (*basePath*)]] du module. Dans ce dossier, se trouvent des sous-dossiers, tels que `controllers`, `models` et `views`, qui contiennent les contrôleurs, les modèles , les vues et d'autres parties de code, juste comme une application. L'exemple suivant présente le contenu d'un module :
```
forum/
Module.php le fichier de classe du module
controllers/ contient les fichiers de classe des contrôleurs
DefaultController.php le fichier de classe de contrôleur par défaut
models/ contient les fichiers de classe des modèles
views/ contient les fichiers de contrôleur, de vue et de disposition
layouts/ contient les fichiers de diposition
default/ contient les fichiers de vues pour le contrôleur par défaut
index.php le fichier de vue index
```
### Classes de module <span id="module-classes"></span>
Chacun des modules doit avoir une classe unique de module qui étend [[yii\base\Module]]. La classe doit être située directement dans le [[yii\base\Module::basePath|dossier de base]] du module et doit être [auto-chargeable](concept-autoloading.md). Quand un module est accédé, une instance unique de la classe de module correspondante est créée. Comme les [instances d'application](structure-applications.md), les instances de module sont utilisées pour partager des données et des composants.
L'exemple suivant montre à quoi une classe de module peut ressembler :
```php
namespace app\modules\forum;
class Module extends \yii\base\Module
{
public function init()
{
parent::init();
$this->params['foo'] = 'bar';
// ... other initialization code ...
}
}
```
La méthode `init()` contient un code volumineux pour initialiser les propriétés du module. Vous pouvez également les sauvegarder sous forme de [configuration](concept-configurations.md) et charger cette configuration avec le code suivant dans la méthode `init()`:
```php
public function init()
{
parent::init();
// initialise le module à partir de la configuration chargée depuis config.php
\Yii::configure($this, require(__DIR__ . '/config.php'));
}
```
où le fichier de configuration `config.php` peut avoir le contenu suivant, similaire à celui d'une [configuration d'application](structure-applications.md#application-configurations).
```php
<?php
return [
'components' => [
// liste des configurations de composant
],
'params' => [
// liste des paramètres
],
];
```
### Contrôleurs dans les modules <span id="controllers-in-modules"></span>
Lorsque vous créez des contrôleurs dans un module, une convention est de placer les classes de contrôleur dans le sous-espace de noms `controllers` dans l'espace de noms de la classe du module. Cela signifie également que les fichiers de classe des contrôleur doivent être placés dans le dossier `controllers` dans le [[yii\base\Module::basePath|dossier de base]] du module. Par exemple, pour créer un contrôleur `post` dans le module `forum` présenté dans la section précédente, vous devez déclarer la classe de contrôleur comme ceci :
```php
namespace app\modules\forum\controllers;
use yii\web\Controller;
class PostController extends Controller
{
// ...
}
```
Vous pouvez personnaliser l'espace de noms des classes de contrôleur en configurant la propriété [[yii\base\Module::controllerNamespace]]. Dans le cas où certains contrôleurs sont en dehors de cet espace de noms, vous pouvez les rendre accessibles en configurant la propriété [[yii\base\Module::controllerMap]] comme vous le feriez dans une [application](structure-applications.md#controllerMap).
### Vues dans les modules <span id="views-in-modules"></span>
Les vues dans les modules doivent être placées dans le dossier `views` du [[yii\base\Module::basePath|dossier de base (*base path*)]] du module. Quant aux vues rendues par un contrôleur du module, elles doivent être placées dans le dossier `views/ControllerID`, où `ControllerID` fait référence à l'[identifiant du contrôleur](structure-controllers.md#routes). Par exemple, si la classe du contrôleur est `PostController`, le dossier doit être `views/post` dans le [[yii\base\Module::basePath|dossier de base]] du module.
Un module peut spécifier une [disposition](structure-views.md#layouts) qui s'applique aux vues rendues par les contrôleurs du module. La disposition doit être mise dans le dossier `views/layouts` par défaut, et vous devez configurer la propriété [[yii\base\Module::layout]] pour qu'elle pointe sur le nom de la disposition. Si vous ne configurez pas la propriété `layout` c'est la disposition de l'application qui est utilisée à sa place.
### Commande de console dans les modules <span id="console-commands-in-modules"></span>
Votre module peut aussi déclarer des commandes, qui sont accessibles via le mode [Console](tutorial-console.md).
Afin que l'utilitaire de ligne de commande reconnaisse vos commandes, vous devez changer la propriété [[yii\base\Module::controllerNamespace (espace de noms du contrôleur)]] lorsque Yii est exécuté en mode console, et le diriger sur votre espace de noms de commandes.
Une manière de réaliser cela est de tester le type d'instance de l'application Yii dans la méthode `init` du module :
```php
public function init()
{
parent::init();
if (Yii::$app instanceof \yii\console\Application) {
$this->controllerNamespace = 'app\modules\forum\commands';
}
}
```
Vos commandes seront disponibles en ligne de commande en utilisant la route suivante :
```
yii <module_id>/<command>/<sub_command>
```
## Utilisation des modules <span id="using-modules"></span>
Pour utiliser un module dans une application, il vous suffit de configurer l'application en listant le module dans la propriété [[yii\base\Application::modules|modules]] de l'application. Le code qui suit dans la [configuration de l'application](structure-applications.md#application-configurations) permet l'utilisation du module `forum` :
```php
[
'modules' => [
'forum' => [
'class' => 'app\modules\forum\Module',
// ... autres éléments de configuration pour le module ...
],
],
]
```
La propriété [[yii\base\Application::modules|modules]] accepte un tableau de configurations de module. Chaque clé du tableau représente un *identifiant de module* qui distingue ce module parmi les autres modules de l'application, et la valeur correspondante est une [configuration](concept-configurations.md) pour la création du module.
### Routes <span id="routes"></span>
Les [routes](structure-controllers.md#routes) sont utilisées pour accéder aux contrôleurs d'un module comme elles le sont pour accéder aux contrôleurs d'une application. Une route pour un contrôleur d'un module doit commencer par l'identifiant du module, suivi de l'[identifiant du contrôleur](structure-controllers.md#controller-ids) et de [identifiant de l'action](structure-controllers.md#action-ids). Par exemple, si une application utilise un module nommé `forum`, alors la route `forum/post/index` représente l'action `index` du contrôleur `post` du module. Si la route ne contient que l'identifiant du module, alors la propriété [[yii\base\Module::defaultRoute]], dont la valeur par défaut est `default`, détermine quel contrôleur/action utiliser. Cela signifie que la route `forum` représente le contrôleur `default` dans le module `forum`.
### Accès aux modules <span id="accessing-modules"></span>
Dans un module, souvent, il arrive que vous ayez besoin d'une instance de la [classe du module](#module-classes) de façon à pouvoir accéder à l'identifiant du module, à ses paramètres, à ses composants, etc. Vous pouvez le faire en utilisant l'instruction suivante :
```php
$module = MyModuleClass::getInstance();
```
dans laquelle `MyModuleClass` fait référence au nom de la classe du module qui vous intéresse. La méthode `getInstance()` retourne l'instance de la classe du module actuellement requis. Si le module n'est pas requis, la méthode retourne `null`. Notez que vous n'avez pas besoin de créer manuellement une nouvelle instance de la classe du module parce que celle-ci serait différente de celle créée par Yii en réponse à la requête.
> Info: lors du développement d'un module, vous ne devez pas supposer que le module va utiliser un identifiant fixe. Cela tient au fait qu'un module peut être associé à un identifiant arbitraire lorsqu'il est utilisé dans une application ou dans un autre module. Pour obtenir l'identifiant du module, vous devez utiliser l'approche ci-dessus pour obtenir d'abord une instance du module, puis obtenir l'identifiant via `$module->id`.
Vous pouvez aussi accéder à l'instance d'un module en utilisant les approches suivantes :
```php
// obtenir le module fils dont l'identifiant est "forum"
$module = \Yii::$app->getModule('forum');
// obtenir le module auquel le contrôleur actuellement requis appartient
$module = \Yii::$app->controller->module;
```
La première approche n'est utile que lorsque vous connaissez l'identifiant du module, tandis que la seconde est meilleure lorsque vous connaissez le contrôleur actuellement requis.
Une fois que vous disposez de l'instance du module, vous pouvez accéder aux paramètres et aux composants enregistrés avec le module. Par exemple :
```php
$maxPostCount = $module->params['maxPostCount'];
```
### Modules faisant partie du processus d'amorçage <span id="bootstrapping-modules"></span>
Il se peut que certains modules doivent être exécutés pour chacune des requêtes. Le module [[yii\debug\Module|debug]] en est un exemple. Pour que des modules soit exécutés pour chaque requête, vous devez les lister dans la propriété [[yii\base\Application::bootstrap|bootstrap]] de l'application.
Par exemple, la configuration d'application suivante garantit que le module `debug` est chargé à chaque requête :
```php
[
'bootstrap' => [
'debug',
],
'modules' => [
'debug' => 'yii\debug\Module',
],
]
```
## Modules imbriqués <span id="nested-modules"></span>
Les modules peuvent être imbriqués sur un nombre illimité de niveaux. C'est à dire qu'un module pour contenir un autre module qui contient lui-même un autre module. Nous parlons alors de *module parent* pour le module englobant, et de *module enfant* pour le module contenu. Les modules enfants doivent être déclarés dans la propriété [[yii\base\Module::modules|modules]] de leur module parent. Par exemple :
```php
namespace app\modules\forum;
class Module extends \yii\base\Module
{
public function init()
{
parent::init();
$this->modules = [
'admin' => [
// Vous devriez envisager l'utilisation d'un espace de noms plus court ici !
'class' => 'app\modules\forum\modules\admin\Module',
],
];
}
}
```
La route vers un contrôleur inclus dans un module doit inclure les identifiants de tous ses modules ancêtres. Par exemple, la route `forum/admin/dashboard/index` représente l'action `index` du contrôleur `dashboard` dans le module `admin` qui est un module enfant du module `forum`.
> Info: la méthode [[yii\base\Module::getModule()|getModule()]] ne retourne que le module enfant appartenant directement à son parent. La propriété [[yii\base\Application::loadedModules]] tient à jour une liste des modules chargés, y compris les enfant directs et les enfants des générations suivantes, indexée par le nom de classe.
## Meilleures pratiques <span id="best-practices"></span>
L'utilisation des modules est préférable dans les grosses applications dont les fonctionnalités peuvent être réparties en plusieurs groupes, consistant chacun en un jeu de fonctionnalités liées d'assez près. Chacune de ces fonctionnalités peut être conçue comme un module développé et maintenu par un développeur ou une équipe spécifique.
Les modules sont aussi un bon moyen de réutiliser du code au niveau des groupes de fonctionnalités. Quelques fonctionnalité d'usage courant, telles que la gestion des utilisateurs, la gestion des commentaires, etc. peuvent être développées en tant que modules ce qui facilite leur réutilisation dans les projets suivants.

281
docs/guide/structure-modules.md

@ -1,281 +0,0 @@
Modules
=======
Modules are self-contained software units that consist of [models](structure-models.md), [views](structure-views.md),
[controllers](structure-controllers.md), and other supporting components. End users can access the controllers
of a module when it is installed in [application](structure-applications.md). For these reasons, modules are
often viewed as mini-applications. Modules differ from [applications](structure-applications.md) in that
modules cannot be deployed alone and must reside within applications.
## Creating Modules <span id="creating-modules"></span>
A module is organized as a directory which is called the [[yii\base\Module::basePath|base path]] of the module.
Within the directory, there are sub-directories, such as `controllers`, `models`, `views`, which hold controllers,
models, views, and other code, just like in an application. The following example shows the content within a module:
```
forum/
Module.php the module class file
controllers/ containing controller class files
DefaultController.php the default controller class file
models/ containing model class files
views/ containing controller view and layout files
layouts/ containing layout view files
default/ containing view files for DefaultController
index.php the index view file
```
### Module Classes <span id="module-classes"></span>
Each module should have a unique module class which extends from [[yii\base\Module]]. The class should be located
directly under the module's [[yii\base\Module::basePath|base path]] and should be [autoloadable](concept-autoloading.md).
When a module is being accessed, a single instance of the corresponding module class will be created.
Like [application instances](structure-applications.md), module instances are used to share data and components
for code within modules.
The following is an example how a module class may look like:
```php
namespace app\modules\forum;
class Module extends \yii\base\Module
{
public function init()
{
parent::init();
$this->params['foo'] = 'bar';
// ... other initialization code ...
}
}
```
If the `init()` method contains a lot of code initializing the module's properties, you may also save them in terms
of a [configuration](concept-configurations.md) and load it with the following code in `init()`:
```php
public function init()
{
parent::init();
// initialize the module with the configuration loaded from config.php
\Yii::configure($this, require(__DIR__ . '/config.php'));
}
```
where the configuration file `config.php` may contain the following content, similar to that in an
[application configuration](structure-applications.md#application-configurations).
```php
<?php
return [
'components' => [
// list of component configurations
],
'params' => [
// list of parameters
],
];
```
### Controllers in Modules <span id="controllers-in-modules"></span>
When creating controllers in a module, a convention is to put the controller classes under the `controllers`
sub-namespace of the namespace of the module class. This also means the controller class files should be
put in the `controllers` directory within the module's [[yii\base\Module::basePath|base path]].
For example, to create a `post` controller in the `forum` module shown in the last subsection, you should
declare the controller class like the following:
```php
namespace app\modules\forum\controllers;
use yii\web\Controller;
class PostController extends Controller
{
// ...
}
```
You may customize the namespace of controller classes by configuring the [[yii\base\Module::controllerNamespace]]
property. In case some of the controllers are outside of this namespace, you may make them accessible
by configuring the [[yii\base\Module::controllerMap]] property, similar to [what you do in an application](structure-applications.md#controllerMap).
### Views in Modules <span id="views-in-modules"></span>
Views in a module should be put in the `views` directory within the module's [[yii\base\Module::basePath|base path]].
For views rendered by a controller in the module, they should be put under the directory `views/ControllerID`,
where `ControllerID` refers to the [controller ID](structure-controllers.md#routes). For example, if
the controller class is `PostController`, the directory would be `views/post` within the module's
[[yii\base\Module::basePath|base path]].
A module can specify a [layout](structure-views.md#layouts) that is applied to the views rendered by the module's
controllers. The layout should be put in the `views/layouts` directory by default, and you should configure
the [[yii\base\Module::layout]] property to point to the layout name. If you do not configure the `layout` property,
the application's layout will be used instead.
### Console commands in Modules <span id="console-commands-in-modules"></span>
Your module may also declare commands, that will be available through the [Console](tutorial-console.md) mode.
In order for the command line utility to see your commands, you will need to change the [[yii\base\Module::controllerNamespace]]
property, when Yii is executed in the console mode, and point it to your commands namespace.
One way to achieve that is to test the instance type of the Yii application in the module's `init` method:
```php
public function init()
{
parent::init();
if (Yii::$app instanceof \yii\console\Application) {
$this->controllerNamespace = 'app\modules\forum\commands';
}
}
```
Your commands will then be available from the command line using the following route:
```
yii <module_id>/<command>/<sub_command>
```
## Using Modules <span id="using-modules"></span>
To use a module in an application, simply configure the application by listing the module in
the [[yii\base\Application::modules|modules]] property of the application. The following code in the
[application configuration](structure-applications.md#application-configurations) uses the `forum` module:
```php
[
'modules' => [
'forum' => [
'class' => 'app\modules\forum\Module',
// ... other configurations for the module ...
],
],
]
```
The [[yii\base\Application::modules|modules]] property takes an array of module configurations. Each array key
represents a *module ID* which uniquely identifies the module among all modules in the application, and the corresponding
array value is a [configuration](concept-configurations.md) for creating the module.
### Routes <span id="routes"></span>
Like accessing controllers in an application, [routes](structure-controllers.md#routes) are used to address
controllers in a module. A route for a controller within a module must begin with the module ID followed by
the [controller ID](structure-controllers.md#controller-ids) and [action ID](structure-controllers.md#action-ids).
For example, if an application uses a module named `forum`, then the route
`forum/post/index` would represent the `index` action of the `post` controller in the module. If the route
only contains the module ID, then the [[yii\base\Module::defaultRoute]] property, which defaults to `default`,
will determine which controller/action should be used. This means a route `forum` would represent the `default`
controller in the `forum` module.
### Accessing Modules <span id="accessing-modules"></span>
Within a module, you may often need to get the instance of the [module class](#module-classes) so that you can
access the module ID, module parameters, module components, etc. You can do so by using the following statement:
```php
$module = MyModuleClass::getInstance();
```
where `MyModuleClass` refers to the name of the module class that you are interested in. The `getInstance()` method
will return the currently requested instance of the module class. If the module is not requested, the method will
return null. Note that you do not want to manually create a new instance of the module class because it will be
different from the one created by Yii in response to a request.
> Info: When developing a module, you should not assume the module will use a fixed ID. This is because a module
can be associated with an arbitrary ID when used in an application or within another module. In order to get
the module ID, you should use the above approach to get the module instance first, and then get the ID via
`$module->id`.
You may also access the instance of a module using the following approaches:
```php
// get the child module whose ID is "forum"
$module = \Yii::$app->getModule('forum');
// get the module to which the currently requested controller belongs
$module = \Yii::$app->controller->module;
```
The first approach is only useful when you know the module ID, while the second approach is best used when you
know about the controllers being requested.
Once you have the module instance, you can access parameters and components registered with the module. For example,
```php
$maxPostCount = $module->params['maxPostCount'];
```
### Bootstrapping Modules <span id="bootstrapping-modules"></span>
Some modules may need to be run for every request. The [[yii\debug\Module|debug]] module is such an example.
To do so, list the IDs of such modules in the [[yii\base\Application::bootstrap|bootstrap]] property of the application.
For example, the following application configuration makes sure the `debug` module is always loaded:
```php
[
'bootstrap' => [
'debug',
],
'modules' => [
'debug' => 'yii\debug\Module',
],
]
```
## Nested Modules <span id="nested-modules"></span>
Modules can be nested in unlimited levels. That is, a module can contain another module which can contain yet
another module. We call the former *parent module* while the latter *child module*. Child modules must be declared
in the [[yii\base\Module::modules|modules]] property of their parent modules. For example,
```php
namespace app\modules\forum;
class Module extends \yii\base\Module
{
public function init()
{
parent::init();
$this->modules = [
'admin' => [
// you should consider using a shorter namespace here!
'class' => 'app\modules\forum\modules\admin\Module',
],
];
}
}
```
For a controller within a nested module, its route should include the IDs of all its ancestor modules.
For example, the route `forum/admin/dashboard/index` represents the `index` action of the `dashboard` controller
in the `admin` module which is a child module of the `forum` module.
> Info: The [[yii\base\Module::getModule()|getModule()]] method only returns the child module directly belonging
to its parent. The [[yii\base\Application::loadedModules]] property keeps a list of loaded modules, including both
direct children and nested ones, indexed by their class names.
## Best Practices <span id="best-practices"></span>
Modules are best used in large applications whose features can be divided into several groups, each consisting of
a set of closely related features. Each such feature group can be developed as a module which is developed and
maintained by a specific developer or team.
Modules are also a good way of reusing code at the feature group level. Some commonly used features, such as
user management, comment management, can all be developed in terms of modules so that they can be reused easily
in future projects.
Loading…
Cancel
Save