在一些功能实现的过程中,更多的是规范和约束。

实现一个插件的基本内容。

插件约束

Module.php

插件文件夹下必须有一个 Module.php,addons/demo/Module.php https://www.yiichina.com/doc/guide/2.0/structure-modules#controllers-in-modules

  1. <?php
  2. namespace app\addons\demo;
  3. use Yii;
  4. class Module extends \yii\base\Module
  5. {
  6. public function init ()
  7. {
  8. $this->controllerNamespace = "app\addons\demo\controllers";
  9. }
  10. }

目录结构与yii2限定的一致

addons/demo/controllers/DemoController.php

  1. <?php
  2. namespace app\addons\demo\controllers;
  3. use yii\web\Controller;
  4. class DemoController extends Controller
  5. {
  6. public function actionIndex ()
  7. {
  8. echo 'demo';
  9. }
  10. }

插件实现

引导组件

为了让插件一开始生效,则需要使用引导组件

  1. <?php
  2. namespace app\base\components;
  3. use yii\base\BootstrapInterface;
  4. use Yii;
  5. class Addon implements BootstrapInterface
  6. {
  7. public function bootstrap ($app)
  8. {
  9. $modules = $this->allAddonsModules();
  10. if(! empty($modules))
  11. {
  12. $this->setModules($modules);
  13. }
  14. }
  15. public function setModules ($modules)
  16. {
  17. foreach($modules as $id => $module)
  18. {
  19. Yii::$app->setModule($id, $module);
  20. }
  21. }
  22. public function allAddonsModules ()
  23. {
  24. // 遍历addons
  25. $app_path = Yii::getAlias('@app');
  26. $addon_path = $app_path . DIRECTORY_SEPARATOR . 'addons';
  27. // 遍历文件夹
  28. $temp = scandir($addon_path);
  29. $modules = [];
  30. foreach($temp as $v)
  31. {
  32. if($v == '.' || $v == '..')
  33. { // 判断是否为系统隐藏的文件.和.. 如果是则跳过否则就继续往下走,防止无限循环再这里。
  34. continue;
  35. }
  36. if(is_dir($addon_path . DIRECTORY_SEPARATOR . $v))
  37. {
  38. if(file_exists($addon_path . DIRECTORY_SEPARATOR . $v . DIRECTORY_SEPARATOR . 'Module.php'))
  39. {
  40. $modules[$v] = 'app\addons\\' . $v . '\Module';
  41. }
  42. }
  43. }
  44. return $modules;
  45. }
  46. }

配置

  1. <?php
  2. $params = require __DIR__ . '/params.php';
  3. $db = require __DIR__ . '/db.php';
  4. $config = [
  5. 'id' => 'basic',
  6. 'basePath' => dirname(__DIR__),
  7. 'bootstrap' => [
  8. 'log'
  9. // 配置
  10. 'app\base\components\Addon'
  11. ],
  12. ];
  13. return $config;

访问

域名/demo/demo/index