Загрузка нескольких пользовательских вложенных маршрутов в Laravel - PullRequest
1 голос
/ 14 апреля 2020

Я создал длинный список файлов пользовательских маршрутов и не могу найти правильный способ их загрузки, и они разделены на несколько папок / вложенных папок в каталоге Routes следующим образом:

Routes:
    custom_routes:
        auth.php
        general.php
        export.php
        admin:
            customers:
                customer.php
                list.php
            users:
                user.php
                // ...
            invoices:
                user.php
                // ...
            settings:
                user.php
                // ...
        front:
            account:
                settings:
                    setting.php
                    account.php
                    //...
            cart:
                cart.php
                //...
            contact:
                contact.php
                //...
    api.php
    channels.php
    console.php
    web.php

Если бы это были всего 1 или 2 дополнительных файла, я бы добавил их, используя RouteServiceProvider, но в этом случае их много и в нескольких уровнях / папках вложенности.

Как я могу сделать это правильно?

1 Ответ

2 голосов
/ 14 апреля 2020

Я думаю, что вы добавили что-то подобное в свой класс / файл помощника.

Получить файлы маршрутов из вложенных каталогов:

function get_route_files($path, $routes) {
    $excludes = ['.', '..', 'channels.php', 'console.php'];
    foreach(scandir($path) as $routeFile) {
        if (in_array($routeFile, $excludes)) {
            continue;
        } else {
            $filePath = $path . '/' . $routeFile;
            if (is_dir($filePath)) {
                $routes = array_merge($routes, get_route_files($filePath, $routes));
            } else {
                    $alias = get_route_file_alias($filePath);
                    $routes[] = ['path' => str_replace('../routes/', '', $filePath), 'alias' => $alias];
            }
        }
    }

    return $routes;
}

Получить псевдонимы для ваших маршрутов:

function get_route_file_alias($path) {
    $alias = '';
    foreach($keys = explode('/', $path) as $i => $key) {
        if (!in_array($key, ['..', 'routes'])) {
            if ($i <= count($keys) - 2) {
                    $alias .= $key . '.';
            }
        }
    }
    return $alias;
}

Затем сопоставьте следующие маршруты с RouteServiceProvider:

protected function mapApiRoutes() {
    $routes = get_route_files('../routes', []);

    foreach($routes as $route) {
        Route::prefix('api')
            // ->middleware($middleware)  -- if there's any
            ->as($route['alias'])
            ->namespace($this->namespace . "\\API")
            ->group($route['path']);
    }
}
...