http://git.oschina.net/notadd/duoshuo
插件將包含如下幾個部分:
對于 插件 的安裝,僅需將插件文件按照下面的目錄結(jié)構(gòu),放置到插件根目錄 extensions (wwwroot/extensions)下,然后執(zhí)行命令 composer update 即可。
目錄結(jié)構(gòu)如下:
\vendor 廠商目錄(目錄名稱僅為示例,開發(fā)時自行修改)
\extension 插件目錄(目錄名稱僅為示例,開發(fā)時自行修改)
\configuations 可加載配置文件目錄
\resources 資源目錄
\translations 翻譯文件目錄
\views 視圖目錄
\src 源碼目錄
\Extension 插件服務(wù)提供者定義文件
\composer.json Composer 配置文件
一個 Notadd 的插件,是一個符合 composer 規(guī)范的包,所以,插件對第三方代碼有依賴時,可以在 composer.json 中的 require 節(jié)點中添加第三方的包。
而作為一個符合 Notadd 插件定義規(guī)范的包,composer.json 需擁有如下信息:
代碼參考如下(來自插件根目錄下的文件 composer.json, 文件中不應(yīng)該包含 // 的注釋信息,此處僅作為說明)
{
"name": "notadd/duoshuo",
"description": "Notadd Extension for Duoshuo.",
"type": "notadd-extension", // type 必須設(shè)置為 notadd-extension
"keywords": ["notadd", "duoshuo", "extension"],
"homepage": "https://notadd.com",
"license": "Apache-2.0",
"authors": [
{
"name": "Notadd",
"email": "notadd@ibenchu.com"
}
],
"autoload": {
"psr-4": {
"Notadd\\Duoshuo\\": "src/"
}
},
"require": {
"php": ">=7.0",
"notadd/installers": "0.5.*" // 必須依賴包 notadd/installers
}
}
所謂 插件注入 ,是 Notadd 在加載插件的時候,會檢索插件目錄下的類 ModuleServiceProvider,此類必須命名為 ModuleServiceProvider,且需放在源碼根目錄中,且命名空間必須為 composer.json 的中 autoload 節(jié)點定義的符合 psr-4 規(guī)范的命名空間,否則 Notadd 將不能正確加載插件!
類 Extension 的父類必須為 Notadd\Foundation\Extension\Abstracts\Extension ,且必須包含 boot 方法。
類 Extension 的代碼參考如下:
<?php
/**
* This file is part of Notadd.
*
* @author TwilRoad <269044570@qq.com>
* @copyright (c) 2017, notadd.com
* @datetime 2017-02-21 11:28
*/
namespace Notadd\Duoshuo;
use Notadd\Foundation\Extension\Abstracts\Extension as AbstractExtension;
/**
* Class Extension.
*/
class Extension extends AbstractExtension
{
/**
* Boot provider.
*/
public function boot()
{
}
}
由于 Notadd 的路由注入,需要實現(xiàn)事件 RouteRegister,并在事件監(jiān)聽中添加 路由 。
所以,所謂的路由注入,實際是在類 Extension 實現(xiàn)事件 RouteRegister 的訂閱,并在事件訂閱類中注冊插件所需要的路由。
類 Extension 的代碼參考如下:
<?php
/**
* This file is part of Notadd.
*
* @author TwilRoad <269044570@qq.com>
* @copyright (c) 2017, notadd.com
* @datetime 2017-02-21 11:28
*/
namespace Notadd\Duoshuo;
use Illuminate\Events\Dispatcher;
use Notadd\Duoshuo\Listeners\RouteRegister;
use Notadd\Foundation\Extension\Abstracts\Extension as AbstractExtension;
/**
* Class Extension.
*/
class Extension extends AbstractExtension
{
/**
* Boot provider.
*/
public function boot()
{
$this->app->make(Dispatcher::class)->subscribe(RouteRegister::class);
}
}
事件訂閱類 RouteRegister 的代碼參考如下:
<?php
/**
* This file is part of Notadd.
*
* @author TwilRoad <269044570@qq.com>
* @copyright (c) 2017, notadd.com
* @datetime 2017-02-21 11:50
*/
namespace Notadd\Duoshuo\Listeners;
use Notadd\Duoshuo\Controllers\DuoshuoController;
use Notadd\Foundation\Routing\Abstracts\RouteRegistrar as AbstractRouteRegistrar;
/**
* Class RouteRegister.
*/
class RouteRegister extends AbstractRouteRegistrar
{
/**
* Handle Route Registrar.
*/
public function handle()
{
$this->router->group(['middleware' => ['auth:api', 'cross', 'web'], 'prefix' => 'api/duoshuo'], function () {
$this->router->post('backup', DuoshuoController::class . '@backup');
$this->router->post('configuration', DuoshuoController::class . '@configuration');
$this->router->post('number', DuoshuoController::class . '@number');
});
}
}
所謂的CSRF注入,實際是在類 Extension 實現(xiàn)事件 CsrfTokenRegister 的訂閱,并在事件訂閱類中注冊插件所需要的路由。
類 Extension 的代碼參考如下:
<?php
/**
* This file is part of Notadd.
*
* @author TwilRoad <269044570@qq.com>
* @copyright (c) 2017, notadd.com
* @datetime 2017-02-21 11:28
*/
namespace Notadd\Duoshuo;
use Illuminate\Events\Dispatcher;
use Notadd\Duoshuo\Listeners\CsrfTokenRegister;
use Notadd\Foundation\Extension\Abstracts\Extension as AbstractExtension;
/**
* Class Extension.
*/
class Extension extends AbstractExtension
{
/**
* Boot provider.
*/
public function boot()
{
$this->app->make(Dispatcher::class)->subscribe(CsrfTokenRegister::class);
}
}
事件訂閱類 CsrfTokenRegister 的代碼參考如下:
<?php
/**
* This file is part of Notadd.
*
* @author TwilRoad <269044570@qq.com>
* @copyright (c) 2017, notadd.com
* @datetime 2017-02-23 19:38
*/
namespace Notadd\Duoshuo\Listeners;
use Notadd\Foundation\Event\Abstracts\EventSubscriber;
use Notadd\Foundation\Http\Events\CsrfTokenRegister as CsrfTokenRegisterEvent;
/**
* Class CsrfTokenRegister.
*/
class CsrfTokenRegister extends EventSubscriber
{
/**
* Name of event.
*
* @throws \Exception
* @return string|object
*/
protected function getEvent()
{
return CsrfTokenRegisterEvent::class;
}
/**
* Register excepts.
*
* @param $event
*/
public function handle(CsrfTokenRegisterEvent $event)
{
$event->registerExcept('api/duoshuo*');
}
}
更多建議: