viandwi24/laravel-extension

Laravel 的插件、扩展和模块系统

dev-master 2020-07-01 09:49 UTC

This package is auto-updated.

Last update: 2024-09-29 05:42:44 UTC


README

Laravel 的插件、扩展和模块系统。灵感来自Wordpress插件。

screenshot preview

目录

安装

通过composer安装

composer require viandwi24/laravel-extension

我们使用自动发现制作了这个包,但您也可以手动添加

# service provider :
Viandwi24\LaravelExtension\LaravelExtensionServiceProvider::class

# aliases
"Extension" => Viandwi24\LaravelExtension\Facades\Extension::class,
"Hook" => Viandwi24\LaravelExtension\Facades\Hook::class

发布配置

php artisan vendor:publish --provider="Viandwi24\LaravelExtension\LaravelExtensionServiceProvider"

将命名空间添加到您的Composer中:(编辑您的laravel composer.json)

"autoload": {
    "psr-4": {
        "App\\": "app/",
        "Extension\\": "app/Extension/",
    },
},

然后,您可以使用Composer自动加载生成器

composer dump-autoload

首次安装后,您必须运行此命令以在app\Extension中生成扩展文件夹

php artisan extension:init

扩展管理页面

对于简单的扩展管理页面,将此路由添加到您的路由routes/web.php

use Viandwi24\LaravelExtension\Facades\Extension;

Extension::routes();

保存后,您可以在浏览器中访问 http://mylaravelproject.test/extension 或 'localhost:8000/extension',最后,您将看到这个页面:screenshot extension management page

扩展文件夹结构

默认情况下,扩展路径在app/Extension,您可以在该文件夹中创建扩展。

. app
├── Console
├── Exceptions
├── Extension
│   ├── ExampleExtension
│   │   └── extension.json
│   │   └── ServiceProvider.php
│   ├── MyExtension
│   │   ├── extension.json
│   │   └── MyExtensionServiceProvider.php
│   └── extension.json
├── Http
├── Providers
├── User.php

Artisan控制台命令支持

轻松创建新扩展

php artisan extension:new ExampleExtension

更新已安装的扩展列表

php artisan extension:update-list

获取已安装扩展列表

php artisan extension:list

启用一个扩展:(插件必须首先添加到列表中)

php artisan extension:enable ExamplePlugin

禁用一个扩展

php artisan extension:disable ExamplePlugin

检查扩展

php artisan extension:inspect ExamplePlugin

获取钩子列表(所有)

php artisan hook:list

获取特定类型的钩子列表(操作或过滤器)

# only action :
php artisan hook:list --action

# only filter :
php artisan hook:list --filter

创建新的扩展

使用Artisan命令

您可以使用此命令创建新的扩展

php artisan extension:new ExampleTes

成功后,您可以使用以下命令刷新扩展列表

php artisan extension:update-list

并且您可以使用它来检查更新列表是否成功

php artisan extension:list

要启用您的扩展,请使用

php artisan extension:enable ExampleTes

手册

| 注意:此部分使用印度尼西亚语,您可以将其翻译为。

扩展的位置必须位于主扩展文件夹中,默认情况下位于 app\Extension。以下是如何创建扩展的简要说明

  • 创建主扩展文件夹,例如 app\Extension\MyPlugin
  • app\Extension\MyPlugin\extension.json 中创建您插件的配置文件,内容如下
{
    "name": "My Example Plugin",
    "description": "describe your extension.",
    "version": "1.0.0",
    "provider": "MyPluginServiceProvider",
    "author": {
        "name": "viandwi24",
        "site": "https://github.com/viandwi24"
    }
}
  • 为扩展创建service provider,在上述工作扩展文件夹中,例如 app\Extension\MyPlugin\MyPluginServiceProvider.php,内容如下
<?php

namespace Extension\MyPlugin;

use Viandwi24\LaravelExtension\Support\ServiceProvider;

class MyPluginServiceProvider extends ServiceProvider
{
    /**
     * Register services.
     *
     * @return void
     */
    public function register()
    {
        //
    }

    /**
     * Bootstrap services.
     *
     * @return void
     */
    public function boot()
    {
        //
    }
}
  • 现在,在Artisan中运行此命令以更新app\Extension\extension.json中安装的扩展列表
php artisan extension:update-list

您可以在配置文件 app\Extension\extension.json 中自动添加它,如果您运行上述命令,该命令将自动更新您在app\Extension\extension.json中存在的扩展列表,应该如下所示:

{
    "list": [
        "MyPlugin"
    ],
    "active": []
}
  • 通过运行以下命令来检查扩展是否已注册
