# 模块

模块的操作其实没有太多变化,但是做了一些额外的更加灵活的方式,首先抽象了仓储,另外提供了事件给用户使用。模块的操作一共提供了六个接口。以下便是模块仓库的接口定义。

namespace Catcher\Contracts

interface ModuleRepositoryInterface
{
    public function all();

    public function create(array $module);

    public function show(string $name);

    public function update(array $module);

    public function delete(string $name);

    public function disOrEnable(string $name);
}

众所周知CatchAdmin 的模块信息存储是基于 json 文件的。在For Laravel 的项目中,实现上文的Interface 接口,来操作模块。 如果需要其他方式,那么请看下文的教程。

namespace Catcher\Support;

class ModuleRepository implements ModuleRepositoryInterface
{}

通过 ServiceProvider 进行绑定实现,代码如下

 $this->app->singleton(ModuleRepositoryInterface::class, ModuleRepository::class);

 $this->app->alias(ModuleRepositoryInterface::class, 'catchModuleRepository');

但是在实际使用时,不必直接使用 Catcher\Support\ModuleRepositoryCatchAdmin 提供了 Catcher\Facade\Module 门面来操作。 这意味着如果你有需求使用其他方式来存储操作模块信息的话,可以直接替换实现之后而不必改任何项目中的代码。下面是伪代码

// 例如基于 Database 存储
class ModuleDatabase implements ModuleRepositoryInterface
{}

// 实现完成之后,重新绑定实现,这种情况下,你无需改动其他地方任何代码,即完成 Module 操作方式切换
$this->app->singleton(ModuleRepositoryInterface::class, ModuleDatabase::class);

不光如此。在 Module 的操作也提供了事件操作。在这四个接口完成之后的四个事件操作。

# 事件

namespace Catcher\Events;

class ModuleEvent
{
    const CREATE = 'create';

    const UPDATE = 'update';

    const DELETE = 'delete';

    const DIS_OR_ENABLE = 'disOrEnable';

    /**
     * @var array
     */
    public $module;

    /**
     * @var string
     */
    public $type;

    public function __construct($module, $type)
    {
        //
        $this->module = $module;

        $this->type = $type;
    }
}

事件安装在如下接口内,这里你都不需要动。你需要改动的请往下看事件监听

public function create()
{
    event(new ModuleEvent($module, ModuleEvent::CREATE));
}

public function update()
{
    event(new ModuleEvent($module, ModuleEvent::UPDATE));
}

public function delete()
{
   event(new ModuleEvent($module, ModuleEvent::DELETE)); 
}

public function disOrEnable()
{
  event(new ModuleEvent($module, ModuleEvent::DIS_OR_ENABLE));  
}

# 事件监听

CatchAdmin 实现了事件监听,当然事件监听可以切换的。

namespace Catcher\Listeners;

use Catcher\CatchAdmin;
use Catcher\Events\ModuleEvent;
use Illuminate\Support\Facades\File;

class ModuleListener
{
    public function handle(ModuleEvent $event)
    {
        $moduleJson = CatchAdmin::getModuleJsonPath($event->module['name']);

        switch ($event->type) {
            case ModuleEvent::CREATE:
            case ModuleEvent::UPDATE:
            case ModuleEvent::DIS_OR_ENABLE:
                File::put($moduleJson, \json_encode($event->module, JSON_UNESCAPED_UNICODE|JSON_PRETTY_PRINT));
                break;
            case ModuleEvent::DELETE:
                File::deleteDirectory($event->module['name']);
                break;
            default:
                break;
        }
    }
}

可以重新实现事件,然后重新注入监听

Event::listen(Event::class, Listener::class);