From e8d1fd194257f5b9ea9d54f8d229382887447f99 Mon Sep 17 00:00:00 2001 From: Edward Yang Date: Thu, 21 Jul 2022 10:07:29 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=92=E4=BB=B6demo=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E6=9C=80=E6=96=B0=E4=BA=A7=E5=93=81=E5=88=97=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- beike/Helpers.php | 12 ++++++ beike/Repositories/ProductRepo.php | 3 +- .../Shop/Providers/PluginServiceProvider.php | 11 +++++ beike/Shop/Providers/ShopServiceProvider.php | 40 +++++++++++-------- plugins/HeaderMenu/Bootstrap.php | 6 +-- .../Controllers/MenusController.php | 24 +++++++++++ .../Views/latest_products.blade.php | 18 +++++++++ plugins/HeaderMenu/routes.php | 15 +++++++ 8 files changed, 109 insertions(+), 20 deletions(-) create mode 100644 plugins/HeaderMenu/Controllers/MenusController.php create mode 100644 plugins/HeaderMenu/Views/latest_products.blade.php create mode 100644 plugins/HeaderMenu/routes.php diff --git a/beike/Helpers.php b/beike/Helpers.php index 1a7d1bea..b31483c8 100644 --- a/beike/Helpers.php +++ b/beike/Helpers.php @@ -90,6 +90,18 @@ function shop_route($route, $params = []): string return route('shop.' . $route, $params); } +/** + * 获取插件链接 + * + * @param $route + * @param mixed $params + * @return string + */ +function plugin_route($route, $params = []): string +{ + return route('plugin.' . $route, $params); +} + /** * 是否为当前访问路由 * diff --git a/beike/Repositories/ProductRepo.php b/beike/Repositories/ProductRepo.php index f49b57dd..51603611 100644 --- a/beike/Repositories/ProductRepo.php +++ b/beike/Repositories/ProductRepo.php @@ -117,7 +117,8 @@ class ProductRepo return $builder; } - public static function list($data) + + public static function list($data=[]) { return self::getBuilder($data)->paginate($data['per_page'] ?? 20); } diff --git a/beike/Shop/Providers/PluginServiceProvider.php b/beike/Shop/Providers/PluginServiceProvider.php index 6c5f681f..04f39d87 100644 --- a/beike/Shop/Providers/PluginServiceProvider.php +++ b/beike/Shop/Providers/PluginServiceProvider.php @@ -12,6 +12,7 @@ namespace Beike\Shop\Providers; use Beike\Plugin\Manager; +use Illuminate\Support\Facades\Route; use Illuminate\Support\ServiceProvider; class PluginServiceProvider extends ServiceProvider @@ -39,6 +40,8 @@ class PluginServiceProvider extends ServiceProvider { $plugins = $manager->getPlugins(); $bootstraps = $manager->getEnabledBootstraps(); + $pluginBasePath = base_path('plugins'); + foreach ($bootstraps as $bootstrap) { $filePath = $bootstrap['file']; $pluginCode = $bootstrap['code']; @@ -47,6 +50,14 @@ class PluginServiceProvider extends ServiceProvider $className = "Plugin\\{$pluginCode}\\Bootstrap"; (new $className)->boot(); } + + $this->loadViewsFrom("{$pluginBasePath}/{$pluginCode}/Views", $pluginCode); + + Route::prefix('plugin') + ->middleware('web') + ->group(function () use ($pluginBasePath, $pluginCode) { + $this->loadRoutesFrom("{$pluginBasePath}/{$pluginCode}/routes.php"); + }); } } } diff --git a/beike/Shop/Providers/ShopServiceProvider.php b/beike/Shop/Providers/ShopServiceProvider.php index a0411c5f..dfcd8e7d 100644 --- a/beike/Shop/Providers/ShopServiceProvider.php +++ b/beike/Shop/Providers/ShopServiceProvider.php @@ -31,24 +31,16 @@ class ShopServiceProvider extends ServiceProvider $this->mergeConfigFrom(__DIR__ . '/../../Config/beike.php', 'beike'); $this->registerGuard(); - $this->app->bind('view.finder', function ($app) { - $paths = $app['config']['view.paths']; - if ($theme = setting('base.theme')) { - $customTheme[] = base_path("themes/{$theme}"); - $paths = array_merge($customTheme, $paths); - } - return new FileViewFinder($app['files'], $paths); - }); + $this->loadThemeViewPath(); + + $this->loadComponents(); $this->app->booted(function () { $this->loadShareViewData(); }); - - $this->loadViewComponentsAs('shop', [ - 'sidebar' => AccountSidebar::class, - ]); } + protected function registerGuard() { Config::set('auth.guards.' . Customer::AUTH_GUARD, [ @@ -62,16 +54,32 @@ class ShopServiceProvider extends ServiceProvider ]); } + protected function loadThemeViewPath() + { + $this->app->singleton('view.finder', function ($app) { + $paths = $app['config']['view.paths']; + if ($theme = setting('base.theme')) { + $customTheme[] = base_path("themes/{$theme}"); + $paths = array_merge($customTheme, $paths); + } + return new FileViewFinder($app['files'], $paths); + }); + } + + protected function loadComponents() + { + $this->loadViewComponentsAs('shop', [ + 'sidebar' => AccountSidebar::class, + ]); + } + protected function loadShareViewData() { - View::share('design', request('design') == 1); - View::share('languages', languages()); + View::share('shop_base_url', shop_route('home.index')); $menuCategories = CategoryRepo::getTwoLevelCategories(); View::share('categories', Eventy::filter('header.categories', $menuCategories)); - - View::share('shop_base_url', shop_route('home.index')); } } diff --git a/plugins/HeaderMenu/Bootstrap.php b/plugins/HeaderMenu/Bootstrap.php index 31a56c3d..d066e2a2 100644 --- a/plugins/HeaderMenu/Bootstrap.php +++ b/plugins/HeaderMenu/Bootstrap.php @@ -18,11 +18,11 @@ class Bootstrap add_filter('header.categories', function ($data) { $data[] = [ 'name' => '插件链接', - 'url' => 'https://www.google.com', + 'url' => shop_route('home.index'), 'children' => [ [ - "name" => "Google", - "url" => "https://www.google.com", + "name" => "最新商品", + "url" => plugin_route('latest_products'), ], [ "name" => "百度", "url" => "https://www.baidu.com", diff --git a/plugins/HeaderMenu/Controllers/MenusController.php b/plugins/HeaderMenu/Controllers/MenusController.php new file mode 100644 index 00000000..e6c549e1 --- /dev/null +++ b/plugins/HeaderMenu/Controllers/MenusController.php @@ -0,0 +1,24 @@ + + * @created 2022-07-21 10:00:25 + * @modified 2022-07-21 10:00:25 + */ + +namespace Plugin\HeaderMenu\Controllers; + +use Beike\Repositories\ProductRepo; +use Beike\Shop\Http\Controllers\Controller; + +class MenusController extends Controller +{ + public function latestProducts() + { + $products = ProductRepo::list(); + return view("HeaderMenu::latest_products", ['products' => $products]); + } +} diff --git a/plugins/HeaderMenu/Views/latest_products.blade.php b/plugins/HeaderMenu/Views/latest_products.blade.php new file mode 100644 index 00000000..841cb5c1 --- /dev/null +++ b/plugins/HeaderMenu/Views/latest_products.blade.php @@ -0,0 +1,18 @@ +@extends('layout.master') + +@section('content') +
+ +
+ @foreach ($products as $product) +
@include('shared.product')
+ @endforeach +
+
+ +@endsection diff --git a/plugins/HeaderMenu/routes.php b/plugins/HeaderMenu/routes.php new file mode 100644 index 00000000..d31228e2 --- /dev/null +++ b/plugins/HeaderMenu/routes.php @@ -0,0 +1,15 @@ + + * @created 2022-07-21 09:35:05 + * @modified 2022-07-21 09:35:05 + */ + +use Illuminate\Support\Facades\Route; + +Route::get('/latest_products', '\Plugin\HeaderMenu\Controllers\MenusController@latestProducts')->name('plugin.latest_products'); +