深入研究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
以下是其中的一部分:
我对Laravel很陌生。这是第一个项目。也许我错过了什么?
提前感谢大家的帮助。
答案 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';
就是这样。
再次感谢大家的宝贵帮助。