在一些功能实现的过程中,更多的是规范和约束。
实现一个插件的基本内容。
插件约束
Module.php
插件文件夹下必须有一个 Module.php,addons/demo/Module.php https://www.yiichina.com/doc/guide/2.0/structure-modules#controllers-in-modules
<?php
namespace 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
<?php
namespace app\addons\demo\controllers;
use yii\web\Controller;
class DemoController extends Controller
{
public function actionIndex ()
{
echo 'demo';
}
}
插件实现
引导组件
为了让插件一开始生效,则需要使用引导组件
<?php
namespace 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