php artisan extension:list
  • 如果已注册但状态不是active,请运行以下命令
php artisan extension:enable MyPlugin

钩子

操作

通过钩子操作,您可以创建多操作系统和操作管理。
创建操作

Hook::addAction(string $extension, string $name, \Closure $callback, int $priority = 10)

运行操作

Hook::runAction(string $name)

例如,您可以为操作钩子命名“save_post”,此操作可以执行多个操作回调

use Viandwi24\LaravelExtension\Facades\Hook;
use App\Models\Post;

Hook::addAction('extension_name', 'save_post', function ($title) {
    $create = Post::create([ 'title' => $title ]);
}, 15);

Hook::addAction('another_extension', 'save_post', function ($title) {
    Log::create("Creating post with title {$title}");
}, 10);

您可以运行

use Viandwi24\LaravelExtension\Facades\Hook;

$title = "Example Post";
Hook::runAction('save_post', $title);

过滤器

过滤器使数据可以通过多个闭包进行修改,这对于制作扩展很有帮助。创建过滤器

Hook::addFilter(string $extension, string $name, \Closure $callback, int $priority = 10)

应用动作

$result = Hook::applyFilter(string $name, $value, ...$params)

例如,我为修改数据 $title 创建了2个函数

use Viandwi24\LaravelExtension\Facades\Hook;

Hook::addFilter('extension_name', 'save_post_params', function ($title) {
    return "a {$title}.";
}, 15);

Hook::addFilter('another_extension', 'save_post_params', function ($title) {
    return strtolower($title);
}, 10);


$title = "Example Post";
$result = Hook::applyFilter('save_post_params', $title);
// result output : a example post.

菜单构建器

此软件包包含一个简单的菜单构建器,用于在您的项目中创建动态菜单
这是一个示例

use Viandwi24\LaravelExtension\Facades\Menu;

Menu::add('admin.navbar', 'Dashboard', url('/'));
Menu::add('admin.navbar', 'Extension', url('/extension'));

然后,为了将内容渲染为HTML字符串,使用这个。例如,我正在创建 sidebar.blade.php

@php
$menu = Menu::render('admin.navbar', function ($title, $url) {
    return '<li class="nav-item">
        <a class="nav-link" href="'.$url.'">
            <i class="nav-icon la la-lg la-dashboard"></i>
            '.$title.'
        </a>
    </li>';
});
@endphp

<div class="sidebar">
    <nav class="sidebar-nav">
        <ul class="nav">
            {!! $menu !!}
        </ul>
    </nav>
</div>

单元测试

您可以使用此命令运行测试:phpunit

composer test

或者:(通过composer安装的phpunit)

vendor/bin/phpunit tests/HookActionTest
vendor/bin/phpunit tests/HookFilterTest
vendor/bin/phpunit tests/MenuBuilderTest

示例

在html blade中创建动态的css和javascript

例如,使用钩子过滤器创建一个带有动态组件的页面。在 layouts/app.blade.php

<html lang="en">
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Example Page</title>
        
        @applyfilter("html__styless")
            <!-- dynamic styles with Hook Filter -->
        @applyfilter
    </head>
    <body class="app aside-menu-fixed sidebar-lg-show">
        <div id="app"></div>

        @applyfilter("html__scripts")
            <!-- dynamic scripts with Hook Filter -->
        @applyfilter
    </body>
</html>

然后在控制器中

public function index()
{
    //  system filter
    Hook::addFilter("system", "html__styles", function ($old_value) {
        return $old_value . '<link href="bootstrap.min.css" rel="stylesheet">';
    }, 15);
    Hook::addFilter("system", "html__scripts", function ($old_value) {
        return $old_value .'<script src="bootstrap.min.js"><script>';
    }, 15);

    // another extension filter
    Hook::addFilter("example_extension", "html__scripts", function ($old_value) {
        return '<script src="jquery.min.js"><script>' . $old_value;
    }, 15);
    return view('layouts.app');
}

然后,最终的HTML结果是

<html lang="en">
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Example Page</title>
        
        <!-- dynamic styles with Hook Filter -->
        <link href="bootstrap.min.css" rel="stylesheet">
    </head>
    <body class="app aside-menu-fixed sidebar-lg-show">
        <div id="app"></div>

        <!-- dynamic scripts with Hook Filter -->
        <script src="jquery.min.js"><script>
        <script src="bootstrap.min.js"><script>
    </body>
</html>

许可证

MIT许可(MIT)。请参阅 许可文件 了解更多信息。