路由Laravel namepsace问题

时间:2017-07-09 03:40:31

标签: php laravel

当我删除初始使用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
{
    //
}

2 个答案:

答案 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');
    }
}