150 lines
4.5 KiB
PHP
150 lines
4.5 KiB
PHP
<?php
|
|
|
|
namespace App\Services\Admin;
|
|
|
|
use App\Exceptions\AdminMenuItemArgInvalidException;
|
|
use App\Http\Controllers\Admin\Menu\BaseMenuItemController;
|
|
use Composer\Util\Git;
|
|
use Validator;
|
|
use Arr;
|
|
use Route;
|
|
|
|
/**
|
|
* 存放Admin主選單項目
|
|
*
|
|
* Class MainMenuItemHandler
|
|
* @package App\Handlers\Admin
|
|
*/
|
|
class MainMenuItemService
|
|
{
|
|
private $menu = [];
|
|
|
|
private $allowedItemTypes = [
|
|
'item',
|
|
'title',
|
|
'divider'
|
|
];
|
|
|
|
private $adminRouteNamePrefix;
|
|
|
|
public function __construct()
|
|
{
|
|
$this->adminRouteNamePrefix = config('admin.route_name_prefix');
|
|
}
|
|
|
|
/**
|
|
* 驗證新增選單項目方法參數
|
|
*
|
|
* @param $args
|
|
* @throws AdminMenuItemArgInvalidException
|
|
*/
|
|
private function validateItemArgs($args)
|
|
{
|
|
$validator = Validator::make($args, [
|
|
'type' => 'required',
|
|
'name' => 'required_if:type,title',
|
|
'slug' => 'required_if:type,item',
|
|
'controller' => 'required_if:type,item',
|
|
'routeName' => 'required_if:type,item',
|
|
]);
|
|
if($validator->fails()) {
|
|
throw new AdminMenuItemArgInvalidException($validator->getMessageBag()->first());
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 新增選單項目
|
|
*
|
|
* @param array $givenArgs
|
|
* @param BaseMenuItemController $menuItemController;
|
|
* @throws AdminMenuItemArgInvalidException
|
|
*/
|
|
public function addItem($givenArgs, BaseMenuItemController $menuItemController = null)
|
|
{
|
|
|
|
$args = [
|
|
'slug' => null,
|
|
'routeName' => null,
|
|
'link' => null,
|
|
'iconClass' => null,
|
|
'badge' => null,
|
|
'controller' => null,
|
|
'parentSlug' => null,
|
|
];
|
|
|
|
if($givenArgs['type'] == 'item' && $menuItemController) {
|
|
$givenArgs['slug'] = $menuItemController->getSlug();
|
|
$givenArgs['iconClass'] = $menuItemController->getIconClass();
|
|
$givenArgs['badge'] = $menuItemController->getBadge();
|
|
$givenArgs['controller'] = $menuItemController;
|
|
}
|
|
|
|
$this->validateItemArgs($givenArgs);
|
|
|
|
foreach ($givenArgs as $key => $value) {
|
|
$args = Arr::add($args, $key, $value);
|
|
}
|
|
|
|
if(in_array($args['type'], $this->allowedItemTypes)) {
|
|
if($args['parentSlug']) {
|
|
Arr::set($this->menu, "{$args['parentSlug']}.children.{$args['slug']}", $args);
|
|
} else {
|
|
if($args['type'] == 'item') {
|
|
$this->menu[$args['slug']] = $args;
|
|
} else {
|
|
$this->menu[] = $args;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 取得選單項目
|
|
*
|
|
* @return array
|
|
*/
|
|
public function getMenu()
|
|
{
|
|
foreach ($this->menu as $parentSlug => $parentItem) {
|
|
if($parentItem['controller']) {
|
|
$userHasParentPermission = $parentItem['controller']->userHasPermission();
|
|
Arr::set($this->menu, "$parentSlug.userHasPermission", $userHasParentPermission);
|
|
|
|
Arr::set($this->menu, "$parentSlug.name", $parentItem['controller']->getName());
|
|
|
|
$parentRouteName = $this->adminRouteNamePrefix . $parentItem['routeName'];
|
|
$link = Route::has($parentRouteName) ? route($parentRouteName) : '#';
|
|
Arr::set($this->menu, "$parentSlug.link", $link);
|
|
|
|
if(!empty($parentItem['children'])) {
|
|
foreach ($parentItem['children'] as $childSlug => $childItem) {
|
|
if($childItem['controller']) {
|
|
Arr::set($this->menu,
|
|
"$parentSlug.children.$childSlug.userHasPermission",
|
|
$userHasParentPermission && $childItem['controller']->userHasPermission());
|
|
|
|
Arr::set($this->menu, "$parentSlug.children.$childSlug.name", $childItem['controller']->getName());
|
|
|
|
$childRouteName = $this->adminRouteNamePrefix . $childItem['routeName'];
|
|
$link = Route::has($childRouteName) ? route($childRouteName) : '#';
|
|
Arr::set($this->menu, "$parentSlug.children.$childSlug.link", $link);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return $this->menu;
|
|
}
|
|
|
|
/**
|
|
* 設定選單項目
|
|
*
|
|
* @param $menu
|
|
*/
|
|
public function setMenu($menu)
|
|
{
|
|
$this->menu = $menu;
|
|
}
|
|
|
|
}
|