Laravel 5.6-路由api资源404错误

时间:2018-07-23 11:18:20

标签: php laravel laravel-5

深入研究official docs,我读到有关使用apiResources来更精确地定义API控制器的路由-尤其是如果它们不包含任何HTML。是我的情况。

我在一个Laravel 5.6项目中,该项目使用AJAX来获取 Vue 组件中的数据。直到今天,我一直使用普通控制器-放在/app/Http/Controllers中,并在Route::resources中声明/routes/web.php

直到今天,当我尝试将它们重构为文档时,它一直运行良好,就像这样:

/app/Http/Controllers/API/ItemController.php

<?php

// Definizione Namespace
// before: App\Http\Controllers;
namespace App\Http\Controllers\API;

use App\Item;
use Illuminate\Http\Request;
// Added after refactoring
use App\Http\Controllers\Controller;
use App\Http\Resources\Item as ItemResource;

class ItemController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        return ItemResource::collection(Item::all());
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        $item = new Item();

        $item->codice = $request->codice;
        $item->data_acquisto = $request->data_acquisto;
        $item->serial = $request->serial;
        $item->labeled = $request->labeled;
        $item->estensione_garanzia = $request->estensione_garanzia;
        $item->stato = $request->stato;
        $item->data_dismissione = $request->data_dismissione;
        $item->codice = $request->codice;

        $item->save();

        return response()->json([
            'success' => 'Item salvato'
        ]);
    }

    /**
     * Display the specified resource.
     *
     * @param  \App\Item  $item
     * @return \Illuminate\Http\Response
     */
    public function show(Item $item)
    {
        //
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \App\Item  $item
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, Item $item)
    {
        //
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  \App\Item  $item
     * @return \Illuminate\Http\Response
     */
    public function destroy(Item $item)
    {
        //
    }
}

/routes/api.php

// Default stuff
[...]

// Resources
Route::apiResources([
    'componente' => 'ComponenteController',
    'condizione' => 'CondizioneController',
    'fornitore' => 'FornitoreController',
    'gruppo' => 'GruppoController',
    'gruppoPermesso' => 'GruppoPermessoController',
    'componente' => 'ComponenteController',
    'item' => 'ItemController',
    'locazione' => 'LocazioneController',
    'permesso' => 'PermessoController',
    'tipologia' => 'TipologiaController',
    'utente' => 'UtenteController'
]);

现在正在加载(在GET / index()上),我收到了一个没有错误消息的异常,并由此抛出:

  

Symfony \ Component \ HttpKernel \ Exception \ NotFoundHttpException

以下是其中的一部分:

enter image description here

我对Laravel很陌生。这是第一个项目。也许我错过了什么?

提前感谢大家的帮助。

2 个答案:

答案 0 :(得分:1)

只是您的答案的补充,我正在寻找解决类似问题的方法。无需更改第17行的$ namespace,而是查看mapApiRoutes()并在那里调整名称空间。

->namespace($this->namespace . "\API")

这将在api.php中的API /子目录中查找Controllers

其他路由(例如,在web.php中)将保留其原始名称空间。这样,您仍然可以使用常规的非API路由。

答案 1 :(得分:0)

最后,问题解决了。

如@ ts8060所建议,我在AJAX调用的路径中添加了默认的/api前缀。即:

url: '/api/item'指向/app/Http/Controllers/API/ItemController(在这种情况下指向index()方法)。

我完全跳过了提到API前缀的段落(对于有需要的人可以在here中找到)。

另外,正如一个Slack社区用户告诉我的(信用:dadibom),我在第17行的/app/Http/Providers/RouteServiceProvider.php中更改了路径,以便将呼叫重定向到正确的目的地(../Controllers/API文件夹):

来自

protected $namespace = 'App\Http\Controllers';

protected $namespace = 'App\Http\Controllers\API';

就是这样。

再次感谢大家的宝贵帮助。

相关问题