【问题标题】:Route Model Binding not working路由模型绑定不起作用
【发布时间】:2018-02-28 15:09:47
【问题描述】:

我正在尝试将路由模型绑定用于简单的 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) 用于编辑和删除功能,则响应将为[] 并且句柄没有错误

这里是我的路线列表

有人可以帮忙吗?

【问题讨论】:

    标签: php html mysql laravel crud


    【解决方案1】:

    终于,两天后我找到了答案,我想在这里为可能有同样问题的每个人提供我的答案。

    要使路由绑定起作用,您的类型提示变量名称必须与路由占位符名称匹配

    比如我的编辑方法

    这里是我要编辑的路由 URI

    admin/file/{file}/edit
    

    可以看到路由定义中有{file}占位符,所以对应的变量必须叫$file

    public function edit(Files $file)
    {
       return view('admin.edit',compact('file'));
    }
    

    【讨论】:

    • 这也解决了我的问题。这是隐藏在文档中的重要信息
    • 这对我也有帮助。我在控制器中有一个没有解析的变量的驼峰式版本。谢谢!
    • 它就像一个魅力
    【解决方案2】:

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

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

    Route::resource('admin/files','AdminController');
    

    控制器仍然需要Files $file 才能工作,因为filefiles 的单数形式。

    然而,还有其他(更优雅)的解决方案。您可以通过在路由配置中提供parameters 选项来更改URL 中的类型提示变量,如in the documentation 所示,它将自动适用于showeditupdate 和@ 987654332@ 方法。例如,这将使您在控制器中保持变量名称与模型名称匹配。

    因此,在这种情况下,@siros 可以在路由文件中使用它:

    Route::resource('admin/file','AdminController', [
        'parameters' => [
            'file' => 'files'
        ]
    ]);
    

    他可以在控制器中使用它:

    public function edit(Files $files)
    

    希望这对某人有所帮助。

    【讨论】:

    • 这太棒了!正在努力让资源工作。
    • 在 laravel 8 中:Route::resource('file', AdminController::class)-&gt;parameters(['file' =&gt; 'files']);
    【解决方案3】:

    我又偶然发现了这个。我不确定这是我自己的错误还是默认情况下缺少此中间件。

    我正在使用 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
    

    它返回正确的用户数据。

    【讨论】:

    • 这对我有用!非常感谢,我添加了 JWT 身份验证,并设置了不同的防护和中间件。出乎意料,一切都倒下了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-26
    • 1970-01-01
    • 2020-10-03
    • 2016-05-11
    • 2015-04-24
    • 2015-09-20
    • 2012-05-31
    相关资源
    最近更新 更多