diff --git a/beike/Plugin/Manager.php b/beike/Plugin/Manager.php index 203d5c6e..5c822aae 100644 --- a/beike/Plugin/Manager.php +++ b/beike/Plugin/Manager.php @@ -65,6 +65,43 @@ class Manager return $this->plugins; } + + /** + * 获取已开启的插件 + * + * @return Collection + * @throws \Exception + */ + public function getEnabledPlugins(): Collection + { + $allPlugins = $this->getPlugins(); + return $allPlugins->filter(function (Plugin $plugin) { + return $plugin->getEnabled(); + }); + } + + /** + * 获取已开启插件对应根目录下的启动文件 bootstrap.php + * + * @return Collection + * @throws \Exception + */ + public function getEnabledBootstraps(): Collection + { + $bootstraps = new Collection; + + foreach ($this->getEnabledPlugins() as $plugin) { + if ($this->filesystem->exists($file = $plugin->getPath() . '/bootstrap.php')) { + $bootstraps->push([ + 'code' => $plugin->getDirName(), + 'file' => $file + ]); + } + } + + return $bootstraps; + } + /** * 获取单个插件 * diff --git a/beike/Plugin/Plugin.php b/beike/Plugin/Plugin.php index f66179e9..5d0ef726 100644 --- a/beike/Plugin/Plugin.php +++ b/beike/Plugin/Plugin.php @@ -92,6 +92,11 @@ class Plugin implements Arrayable, \ArrayAccess } + public function getDirname(): string + { + return $this->dirName; + } + public function getPath(): string { return $this->path; diff --git a/beike/Shop/Providers/PluginServiceProvider.php b/beike/Shop/Providers/PluginServiceProvider.php new file mode 100644 index 00000000..6c5f681f --- /dev/null +++ b/beike/Shop/Providers/PluginServiceProvider.php @@ -0,0 +1,52 @@ + + * @created 2022-07-20 14:42:10 + * @modified 2022-07-20 14:42:10 + */ + +namespace Beike\Shop\Providers; + +use Beike\Plugin\Manager; +use Illuminate\Support\ServiceProvider; + +class PluginServiceProvider extends ServiceProvider +{ + /** + * Register the application services. + * + * @return void + */ + public function register() + { + $this->app->singleton('plugin', function () { + return new Manager(); + }); + } + + + /** + * Bootstrap Plugin Service Provider + * + * @param Manager $manager + * @throws \Exception + */ + public function boot(Manager $manager) + { + $plugins = $manager->getPlugins(); + $bootstraps = $manager->getEnabledBootstraps(); + foreach ($bootstraps as $bootstrap) { + $filePath = $bootstrap['file']; + $pluginCode = $bootstrap['code']; + if (file_exists($filePath)) { + require_once $filePath; + $className = "Plugin\\{$pluginCode}\\Bootstrap"; + (new $className)->boot(); + } + } + } +} diff --git a/beike/Shop/Providers/ShopServiceProvider.php b/beike/Shop/Providers/ShopServiceProvider.php index 0a1e9833..a0411c5f 100644 --- a/beike/Shop/Providers/ShopServiceProvider.php +++ b/beike/Shop/Providers/ShopServiceProvider.php @@ -10,6 +10,7 @@ use Illuminate\Support\Facades\Config; use Illuminate\Support\ServiceProvider; use Beike\Shop\View\Components\AccountSidebar; use Illuminate\View\FileViewFinder; +use TorMorten\Eventy\Facades\Eventy; class ShopServiceProvider extends ServiceProvider { @@ -69,7 +70,7 @@ class ShopServiceProvider extends ServiceProvider View::share('languages', languages()); $menuCategories = CategoryRepo::getTwoLevelCategories(); - View::share('categories', $menuCategories); + View::share('categories', Eventy::filter('header.categories', $menuCategories)); View::share('shop_base_url', shop_route('home.index')); } diff --git a/config/app.php b/config/app.php index 73b061af..7f3e6f58 100644 --- a/config/app.php +++ b/config/app.php @@ -177,6 +177,7 @@ return [ Beike\Admin\Providers\AdminServiceProvider::class, Beike\Shop\Providers\ShopServiceProvider::class, + Beike\Shop\Providers\PluginServiceProvider::class, ], diff --git a/plugins/BKStripe/Bootstrap.php b/plugins/BKStripe/Bootstrap.php new file mode 100644 index 00000000..be903729 --- /dev/null +++ b/plugins/BKStripe/Bootstrap.php @@ -0,0 +1,26 @@ + + * @created 2022-07-20 15:35:59 + * @modified 2022-07-20 15:35:59 + */ + +namespace Plugin\BKStripe; + +use TorMorten\Eventy\Facades\Eventy; + +class Bootstrap +{ + public function boot() + { + dump(__CLASS__, __METHOD__, __FUNCTION__); + Eventy::addFilter('header.categories', function($data) { + dump($data); + return $data; + }, 20, 1); + } +}