sir*_*ros 5 html php mysql crud laravel
我正在尝试使用Route Model Binding进行简单CRUD但更新和删除功能不起作用.我正在使用laravel 5.5
Route::resource('admin/file','AdminController');
Run Code Online (Sandbox Code Playgroud)
我的编辑和删除按钮视图
<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>
Run Code Online (Sandbox Code Playgroud)
我的资源控制器:
namespace App\Http\Controllers;
use App\Files;
use Illuminate\Http\Request;
Run Code Online (Sandbox Code Playgroud)
存储工作正常
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'));
}
Run Code Online (Sandbox Code Playgroud)
但编辑和删除不起作用
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'));
}
Run Code Online (Sandbox Code Playgroud)
我的型号:
protected $table='files';
protected $fillable=[
'title','body','price','linkFile'
];
Run Code Online (Sandbox Code Playgroud)
当我删除按钮时没有任何事情发生并编辑为相同
如果我dd($files)
在第一列添加编辑和删除功能然后响应将是[]
和句柄没有错误
在这里我的路线列表
有人可以帮忙吗?
sir*_*ros 19
终于在2天之后我找到了答案,我想把答案放在这里给每个可能有我问题的人
要使路由绑定工作,您应该具有类型提示的变量名称与路径段名称匹配,如所需的文档:
例如我的编辑功能:
这是我的Edit URI
admin/file/{file}/edit
Run Code Online (Sandbox Code Playgroud)
你可以看到有{file}
参数或你调用的任何东西现在只需要在函数参数中写出完全$文件
public function edit(Files $file)
{
return view('admin.edit',compact('file'));
}
Run Code Online (Sandbox Code Playgroud)
对不起如果我的英语很差
Chr*_*her 14
I\xc2\xb4ve stumbled across this again. I\xc2\xb4m not sure if this was my own mistake or if this middlerware is missing by default.
\n我正在使用 Laravel 8 并开发一个 API。当我尝试调用应该隐式绑定到模型的路由时,我总是得到一个空数组作为响应。
\nTL;DRKernel.php
\n检查文件是否$routedMiddlewareGroups
api array has the SubstituteBindings::class
added to it. Otherwise your requests won\xc2\xb4t get resolved correctly.
对API的请求 | 通过 ID 获取用户 | 前端、Vue.js
\nUserComponent.vue
methods: {\n close() {\n $('#user-modify-modal').modal('hide');\n },\n open() {\n $('#user-modify-modal').modal({backdrop: 'static', keyboard: false});\n\n this.fetchUserData(this.params.id);\n },\n async fetchUserData(id) {\n await axios\n .get('users/${this.params.id}')\n .then((result) => {\n this.user = result.data;\n }).catch((err) => {\n console.error(err);\n });\n }\n },\n
Run Code Online (Sandbox Code Playgroud)\n以下是我设置 API 保护路由的方法:
\n路线/api.php
//protected routes | API\nRoute::group(['middleware' => ['api', 'cors', 'json.response', 'auth:api'], 'prefix' => 'v1'], function() {\n Route::post('/logout', [ApiLoginController::class, 'logout']);\n\n Route::get('/user', function (Request $request) {\n return $request->user();\n });\n Route::get('/users', [UserController::class, 'index']);\n //the function im Testing...\n Route::get('users/{user}', [UserController::class, 'show']);\n Route::post('/users', [UserController::class, 'store']);\n Route::put('/users/{user}', [UserController::class, 'update']);\n Route::delete('/users/{user}', [UserController::class, 'show']);\n});\n
Run Code Online (Sandbox Code Playgroud)\nUserController.php
...\n/**\n * Get user by ID\n *\n * @param Request $request\n * @param User $user\n * @return void\n */\n public function show(User $user) {\n\n return response()->json($user);\n }\n...\n
Run Code Online (Sandbox Code Playgroud)\n如果没有这个中间件,SubstituteBinding::class
隐式绑定将无法工作!
确保检查您的内核/api 设置
\nKernel.php
/**\n * The application's route middleware groups.\n *\n * @var array\n */\n protected $middlewareGroups = [\n 'web' => [\n \\App\\Http\\Middleware\\EncryptCookies::class,\n \\Illuminate\\Cookie\\Middleware\\AddQueuedCookiesToResponse::class,\n \\Illuminate\\Session\\Middleware\\StartSession::class,\n //\\Illuminate\\Session\\Middleware\\AuthenticateSession::class,\n \\Illuminate\\View\\Middleware\\ShareErrorsFromSession::class,\n \\App\\Http\\Middleware\\VerifyCsrfToken::class,\n \\Illuminate\\Routing\\Middleware\\SubstituteBindings::class,\n ],\n\n 'api' => [\n 'throttle:120,1',\n EncryptCookies::class,\n AddQueuedCookiesToResponse::class,\n \\Illuminate\\Session\\Middleware\\StartSession::class,\n\n \\Illuminate\\Routing\\Middleware\\SubstituteBindings::class,\n ],\n ];\n
Run Code Online (Sandbox Code Playgroud)\n现在打电话时
\nhttp://localhost/api/v1/users/1\n
Run Code Online (Sandbox Code Playgroud)\n它返回正确的用户数据。
\n我知道这个问题已经有了解决方案,但让我补充一些可能对其他人有用的知识......
正如文档所说,当使用资源控制器时,资源路由将使用基于资源“单一化”名称的参数。在这个问题的情况下,由于@siros 在路由中使用了“文件”资源名称(单数形式),控制器方法中的绑定名称应该是“文件”,尽管他的模型名为Files
. 如果他试图使用:
Route::resource('admin/files','AdminController');
Run Code Online (Sandbox Code Playgroud)
控制器仍然需要Files $file
工作,因为file
是 的单数形式files
。
但是,该问题还有其他(更优雅的)解决方案。您可以通过提供一个更改URL类型,暗示变量parameters
在路由的配置选项,如图所示的文件中,这将自动申请show
,edit
,update
和destroy
方法。例如,这将使您在控制器中保留与模型名称匹配的变量名称。
所以,在这种情况下,@siros 可以在路由文件中使用它:
Route::resource('admin/file','AdminController', [
'parameters' => [
'file' => 'files'
]
]);
Run Code Online (Sandbox Code Playgroud)
他可以在控制器中使用它:
public function edit(Files $files)
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助某人。
归档时间: |
|
查看次数: |
1800 次 |
最近记录: |