路径模型绑定不起作用

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)

对不起如果我的英语很差

  • 这也解决了我的问题。这是隐藏在文档中的重要信息 (3认同)
  • 这也对我有帮助。我在控制器中有一个驼峰版本的变量,但无法解析。谢谢! (2认同)

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。当我尝试调用应该隐式绑定到模型的路由时,我总是得到一个空数组作为响应。

\n

TL;DRKernel.php \n检查文件是否$routedMiddlewareGroups api array has the SubstituteBindings::class added to it. Otherwise your requests won\xc2\xb4t get resolved correctly.

\n

对API的请求 | 通过 ID 获取用户 | 前端、Vue.js

\n

UserComponent.vue

\n
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

\n
//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)\n

UserController.php

\n
...\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隐式绑定将无法工作!

\n

确保检查您的内核/api 设置

\n

Kernel.php

\n
 /**\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

现在打电话时

\n
http://localhost/api/v1/users/1\n
Run Code Online (Sandbox Code Playgroud)\n

它返回正确的用户数据。

\n


Cle*_*ara 9

我知道这个问题已经有了解决方案,但让我补充一些可能对其他人有用的知识......

正如文档所说,当使用资源控制器时,资源路由将使用基于资源“单一化”名称的参数。在这个问题的情况下,由于@siros 在路由中使用了“文件”资源名称(单数形式),控制器方法中的绑定名称应该是“文件”,尽管他的模型名为Files. 如果他试图使用:

Route::resource('admin/files','AdminController');
Run Code Online (Sandbox Code Playgroud)

控制器仍然需要Files $file工作,因为file是 的单数形式files

但是,该问题还有其他(更优雅的)解决方案。您可以通过提供一个更改URL类型,暗示变量parameters在路由的配置选项,如图所示的文件中,这将自动申请showeditupdatedestroy方法。例如,这将使您在控制器中保留与模型名称匹配的变量名称。

所以,在这种情况下,@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)

希望这可以帮助某人。