Yii模块(Modules)

模块是一个有自己的模型,视图,控制器以及其它模块的实体。这实际上是在应用程序内的应用程序。

第1步- 在你的项目根目录内创建一个 modules 文件夹。在 modules 文件夹内创建一个名为 admin 的文件夹。这是 admin 模块的基本文件夹。

第2步 - 在 admin 文件夹里边,使用以下代码来创建 Admin.php 文件。
<?php
   namespace app\modules\admin;
   class Admin extends \yii\base\Module {
      public function init() {
         parent::init();
      }
   }
?> 

我们刚刚创建了一个模块类。它位于模块根路径下。每一次模块被访问时,将创建对应的模块类的一个实例。init()函数用于初始化模块的属性。

第3步 - 现在,在 admin文件夹内添加两个目录- controllers 和 views。添加 CustomController.php 文件到控制器的文件夹中。

<?php
   namespace app\modules\admin\controllers;
   use yii\web\Controller;
   class CustomController extends Controller {
      public function actionGreet() {
         return $this->render('greet');
      }
   }
?> 

当创建一个模块,惯例是把控制器类到模块根路径的 controllers 目录。我们刚才定义的actionGreet函数,只返回一个 greet 视图。

在模块中视图应该放在模块基本路径的 views 文件夹中。如果视图是由控制器呈现,那么它们应位于对应于该控制器ID的文件夹中。将 custom 文件夹添加到 views 文件夹。

第4步 - 在 custom 目录里创建一个名为 greet.php 文件并使用下面的代码。
<h1>Hello,这是一个自定义模块!</h1> 

我们刚刚创建了 actionGreet 视图。要在模块中使用这个新创建文件,我们还应该配置应用程序。我们应该将模块添加到应用程序的模块属性中。

第5步 - 修改 config/web.php 文件,如下。
<?php
   $params = require(__DIR__ . '/params.php');
   $config = [
      'id' => 'basic',
      'basePath' => dirname(__DIR__),
      'bootstrap' => ['log'],
      'components' => [
         'request' => [
            // !!! insert a secret key in the following (if it is empty) - this is
               //required by cookie validation
            'cookieValidationKey' => 'Yia-xuhuhu.com',
         ],
         'cache' => [
            'class' => 'yii\caching\FileCache',
         ],
         'user' => [
            'identityClass' => 'app\models\User',
            'enableAutoLogin' => true,
         ],
         'errorHandler' => [
            'errorAction' => 'site/error',
         ],
         'mailer' => [
            'class' => 'yii\swiftmailer\Mailer',
            // send all mails to a file by default. You have to set
            // 'useFileTransport' to false and configure a transport
            // for the mailer to send real emails.
            'useFileTransport' => true,
         ],
         'log' => [
            'traceLevel' => YII_DEBUG ? 3 : 0,
            'targets' => [
               [
                  'class' => 'yii\log\FileTarget',
                  'levels' => ['error', 'warning'],
               ],
            ],
         ],
         'db' => require(__DIR__ . '/db.php'),
      ],
      'modules' => [
         'admin' => [
            'class' => 'app\modules\admin\Admin', 
         ],
      ],
      'params' => $params,
   ];
   if (YII_ENV_DEV) {
      // configuration adjustments for 'dev' environment
      $config['bootstrap'][] = 'debug';
      $config['modules']['debug'] = [
         'class' => 'yii\debug\Module',
      ];
      $config['bootstrap'][] = 'gii';
      $config['modules']['gii'] = [
         'class' => 'yii\gii\Module',
      ];
   }
   return $config;
?>
模块的控制器路由必须使用模块ID开始,后面控制器ID和动作ID。
第6步 - 如要在应用程序运行 actionGreet,应该使用下面的路由
admin/custom/greet
在这里,admin 就是一个模块ID,custom 是控制器ID和 greet 就是一个动作ID。
第7步- 现在,键入URL访问: http://localhost:8080/index.php?r=admin/custom/greet,就会看到下面的输出结果了。

要点

模块(Modules)应该 −

  • 在大型应用程序中。应划分其功能分成几个应用组。每个应用功能组可以作为一个模块开发。
  • 可重复使用。一些常用的功能,如搜索引擎优化管理或博客的管理,可以开发成模块,这样在今后的项目中很容易地重用它们。

上一篇: Yii小部件(Widget) 下一篇: Yii视图