我正在构建一个应用程序,使用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中间件
答案 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'));
}