Laravel无法解析模型

时间:2019-09-09 16:57:43

标签: php laravel laravel-5.8 route-model-binding

我正在构建一个应用程序,使用laravel 5.8作为后端来跟踪费用。 当我尝试访问控制器上的show方法时,我发现laravel给了我一个模型的新实例,而不是获取与提供的id匹配的那个实例。

我尝试检查从URI获取的实际值,该值是正确的,并且还手动查询以查看它是否有任何结果,是否确实如此。 我还检查了所有正确书写的名称(检查复数形式和单数形式)。

使用return Expense::all()的索引方法可以正常工作。

该模型为空,仅具有$guarded属性。

这是位于 routes / api.php

的路由文件
Route::apiResource('expenses', 'ExpenseController');

这是位于 app / Http / Controllers / ExpenseController.php

的控制器
namespace App\Http\Controllers;

use App\Models\Expense;

class ExpenseController extends Controller
{
    public function show(Expense $expense)
    {
        return Expense:findOrFail($expense->getKey()); // key is null since it's a fresh model
    }
}
public function show($expense)
{
    //dd($expense); //Shows the id given on the URI
    return Expense::where('id', $expense)->firstOrFail(); //Works!
}

费用模式

namespace App\Models;

use App\Model;

class Expense extends Model
{
    protected $guarded = [
        'id'
    ];
}

我希望获取具有给定id的模型的JSON数据,但我会得到一个$exists = false的新模型,而不会出现404错误。

我还在使用laravel / telescope,它显示了以200代码完成的请求,没有进行任何查询。

使用dd时的响应

Expense {#378 ▼
  #guarded: array:1 [▶]
  #connection: null
  #table: null
  #primaryKey: "id"
  #keyType: "int"
  +incrementing: true
  #with: []
  #withCount: []
  #perPage: 15
  +exists: false
  +wasRecentlyCreated: false
  #attributes: []
  #original: []
  #changes: []
  #casts: []
  #dates: []
  #dateFormat: null
  #appends: []
  #dispatchesEvents: []
  #observables: []
  #relations: []
  #touches: []
  +timestamps: true
  #hidden: []
  #visible: []
  #fillable: []
}

这是整个类 app \ Model.php

<?php

namespace App;

use Illuminate\Database\Eloquent\Collection;
use Illuminate\Database\Eloquent\Model as BaseModel;

/**
 * Class Model
 * @package App
 * @method static static|null find($id)
 * @method static static findOrFail($id)
 * @method static static create(array $data)
 * @method static Collection all()
 */
class Model extends BaseModel
{

}

修复:我缺少RouteServiceProvider中的Web中间件

1 个答案:

答案 0 :(得分:1)

由于我在路由中使用了 routes / api.php 文件,因此需要将 api 中间件更改为网络位于 app / Providers 内部的RouteServiceProvider文件中的一个。

代码部分需要更改:

/**
     * Define the "api" routes for the application.
     *
     * These routes are typically stateless.
     *
     * @return void
     */
    protected function mapApiRoutes()
    {
        Route::prefix('api')
             //->middleware('api')
             ->middleware('web')
             ->namespace($this->namespace)
             ->group(base_path('routes/api.php'));
    }