Skip to content

Commit

Permalink
feat!: make controller loading compatible with single action controll…
Browse files Browse the repository at this point in the history
…er implementation style
  • Loading branch information
Mohammad-Alavi committed Feb 18, 2023
1 parent b827569 commit f48df54
Showing 1 changed file with 36 additions and 65 deletions.
101 changes: 36 additions & 65 deletions Loaders/RoutesLoaderTrait.php
Original file line number Diff line number Diff line change
Expand Up @@ -33,55 +33,58 @@ public function runRoutesAutoLoader(): void
*/
private function loadApiContainerRoutes(string $containerPath): void
{
// Build the container api routes path
$apiRoutesPath = $containerPath . '/UI/API/Routes';
// Build the namespace from the path
$controllerNamespace = $containerPath . '\\UI\API\Controllers';
$apiRoutesPath = $this->getRoutesPathForUI($containerPath, 'API');

if (File::isDirectory($apiRoutesPath)) {
$files = File::allFiles($apiRoutesPath);
$files = Arr::sort($files, function ($file) {
return $file->getFilename();
});
$files = $this->getFilesSortedByName($apiRoutesPath);
foreach ($files as $file) {
$this->loadApiRoute($file, $controllerNamespace);
$this->loadApiRoute($file);
}
}
}

private function getRoutesPathForUI(string $containerPath, string $ui): string
{
return $this->getUIPathForContainer($containerPath, $ui) . DIRECTORY_SEPARATOR . 'Routes';
}

private function getUIPathForContainer(string $containerPath, string $ui): string
{
return $containerPath . DIRECTORY_SEPARATOR . 'UI' . DIRECTORY_SEPARATOR . $ui;
}

/**
* @param $file
* @param $controllerNamespace
* @param string $apiRoutesPath
* @return array|SplFileInfo[]
*/
private function loadApiRoute($file, $controllerNamespace): void
private function getFilesSortedByName(string $apiRoutesPath): array
{
$files = File::allFiles($apiRoutesPath);
$files = Arr::sort($files, function ($file) {
return $file->getFilename();
});
return $files;
}

private function loadApiRoute(SplFileInfo $file): void
{
$routeGroupArray = $this->getRouteGroup($file, $controllerNamespace);
$routeGroupArray = $this->getApiRouteGroup($file);

Route::group($routeGroupArray, function ($router) use ($file) {
require $file->getPathname();
});
}

/**
* @param $endpointFileOrPrefixString
* @param null $controllerNamespace
*
* @return array
*/
public function getRouteGroup($endpointFileOrPrefixString, $controllerNamespace = null): array
public function getApiRouteGroup(SplFileInfo|string $endpointFileOrPrefixString): array
{
return [
'namespace' => $controllerNamespace,
'middleware' => $this->getMiddlewares(),
'domain' => $this->getApiUrl(),
// If $endpointFileOrPrefixString is a file then get the version name from the file name, else if string use that string as prefix
'prefix' => is_string($endpointFileOrPrefixString) ? $endpointFileOrPrefixString : $this->getApiVersionPrefix($endpointFileOrPrefixString),
];
}

/**
* @return array
*/
private function getMiddlewares(): array
{
return array_filter([
Expand All @@ -90,9 +93,6 @@ private function getMiddlewares(): array
]);
}

/**
* @return null|string
*/
private function getRateLimitMiddleware(): ?string
{
$rateLimitMiddleware = null;
Expand All @@ -108,30 +108,17 @@ private function getRateLimitMiddleware(): ?string
return $rateLimitMiddleware;
}

/**
* @return mixed
*/
private function getApiUrl()
private function getApiUrl(): string
{
return Config::get('apiato.api.url');
}

/**
* @param $file
*
* @return string
*/
private function getApiVersionPrefix($file): string
private function getApiVersionPrefix(SplFileInfo $file): string
{
return Config::get('apiato.api.prefix') . (Config::get('apiato.api.enable_version_prefix') ? $this->getRouteFileVersionFromFileName($file) : '');
}

/**
* @param $file
*
* @return string|bool
*/
private function getRouteFileVersionFromFileName($file): string|bool
private function getRouteFileVersionFromFileName(SplFileInfo $file): string|bool
{
$fileNameWithoutExtension = $this->getRouteFileNameWithoutExtension($file);

Expand All @@ -149,14 +136,9 @@ private function getRouteFileVersionFromFileName($file): string|bool
return $apiVersion;
}

/**
* @param SplFileInfo $file
*
* @return mixed
*/
private function getRouteFileNameWithoutExtension(SplFileInfo $file): mixed
private function getRouteFileNameWithoutExtension(SplFileInfo $file): string
{
return pathinfo($file->getFileName())['filename'];
return pathinfo($file->getFilename(), PATHINFO_FILENAME);
}

/**
Expand All @@ -166,30 +148,19 @@ private function getRouteFileNameWithoutExtension(SplFileInfo $file): mixed
*/
private function loadWebContainerRoutes($containerPath): void
{
// build the container web routes path
$webRoutesPath = $containerPath . '/UI/WEB/Routes';
// build the namespace from the path
$controllerNamespace = $containerPath . '\\UI\WEB\Controllers';
$webRoutesPath = $this->getRoutesPathForUI($containerPath, 'WEB');

if (File::isDirectory($webRoutesPath)) {
$files = File::allFiles($webRoutesPath);
$files = Arr::sort($files, function ($file) {
return $file->getFilename();
});
$files = $this->getFilesSortedByName($webRoutesPath);
foreach ($files as $file) {
$this->loadWebRoute($file, $controllerNamespace);
$this->loadWebRoute($file);
}
}
}

/**
* @param $file
* @param $controllerNamespace
*/
private function loadWebRoute($file, $controllerNamespace): void
private function loadWebRoute(SplFileInfo $file): void
{
Route::group([
'namespace' => $controllerNamespace,
'middleware' => ['web'],
], function ($router) use ($file) {
require $file->getPathname();
Expand Down

0 comments on commit f48df54

Please sign in to comment.