cms/app/Services/Admin/MainMenuItemService.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;
}
}