http://git.oschina.net/notadd/duoshuo
插件將包含如下幾個(gè)部分:
對(duì)于 插件 的安裝,僅需將插件文件按照下面的目錄結(jié)構(gòu),放置到插件根目錄 extensions (wwwroot/extensions)下,然后執(zhí)行命令 composer update 即可。
目錄結(jié)構(gòu)如下:
\vendor 廠商目錄(目錄名稱僅為示例,開(kāi)發(fā)時(shí)自行修改)
\extension 插件目錄(目錄名稱僅為示例,開(kāi)發(fā)時(shí)自行修改)
\configuations 可加載配置文件目錄
\resources 資源目錄
\translations 翻譯文件目錄
\views 視圖目錄
\src 源碼目錄
\Extension 插件服務(wù)提供者定義文件
\composer.json Composer 配置文件
一個(gè) Notadd 的插件,是一個(gè)符合 composer 規(guī)范的包,所以,插件對(duì)第三方代碼有依賴時(shí),可以在 composer.json 中的 require 節(jié)點(diǎn)中添加第三方的包。
而作為一個(gè)符合 Notadd 插件定義規(guī)范的包,composer.json 需擁有如下信息:
代碼參考如下(來(lái)自插件根目錄下的文件 composer.json, 文件中不應(yīng)該包含 // 的注釋信息,此處僅作為說(shuō)明)
{
"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 在加載插件的時(shí)候,會(huì)檢索插件目錄下的類 ModuleServiceProvider,此類必須命名為 ModuleServiceProvider,且需放在源碼根目錄中,且命名空間必須為 composer.json 的中 autoload 節(jié)點(diǎn)定義的符合 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 的路由注入,需要實(shí)現(xiàn)事件 RouteRegister,并在事件監(jiān)聽(tīng)中添加 路由 。
所以,所謂的路由注入,實(shí)際是在類 Extension 實(shí)現(xiàn)事件 RouteRegister 的訂閱,并在事件訂閱類中注冊(cè)插件所需要的路由。
類 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注入,實(shí)際是在類 Extension 實(shí)現(xiàn)事件 CsrfTokenRegister 的訂閱,并在事件訂閱類中注冊(cè)插件所需要的路由。
類 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*');
}
}
更多建議: