Laravel-控制器命名空间不起作用

时间:2019-01-20 21:32:40

标签: php laravel api controller routing

几周前,我开始与Laravel合作。这是一个很棒的框架,特别是出于我的目的。

但是在这一点上,我对Laravel的功能感到困惑。 (我不太确定,是否是PHP或Laravel问题)。

我想为我的Web应用程序开发API。为了保持我的应用程序结构整洁,我将所有API控制器与其他API控制器分开,因此我为新的控制器赋予了新的命名空间。

当我给我的控制器命名空间"App\Http\Controllers\API"时,事情变得很奇怪。它只是给我一个空白站点,与代码无关。

但是当我从命名空间("App\Http\Controllers")中删除API时,Controller会工作并生成正确的输出。

因此,此代码不起作用:

<?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 :(得分:2)

为了能够使用该名称空间,应将这些控制器放在Controllers下的API文件夹中。

app/Http/Controllers/API将拥有所有的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');