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; } }