【问题标题】:Laravel - Controller Namespacing don't workLaravel - 控制器命名空间不起作用
【发布时间】:2019-06-14 07:48:17
【问题描述】:

几周前我开始使用 Laravel 进行开发。这是一个很棒的框架,尤其是对我而言。

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

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

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

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

因此,此代码不起作用:

<?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);
    }
}

我只是想知道,我做错了什么。第二种方法有效,但它似乎是一个“快速而肮脏”的解决方案。

【问题讨论】:

  • 当您将其更改为包含API 时,您是否将其移动到文件系统中?您是否更新了指向新命名空间的路由?

标签: php laravel api controller routing


【解决方案1】:

为了能够使用该命名空间,您应该将这些控制器放在 Controllers 下的 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');

【讨论】:

  • 好的,非常感谢!有用。但它有点奇怪。我的第一次尝试是将我的“api”文件夹重命名为“API”。当我这样做时,PhpStorm 造成了一些严重的混乱,因为此时没有任何效果。但是当我恢复此更改时,它会抛出一个非常有用的异常而不是空白站点。我做了你的更改并将 API\RoomsController@index 更改为 api\RoomsController@index 并且这有效。非常感谢!
  • 没问题,很高兴它有效!我更喜欢将其更改为 Api 以遵守 Laravel 的命名约定。 :)
猜你喜欢
  • 1970-01-01
  • 2015-02-22
  • 2015-07-05
  • 2015-04-12
  • 2014-03-26
  • 2015-04-03
  • 2014-05-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多