几周前,我开始与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);
}
}
我只想知道我在做什么错。第二种方法可行,但似乎是“快速而肮脏的”解决方案。
答案 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');