当我删除初始使用Illuminate \ Http \ Request 并在Controller文件中添加使用App \ Item 时,items / create route会以404响应。我怎样才能使用 App \ Item 命名空间并获取items / create route?我尝试过添加两者,但不起作用。
web.php
Route::get('items', 'ItemsController@index');
Route::get('items/{item}', 'ItemsController@show');
Route::get('items/create', 'ItemsController@create');
ItemsController.php
<?php
namespace App\Http\Controllers;
use App\Item;
class ItemsController extends Controller
{
public function index(){
$items = Item::all();
return view('items.index', ['items' => $items]);
}
public function show(Item $item){
return $item->body;
}
public function create(){
return view('items.create');
}
}
Item.php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Item extends Model
{
//
}
答案 0 :(得分:3)
问题是laravel尝试按照声明的顺序匹配路由,items/{item}
路由将匹配以items/
开头的所有路由,包括items/create
。由于路由模型绑定,Laravel尝试加载标识为Item
的{{1}},显然不存在,因此会抛出404错误。
the docs中的路线模型绑定:
由于
create
变量是类型提示的$user
Eloquent模型 并且变量名称与App\User
URI段匹配,Laravel将 自动注入具有与之匹配的ID的模型实例 来自请求URI的相应值。如果是匹配的模型实例 在数据库中找不到,会自动发出404 HTTP响应 生成。
要解决此问题,只需更改路线的顺序,然后将{user}
放在所有其他items/{item}
路线之后:
item/*
答案 1 :(得分:0)
请你试试这个。
<?php
namespace App\Http\Controllers;
use App\Item;
class ItemsController extends Controller
{
public function index(){
$items = Item::all();
return view('items.index', ['items' => $items]);
}
public function show($id){
$item= Item::find($id);
return $item->body;
}
public function create(){
return view('items.create');
}
}