如何開(kāi)發(fā)一個(gè) Notadd 插件

2018-05-23 12:02 更新

插件代碼結(jié)構(gòu)請(qǐng)參考項(xiàng)目

http://git.oschina.net/notadd/duoshuo

插件將包含如下幾個(gè)部分:

  • 插件注入
  • 路由注入
  • CSRF注入

插件安裝

對(duì)于 插件 的安裝,僅需將插件文件按照下面的目錄結(jié)構(gòu),放置到插件根目錄 extensions (wwwroot/extensions)下,然后執(zhí)行命令 composer update 即可。

目錄結(jié)構(gòu)

目錄結(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 需擁有如下信息:

  • type 必須為 notadd-module
  • require 中必須添加包 notadd/installers

代碼參考如下(來(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注入

所謂的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*');
    }
}
以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)