Laravel - Пространство имен контроллера не работает - PullRequest
0 голосов
/ 21 января 2019

Я начал развиваться с Laravel несколько недель назад. Это отличная структура, особенно для моих целей.

Но в этот момент я запутался в функциональности Laravel. (Я не совсем уверен, если это проблема PHP или Laravel).

Я хочу разработать API для моего веб-приложения. Чтобы поддерживать чистоту своей структуры приложения, я отделяю все контроллеры API от других, по этой причине я дал новым контроллерам новое пространство имен.

Когда я дал моему контроллеру пространство имен "App\Http\Controllers\API", все пошло странно. Это просто дает мне пустой сайт, независимо от кода.

Но когда я удаляю API из пространства имен ("App\Http\Controllers"), контроллер работает и генерирует правильный вывод.

Итак, этот код не работает:

<?php

namespace App\Http\Controllers\API;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Response;
use App\Room;
use App\Http\Resources\Room as RoomResource;

class RoomsController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        $room = Room::all();
        return Response::json($room);
    }
}

И у меня работает этот Код:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Response;
use App\Room;
use App\Http\Resources\Room as RoomResource;

class RoomsAPIController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        $room = Room::all();
        return Response::json($room);
    }
}

Я просто хочу знать, что я делаю не так. Второй метод работает, но кажется, что это «быстрое и грязное» решение.

1 Ответ

0 голосов
/ 21 января 2019

Чтобы вы могли использовать это пространство имен, вы должны поместить эти контроллеры в папку API в разделе «Контроллеры».

app/Http/Controllers/API будет иметь все ваши контроллеры API, и каждый из них в этой папке должен будет добавить эти строки вверху:

<?php

namespace App\Http\Controllers\API;

use App\Http\Controllers\Controller;

Тогда в вашем app/Providers/RouteServiceProvider.php файле вам также потребуется изменить пространство имен следующим образом:

protected function mapApiRoutes()
{
    Route::prefix('api')
         ->middleware('api')
         ->namespace('App\Http\Controllers\API') // <-- HERE
         ->group(base_path('routes/api.php'));
}

Тогда вы можете использовать свои маршруты, как обычно, так:

Route::get('rooms', 'RoomsAPIController@index')->name('rooms.index');

Или вы можете просто добавить API\ перед всеми вашими действиями на маршруте, например:

Route::get('rooms', 'API\RoomsAPIController@index')->name('rooms.index');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...