Компонент Laravel 7 routes возвращает пустые страницы, когда пространство имен промежуточного программного обеспечения начинается с Api \\ - PullRequest
0 голосов
/ 13 июля 2020

Я использую несколько компонентов из laravel 7, и illuminate/routing - один из них.

Все работало так гладко, как можно было бы просить, пока я не хотел добавить маршрут get внутрь группа, к которой прикреплено промежуточное ПО.

группа выглядит так:

$router->middleware([Api\Middleware\Auth::class])->namespace('Api\Controllers')->group(function() use ($router){
    // returns a session token
    $router->post('user/login', ['uses' => 'UsersController@login'])->withoutMiddleware([Api\Middleware\Auth::class]);

    // should return a list with all categories
    $router->get('category/list', ['uses' => '\App\Controllers\CategoriesController@list']);

});

Вот проблема:

У меня есть два пространства имен: App\\ которые имеет свои корни в папке src/ и Api\\, который имеет как root api/src папку.

Структура папок:

root - 
     - src 
          - controllers
          - models
          - middleware
     - api 
          - src 
               - controllers
               - models
               - middleware

Проблема в том, что если я прикреплю * Промежуточное ПО 1021 * для этой группы routes, маршрут, который указывает на CategoriesController@list, вернет пустую страницу. НО, если я сделаю ТОЧНУЮ копию Api\Middleware\Auth в App\Middleware пространство имен, этот маршрут будет работать. Другими словами, приведенный выше код вернет что-то только для первого маршрута, но пустую страницу для второго маршрута. Вот код, который работает для обоих маршрутов:

$router->middleware([App\Middleware\Auth::class])->namespace('Api\Controllers')->group(function() use ($router){
    // returns a session token
    $router->post('user/login', ['uses' => 'UsersController@login'])->withoutMiddleware([Api\Middleware\Auth::class]);

    // should return a list with all categories
    $router->get('category/list', ['uses' => '\App\Controllers\CategoriesController@list']);

});

Но, конечно, мне нужно это Auth промежуточное ПО только внутри api, а не для всего приложения.

Вот мой Auth промежуточное ПО (очень базовое c):

// this namespace changes from Api\ to App\ when copied over from api/src to src/
namespace Api\Middleware;

use Closure;

use Illuminate\Http\Request;

class Auth{

    public function handle(Request $request, Closure $next){

        return $next($request);
    }

}

А вот мой CategoriesController метод:

namespace Api\Controllers;

use Illuminate\Routing\Controller;
use Illuminate\Http\Request;

use App\Models\Category;

class CategoriesController extends Controller{

    public $categories;

    public function list(Request $request){
        return ['foo', 'bar', 'xyz'];
    }

}

Почему он возвращает пустую страницу, когда пространство имен для Auth промежуточное ПО начинается с Api\\, но работает, когда создается копия того же самого промежуточного ПО с пространством имен App\\?

Является ли Api\\ своего рода зарезервированным ключевым словом, которое laravel обрабатывает по-другому?

Что можно было сделать?

Спасибо! : D

...