winkelco/laravel-extension
Composer 安装命令:
composer require winkelco/laravel-extension
包简介
Plugin, Extension and Module System For Laravel
关键字:
README 文档
README
Plugin, Extension and Module System For Laravel. Inspirate from Wordpress Plugins.
Table of contents
- Installing
- Extension Management Page
- Extension Folder Structure
- Create New Extension
- Hook
- Menu Builder
- Unit Test
- Examples
- License
Installing
Install from composer :
composer require winkelco/laravel-extension
We make this package with Auto Discovery, but you can add manual :
# service provider :
WinkelCo\LaravelExtension\LaravelExtensionServiceProvider::class
# aliases
"Extension" => WinkelCo\LaravelExtension\Facades\Extension::class,
"Hook" => WinkelCo\LaravelExtension\Facades\Hook::class
Publish Config :
php artisan vendor:publish --provider="WinkelCo\LaravelExtension\LaravelExtensionServiceProvider"
Added Namespace To Your Composer : (edit your laravel composer.json)
"autoload": {
"psr-4": {
"App\\": "app/",
"Extension\\": "app/Extension/",
},
},
And then, you can generate composer autoload :
composer dump-autoload
For first time after installing, you must run this command for generate extension folder in app\Extension :
php artisan extension:init
Extension Management Page
For a simple Extension management page, added this route to your rourtes routes/web.php :
use WinkelCo\LaravelExtension\Facades\Extension;
Extension::routes();
Save, and then access in your browser http://mylaravelproject.test/extension or 'localhost:8000/extension`, and finaly, you see this page :

Extension Folder Structure
By Default, Extension path in app/Extension, you can create Extension in this folder.
. app
├── Console
├── Exceptions
├── Extension
│ ├── ExampleExtension
│ │ └── extension.json
│ │ └── ServiceProvider.php
│ ├── MyExtension
│ │ ├── extension.json
│ │ └── MyExtensionServiceProvider.php
│ └── extension.json
├── Http
├── Providers
├── User.php
Artisan Console Command Support
Make new extension easy :
php artisan extension:new ExampleExtension
Update list installed extension :
php artisan extension:update-list
Get list installed extension :
php artisan extension:list
Enable a extension : (plugin must be added in list first)
php artisan extension:enable ExamplePlugin
Disable a extension :
php artisan extension:disable ExamplePlugin
Inspect a Extension
php artisan extension:inspect ExamplePlugin
Get Hook list (all)
php artisan hook:list
Get Hook list specific type (action or filter)
# only action :
php artisan hook:list --action
# only filter :
php artisan hook:list --filter
Create New Extension
with Artisan Command
you can create new extension with this command :
php artisan extension:new ExampleTes
after success, you can refresh extension list with :
php artisan extension:update-list
and you can check if updating list success :
php artisan extension:list
for enable your extension, use :
php artisan extension:enable ExampleTes
Manual
| note : this use indonesian language, you can translate this.
Lokasi extension harus ada pada folder utama extension, secara default
ada pada app\Extension. berikut panduan singkat cara pembuatan extension :
- membuat folder utama extension, misal
app\Extension\MyPlugin - buat file config untuk plugin anda di
app\Extension\MyPlugin\extension.json, isi dengan :
{
"name": "My Example Plugin",
"description": "describe your extension.",
"version": "1.0.0",
"provider": "MyPluginServiceProvider",
"author": {
"name": "winkelco",
"site": "https://github.com/winkelco"
}
}
- Buat service provider untuk extension anda, di folder working extension tadi, sebagai contoh
app\Extension\MyPlugin\MyPluginServiceProvider.phpisinya :
<?php
namespace Extension\MyPlugin;
use WinkelCo\LaravelExtension\Support\ServiceProvider;
class MyPluginServiceProvider extends ServiceProvider
{
/**
* Register services.
*
* @return void
*/
public function register()
{
//
}
/**
* Bootstrap services.
*
* @return void
*/
public function boot()
{
//
}
}
- Sekarang, jalankan perintah ini diartisan untuk mengupdate list extension yang terinstall di
app\Extension\extension.json:
php artisan extension:update-list
anda bisa menambahkanya otomatis di file config app\Extension\extension.json, jika anda menjalankan perintah diatas, perintah tersebut akan otomatis mengupdate daftar extension anda yang ada di app\Extension\extension.json, seharusnya menjadi seperti berikut nantinya file app\Extension\extension.json :
{
"list": [
"MyPlugin"
],
"active": []
}
- Cek apakah extension tersebut sudah terdaftar dengan menjalankan perintah :
php artisan extension:list
- jika terdaftar tapi statusnya belum
active, silahkan jalankan perintah :
php artisan extension:enable MyPlugin
Hook
Action
with Hook Action, you can make multi-action system and management action.
Make Action :
Hook::addAction(string $extension, string $name, \Closure $callback, int $priority = 10)
Run Action :
Hook::runAction(string $name)
For Example, you can make action hook name "save_post", and this action can make many action callback
use WinkelCo\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);
And You Can Run :
use WinkelCo\LaravelExtension\Facades\Hook;
$title = "Example Post";
Hook::runAction('save_post', $title);
Filter
Filter make data can modification by multiple closure, this a helpfull for make Extension. Make Filter :
Hook::addFilter(string $extension, string $name, \Closure $callback, int $priority = 10)
Apply Action :
$result = Hook::applyFilter(string $name, $value, ...$params)
For example, i make 2 function for modification a data $title :
use WinkelCo\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.
Menu Builder
This package include a simple menu builder, for make dynamic menu in your project,
this is a example :
use WinkelCo\LaravelExtension\Facades\Menu;
Menu::add('admin.navbar', 'Dashboard', url('/'));
Menu::add('admin.navbar', 'Extension', url('/extension'));
And then, for render to string html, use this. For example i am make 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>
Unit Test
You can running test with phpunit with this command :
composer test
or : (installed phpunit via composer)
vendor/bin/phpunit tests/HookActionTest
vendor/bin/phpunit tests/HookFilterTest
vendor/bin/phpunit tests/MenuBuilderTest
Examples
Making Dynamic css and javascript in html blade
For example, a make a page with dynamic component with Hook filter.
In 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>
And in controlle :
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');
}
And then, final result html is :
<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>
License
The MIT License (MIT). Please see License File for more information.
winkelco/laravel-extension 适用场景与选型建议
winkelco/laravel-extension 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 2.66k 次下载、GitHub Stars 达 3, 最近一次更新时间为 2020 年 11 月 08 日, 在 PHP 生态内属于活跃度较高的组件。
它主要适用于以下技术方向: 「plugin」 「module」 「extension」 「laravel」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。
我们在过去多个企业项目中使用过 winkelco/laravel-extension 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。
基于 winkelco/laravel-extension 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。
线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。
承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。
与 winkelco/laravel-extension 相关的其它包
同方向 / 同关键字的高下载量 PHP Composer 包推荐,方便对比选型:
CakePHP 4.x AdminLTE Theme.
A custom URL rule class for Yii 2 which allows to create translated URL rules
The Yii2 extension uses jQuery jquery.carousel-1.1.min.js and makes image carousel from php array of structure defined.
TYPO3 CMS extension to create gallery content element with preset crop ratios and pagination
UI Kit 3 Extension for Yii2
Adds more BBCode
统计信息
- 总下载量: 2.66k
- 月度下载量: 0
- 日度下载量: 0
- 收藏数: 3
- 点击次数: 1
- 依赖项目数: 0
- 推荐数: 0
其他信息
- 授权协议: MIT
- 更新时间: 2020-11-08
