路由模型绑定不起作用
Route Model Binding not working
我正在尝试为简单的 CRUD 使用路由模型绑定,但更新和删除功能不起作用。我正在使用 laravel 5.5
Route::resource('admin/file','AdminController');
我的编辑和删除按钮视图
<a href="{{ route('file.edit', ['id'=>$file->id]) }}">
<form action="{{ route('file.destroy', ['id'=>$file->id]) }}" method="post">
{{method_field('DELETE')}}
{{csrf_field()}}
<button type="submit" class="delete">delete</button>
</form>
我的资源控制器:
namespace App\Http\Controllers;
use App\Files;
use Illuminate\Http\Request;
商店工作正常
public function store(Request $request)
{
$this->validate($request,[
'title'=>'required',
'body'=>'required',
'price'=>'required',
'linkFile'=>'required',
]);
Files::create($request->all());
return redirect(route('file.index'));
}
但是编辑和删除不起作用
public function edit(Files $files)
{
return view('admin.edit',compact('files'))->with('title','Edit File');
}
public function destroy(Files $files)
{
$files->delete();
return redirect(route('file.index'));
}
我的模特:
protected $table='files';
protected $fillable=[
'title','body','price','linkFile'
];
当我删除按钮时没有任何反应并且编辑相同
如果我在第一列添加 dd($files)
用于编辑和删除功能,则响应将是 []
并且 handle
没有错误
这是我的路线列表
有人可以帮忙吗?
终于在2天后找到了我的答案,我想在这里为可能有同样问题的每个人提供我的答案。
要使路由绑定起作用,您的类型提示变量名称必须与路由占位符名称相匹配
比如我的编辑方式
这是我要编辑的路线 URI
admin/file/{file}/edit
可以看到路由定义中有{file}
占位符,所以对应的变量必须调用$file
.
public function edit(Files $file)
{
return view('admin.edit',compact('file'));
}
我知道这个问题已经有了解决方案,但让我补充一些可能对其他人有用的知识...
正如the documentation所说,当使用资源控制器时,资源路由将使用基于资源"singularized"名称的参数。在问题的情况下,由于@siros在路由中使用了"file"资源名称(单数形式),因此控制器方法中的绑定名称应该是"file",尽管他的模型被命名为Files
。如果他试图使用:
Route::resource('admin/files','AdminController');
控制器仍然需要 Files $file
才能工作,因为 file
是 files
的单数形式。
但是,还有其他(更优雅)的方法可以解决这个问题。您可以通过在路由配置中提供 parameters
选项来更改 URL 中的类型提示变量,如 in the documentation 所示,这将自动应用于 show
、edit
、update
和 destroy
方法。例如,这将使您在控制器中保持变量名称与模型名称匹配。
因此,在这种情况下,@siros 可以在路由文件中使用它:
Route::resource('admin/file','AdminController', [
'parameters' => [
'file' => 'files'
]
]);
他可以在控制器中使用这个:
public function edit(Files $files)
希望这对某人有所帮助。
我又偶然发现了这个。我不确定这是我自己的错误还是默认情况下缺少此中间件。
我正在使用 Laravel 8 并开发 API。当我尝试调用一个应该隐式绑定到模型的路由时,我总是得到一个空数组作为响应。
TL;DR
检查 Kernel.php
文件 $routedMiddlewareGroups
api 数组是否添加了 SubstituteBindings::class
。否则您的请求将无法得到正确解决。
请求到API |通过 ID 获取用户 |前端,Vue.js
UserComponent.vue
methods: {
close() {
$('#user-modify-modal').modal('hide');
},
open() {
$('#user-modify-modal').modal({backdrop: 'static', keyboard: false});
this.fetchUserData(this.params.id);
},
async fetchUserData(id) {
await axios
.get('users/${this.params.id}')
.then((result) => {
this.user = result.data;
}).catch((err) => {
console.error(err);
});
}
},
下面是我如何设置 API 受保护的路由:
路线/api.php
//protected routes | API
Route::group(['middleware' => ['api', 'cors', 'json.response', 'auth:api'], 'prefix' => 'v1'], function() {
Route::post('/logout', [ApiLoginController::class, 'logout']);
Route::get('/user', function (Request $request) {
return $request->user();
});
Route::get('/users', [UserController::class, 'index']);
//the function im Testing...
Route::get('users/{user}', [UserController::class, 'show']);
Route::post('/users', [UserController::class, 'store']);
Route::put('/users/{user}', [UserController::class, 'update']);
Route::delete('/users/{user}', [UserController::class, 'show']);
});
UserController.php
...
/**
* Get user by ID
*
* @param Request $request
* @param User $user
* @return void
*/
public function show(User $user) {
return response()->json($user);
}
...
没有这个中间件 SubstituteBinding::class
隐式绑定将无法工作!
确保检查您的内核/api 设置
Kernel.php
/**
* The application's route middleware groups.
*
* @var array
*/
protected $middlewareGroups = [
'web' => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
//\Illuminate\Session\Middleware\AuthenticateSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
'api' => [
'throttle:120,1',
EncryptCookies::class,
AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
];
现在调用时
http://localhost/api/v1/users/1
它 returns 正确的用户数据。
我正在尝试为简单的 CRUD 使用路由模型绑定,但更新和删除功能不起作用。我正在使用 laravel 5.5
Route::resource('admin/file','AdminController');
我的编辑和删除按钮视图
<a href="{{ route('file.edit', ['id'=>$file->id]) }}">
<form action="{{ route('file.destroy', ['id'=>$file->id]) }}" method="post">
{{method_field('DELETE')}}
{{csrf_field()}}
<button type="submit" class="delete">delete</button>
</form>
我的资源控制器:
namespace App\Http\Controllers;
use App\Files;
use Illuminate\Http\Request;
商店工作正常
public function store(Request $request)
{
$this->validate($request,[
'title'=>'required',
'body'=>'required',
'price'=>'required',
'linkFile'=>'required',
]);
Files::create($request->all());
return redirect(route('file.index'));
}
但是编辑和删除不起作用
public function edit(Files $files)
{
return view('admin.edit',compact('files'))->with('title','Edit File');
}
public function destroy(Files $files)
{
$files->delete();
return redirect(route('file.index'));
}
我的模特:
protected $table='files';
protected $fillable=[
'title','body','price','linkFile'
];
当我删除按钮时没有任何反应并且编辑相同
如果我在第一列添加 dd($files)
用于编辑和删除功能,则响应将是 []
并且 handle
这是我的路线列表
有人可以帮忙吗?
终于在2天后找到了我的答案,我想在这里为可能有同样问题的每个人提供我的答案。
要使路由绑定起作用,您的类型提示变量名称必须与路由占位符名称相匹配
比如我的编辑方式
这是我要编辑的路线 URI
admin/file/{file}/edit
可以看到路由定义中有{file}
占位符,所以对应的变量必须调用$file
.
public function edit(Files $file)
{
return view('admin.edit',compact('file'));
}
我知道这个问题已经有了解决方案,但让我补充一些可能对其他人有用的知识...
正如the documentation所说,当使用资源控制器时,资源路由将使用基于资源"singularized"名称的参数。在问题的情况下,由于@siros在路由中使用了"file"资源名称(单数形式),因此控制器方法中的绑定名称应该是"file",尽管他的模型被命名为Files
。如果他试图使用:
Route::resource('admin/files','AdminController');
控制器仍然需要 Files $file
才能工作,因为 file
是 files
的单数形式。
但是,还有其他(更优雅)的方法可以解决这个问题。您可以通过在路由配置中提供 parameters
选项来更改 URL 中的类型提示变量,如 in the documentation 所示,这将自动应用于 show
、edit
、update
和 destroy
方法。例如,这将使您在控制器中保持变量名称与模型名称匹配。
因此,在这种情况下,@siros 可以在路由文件中使用它:
Route::resource('admin/file','AdminController', [
'parameters' => [
'file' => 'files'
]
]);
他可以在控制器中使用这个:
public function edit(Files $files)
希望这对某人有所帮助。
我又偶然发现了这个。我不确定这是我自己的错误还是默认情况下缺少此中间件。
我正在使用 Laravel 8 并开发 API。当我尝试调用一个应该隐式绑定到模型的路由时,我总是得到一个空数组作为响应。
TL;DR
检查 Kernel.php
文件 $routedMiddlewareGroups
api 数组是否添加了 SubstituteBindings::class
。否则您的请求将无法得到正确解决。
请求到API |通过 ID 获取用户 |前端,Vue.js
UserComponent.vue
methods: {
close() {
$('#user-modify-modal').modal('hide');
},
open() {
$('#user-modify-modal').modal({backdrop: 'static', keyboard: false});
this.fetchUserData(this.params.id);
},
async fetchUserData(id) {
await axios
.get('users/${this.params.id}')
.then((result) => {
this.user = result.data;
}).catch((err) => {
console.error(err);
});
}
},
下面是我如何设置 API 受保护的路由:
路线/api.php
//protected routes | API
Route::group(['middleware' => ['api', 'cors', 'json.response', 'auth:api'], 'prefix' => 'v1'], function() {
Route::post('/logout', [ApiLoginController::class, 'logout']);
Route::get('/user', function (Request $request) {
return $request->user();
});
Route::get('/users', [UserController::class, 'index']);
//the function im Testing...
Route::get('users/{user}', [UserController::class, 'show']);
Route::post('/users', [UserController::class, 'store']);
Route::put('/users/{user}', [UserController::class, 'update']);
Route::delete('/users/{user}', [UserController::class, 'show']);
});
UserController.php
...
/**
* Get user by ID
*
* @param Request $request
* @param User $user
* @return void
*/
public function show(User $user) {
return response()->json($user);
}
...
没有这个中间件 SubstituteBinding::class
隐式绑定将无法工作!
确保检查您的内核/api 设置
Kernel.php
/**
* The application's route middleware groups.
*
* @var array
*/
protected $middlewareGroups = [
'web' => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
//\Illuminate\Session\Middleware\AuthenticateSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
'api' => [
'throttle:120,1',
EncryptCookies::class,
AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
];
现在调用时
http://localhost/api/v1/users/1
它 returns 正确的用户数据。