container = $app; $this->apps = (array) config('admin.multi_app'); } /** * 设置当前应用配置. * * @param string $app */ public function switch(string $app = null) { $this->withName($app); $this->withConfig($this->name); } /** * 设置应用名称. * * @param string $app */ public function withName(string $app) { $this->name = $app; } /** * 获取当前应用名称. * * @return string */ public function getName() { return $this->name ?: static::DEFAULT; } /** * 注册应用. */ public function boot() { $this->registerRoute(static::DEFAULT); if ($this->apps) { $this->registerMultiAppRoutes(); $this->switch(static::DEFAULT); } } /** * 注册路由. * * @param string|\Closure $pathOrCallback */ public function routes($pathOrCallback) { $this->loadRoutesFrom($pathOrCallback, static::DEFAULT); if ($this->apps) { foreach ($this->apps as $app => $enable) { if ($enable) { $this->switch($app); $this->loadRoutesFrom($pathOrCallback, $app); } } $this->switch(static::DEFAULT); } } protected function registerMultiAppRoutes() { foreach ($this->apps as $app => $enable) { if ($enable) { $this->registerRoute($app); } } } /** * @return string */ public function getCurrentApiRoutePrefix() { return $this->getApiRoutePrefix($this->getName()); } /** * @param string|null $app * * @return string */ public function getApiRoutePrefix(?string $app) { return "dcat.api.{$app}."; } /** * 注册应用路由. * * @param string|null $app */ protected function registerRoute(?string $app) { $this->switch($app); $this->loadRoutesFrom(function () use ($app) { Admin::registerApiRoutes($this->getApiRoutePrefix($app)); }, $app); if (is_file($routes = admin_path('routes.php'))) { $this->loadRoutesFrom($routes, $app); } } /** * 设置应用配置. * * @param string $app */ protected function withConfig(string $app) { if (! isset($this->configs[$app])) { $this->configs[$app] = config($app); } config(['admin' => $this->configs[$app]]); } /** * 加载路由文件. * * @param string $path * @param string $app * * @return void */ protected function loadRoutesFrom($path, ?string $app) { if (! $this->container->routesAreCached()) { Route::middleware('admin.app:'.$app)->group($path); } } }