[英]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)
以進行編輯和刪除功能,則響應將為[]
並且句柄沒有錯誤
這是我的路線清單
任何人都可以幫忙嗎?
最后,2 天后我找到了我的答案,我想在這里為每個可能有同樣問題的人提供我的答案。
要使路由綁定工作,您應該讓類型提示的變量名稱與路由段名稱匹配,如文檔要求:
例如我的編輯方法
這里是我的路由 URI 進行編輯
admin/file/{file}/edit
正如你所看到的,有{file}
參數或任何你現在調用的東西只需要在函數參數中准確寫入$file
public function edit(Files $file)
{
return view('admin.edit',compact('file'));
}
我知道這個問題已經有了解決方案,但讓我補充一些可能對其他人有用的知識......
正如文檔所說,當使用資源控制器時,資源路由將使用基於資源“單一化”名稱的參數。 在這個問題的情況下,由於@siros 在路由中使用了“文件”資源名稱(單數形式),控制器方法中的綁定名稱應該是“文件”,盡管他的模型被命名為Files
。 如果他試圖使用:
Route::resource('admin/files','AdminController');
控制器仍然需要Files $file
才能工作,因為file
是files
的單數形式。
但是,該問題還有其他(更優雅的)解決方案。 您可以通過在路由配置中提供parameters
選項來更改 URL 中的類型提示變量,如文檔中所示,它將自動應用於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
它返回正確的用戶數據。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.