114 lines
4.5 KiB
PHP
114 lines
4.5 KiB
PHP
<?php
|
||
|
||
namespace App\Providers;
|
||
|
||
use Illuminate\Support\ServiceProvider;
|
||
use Route;
|
||
use Auth;
|
||
|
||
/**
|
||
* 從Config檔案建立Menu Item,並註冊相關Route
|
||
*
|
||
* Class AdminMenuServiceProvider
|
||
* @package App\Providers
|
||
*/
|
||
class AdminMenuServiceProvider extends ServiceProvider
|
||
{
|
||
protected $namespace = '\\';
|
||
|
||
/**
|
||
* Register services.
|
||
*
|
||
* @return void
|
||
*/
|
||
public function register()
|
||
{
|
||
}
|
||
|
||
/**
|
||
* Bootstrap services.
|
||
*
|
||
* @return void
|
||
*/
|
||
public function boot()
|
||
{
|
||
/** 從Config建Admin Menu物件內容 */
|
||
Route::group(['prefix' => config('admin.route') . '/main', 'middleware' => ['web', 'admin.area', 'admin.menu'], 'as' => config('admin.route_name_prefix')], function(){
|
||
|
||
//Config的Menu組態設定
|
||
$menuItems = config('admin.menuItems');
|
||
//Menu Route Name的前綴
|
||
$menuRouteNamePrefix = config('admin.menu.route_name_prefix');
|
||
//MenuItemContoller的Route處理函式
|
||
$menuItemControllerHandlingMethod = 'handle';
|
||
|
||
/**
|
||
* MenuItem的處理物件,為全域Singleton物件
|
||
* @var \App\Services\Admin\MainMenuItemService $adminMenu
|
||
*/
|
||
$adminMenu = app('AdminMenu');
|
||
|
||
foreach ($menuItems as $menuItem) {
|
||
if($menuItem['type'] == 'item') {
|
||
if(class_exists($menuItem['controller'])) {
|
||
/**
|
||
* @var \App\Http\Controllers\Admin\Menu\BaseMenuItemController $parentItem
|
||
*/
|
||
$parentItem = new $menuItem['controller'];
|
||
if(!$parentItem->isValid()) {
|
||
continue;
|
||
}
|
||
$hasChildren = !empty($menuItem['children']);
|
||
$routeName = false;
|
||
$link = '#';
|
||
if(!$hasChildren) {
|
||
$routeName = "{$menuRouteNamePrefix}{$parentItem->getSlug()}";
|
||
$action = "{$menuItem['controller']}@$menuItemControllerHandlingMethod";
|
||
//註冊Route
|
||
Route::get($parentItem->getSlug(), $action)->name($routeName);
|
||
}
|
||
//註冊選單項目
|
||
$adminMenu->addItem([
|
||
'type' => 'item',
|
||
'parentSlug' => false,
|
||
'routeName' => $routeName,
|
||
], $parentItem);
|
||
if($hasChildren) {
|
||
foreach((array)$menuItem['children'] as $childMenuItem) {
|
||
if(class_exists($childMenuItem)) {
|
||
/**
|
||
* @var \App\Http\Controllers\Admin\Menu\BaseMenuItemController $childItem
|
||
*/
|
||
$childItem = new $childMenuItem;
|
||
if(!$childItem->isValid()) {
|
||
continue;
|
||
}
|
||
$routeName = "{$menuRouteNamePrefix}{$parentItem->getSlug()}.{$childItem->getSlug()}";
|
||
$action = "$childMenuItem@$menuItemControllerHandlingMethod";
|
||
//註冊Route
|
||
Route::get("{$parentItem->getSlug()}/{$childItem->getSlug()}", $action)->name($routeName);
|
||
//註冊選單項目
|
||
$adminMenu->addItem([
|
||
'type' => 'item',
|
||
'parentSlug' => $parentItem->getSlug(),
|
||
'routeName' => $routeName,
|
||
], $childItem);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
} elseif($menuItem['type'] == 'title') {
|
||
$adminMenu->addItem([
|
||
'type' => 'title',
|
||
'name' => $menuItem['name']
|
||
]);
|
||
} elseif($menuItem['type'] == 'divider') {
|
||
$adminMenu->addItem([
|
||
'type' => 'divider',
|
||
]);
|
||
}
|
||
}
|
||
});
|
||
}
|
||
}
|