# 三分钟写一个MeEdu插件

首先,在 addons 目录下面按照下面的目录结构创建:

➜  addons git:(dev) ✗ tree
.
└── Demo1
    ├──Commands
    ├──└── AppCommand.php
    ├── MainServiceProvider.php
    └── meedu.json

在继续下面的教程之前,我们需要先了解几个概念:

  • Demo1 文件夹,首字母大写(这样做是为了兼容PSR4自动加载规范),同时它就是插件的 Sign 也就是签名,这个在整个 meedu 的生态中必须是唯一的,否则会产生冲突。我们建议的是,您的插件的 Sign 结合您的 Name + 插件名 这样的形势组合,这样可以很好的避免重合。

  • meedu.json 文件。这个是插件必须的文件,有了这个文件 MeEdu 才能够正确的加载插件。

  • MainServiceProvider.php 文件。这个文件的名字随便定义,不过我们建议插件的 ServiceProvider 都命名为 MainServiceProvider ,同时也规定每个插件只定义一个 ServiceProvider 文件,也就是 MainServiceProvider.php 文件。这个文件非常重要,如果没有它,您的插件将毫无作用。

  • AppCommnad.php 是命令文件,插件的安装,升级,卸载的业务逻辑都写在这里。

# meedu.json 文件内容:

{
  "name": "测试",
  "version": "v1.0",
  "required": {}
}

见名知意,name 就是插件的中文名,version 是插件的版本, required 是插件的依赖(如:composer依赖。)

# AppCommand.php 内容:

<?php

namespace Addons\Demo1\Commands;

use Illuminate\Console\Command;
use Illuminate\Support\Facades\Artisan;

class AppCommand extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'Demo1 {action}';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = '';

    /**
     * AppCommand constructor.
     */
    public function __construct(F)
    {
        parent::__construct();
    }

    public function handle()
    {
        $action = $this->argument('action');
        $method = 'action' . ucfirst($action);
        $this->{$method}();
    }

    protected function actionInstall()
    {
    }

    protected function actionUninstall()
    {
    }

    protected function actionUpgrade()
    {
    }
}

# ServierProvider 文件内容:

<?php


namespace Addons\Demo1;

use Addons\Demo1\Commands\AppCommand;
use Illuminate\Support\ServiceProvider;

class MainServiceProvider extends ServiceProvider
{

    public function boot()
    {
      // 注册命令
        if ($this->app->runningInConsole()) {
            $this->commands([
                AppCommand::class,
            ]);
        }
    }

    public function register()
    {
        
    }

}

这里,我们需要关注几点:

  • 第一,namespace,这里为 Addons\Demo1 ,其中的 Demo1 就是插件的 Sign 了。
  • 第二,继承于 Illuminate\Support\ServiceProvider 类,该类是 Laravel 的服务基类,必须继承该类。
  • 第三,bootregister 方法。这个如果您对 Laravel 的服务加载熟悉的话,应该很清楚这两个方法的作用。

到这里的话,其实我们就创建了一个插件,我们该如何让 meedu 加载这个插件呢?

可以在命令行执行名:

php artisan addons:provider:map

这样,meedu 系统就会加载这个插件了,插件加载之后,我们就可以执行安装命令了:

php artisan Demo1 install

虽然这个插件并没有实际的代码,但是,meedu的一个基础插件的结构就是这样的,接下来我们将会详细详细插件更多的开发。