在一些功能实现的过程中,更多的是规范和约束。
实现一个插件的基本内容。
插件约束
Module.php
插件文件夹下必须有一个 Module.php,addons/demo/Module.php https://www.yiichina.com/doc/guide/2.0/structure-modules#controllers-in-modules
<?phpnamespace app\addons\demo;use Yii;class Module extends \yii\base\Module{public function init (){$this->controllerNamespace = "app\addons\demo\controllers";}}
目录结构与yii2限定的一致
addons/demo/controllers/DemoController.php
<?phpnamespace app\addons\demo\controllers;use yii\web\Controller;class DemoController extends Controller{public function actionIndex (){echo 'demo';}}
插件实现
引导组件
为了让插件一开始生效,则需要使用引导组件
<?phpnamespace app\base\components;use yii\base\BootstrapInterface;use Yii;class Addon implements BootstrapInterface{public function bootstrap ($app){$modules = $this->allAddonsModules();if(! empty($modules)){$this->setModules($modules);}}public function setModules ($modules){foreach($modules as $id => $module){Yii::$app->setModule($id, $module);}}public function allAddonsModules (){// 遍历addons$app_path = Yii::getAlias('@app');$addon_path = $app_path . DIRECTORY_SEPARATOR . 'addons';// 遍历文件夹$temp = scandir($addon_path);$modules = [];foreach($temp as $v){if($v == '.' || $v == '..'){ // 判断是否为系统隐藏的文件.和.. 如果是则跳过否则就继续往下走,防止无限循环再这里。continue;}if(is_dir($addon_path . DIRECTORY_SEPARATOR . $v)){if(file_exists($addon_path . DIRECTORY_SEPARATOR . $v . DIRECTORY_SEPARATOR . 'Module.php')){$modules[$v] = 'app\addons\\' . $v . '\Module';}}}return $modules;}}
配置
<?php$params = require __DIR__ . '/params.php';$db = require __DIR__ . '/db.php';$config = ['id' => 'basic','basePath' => dirname(__DIR__),'bootstrap' => ['log'// 配置'app\base\components\Addon'],];return $config;
访问
域名/demo/demo/index
