需要帮助让 resolveRouteBinding 在 Laravel 8 中工作

Need help getting resolveRouteBinding working in Laravel 8

我很难让我的模型上的 resolveRouteBinding 在 Laravel 8.10.0

中工作
    $ php artisan --version
    Laravel Framework 8.10.0

我已经按照 https://laravel.com/docs/8.x/routing#route-model-binding 上的文档添加了我自己的 resolveRouteBinding 方法,但是当我调用路由时它似乎不起作用。我的模型如下:

    <?php

    namespace App\Models;

    use Illuminate\Database\Eloquent\Factories\HasFactory;
    use Illuminate\Database\Eloquent\Model;

    class Post extends Model
    {
        use HasFactory;

        /**
         * Get the user that owns the post.
         */
        public function user()
        {
            return $this->belongsTo('App\Models\User');
        }

        /**
         * Retrieve the model for a bound value.
         *
         * @param  mixed  $value
         * @param  string|null  $field
         * @return \Illuminate\Database\Eloquent\Model|null
         */
        public function resolveRouteBinding($value, $field = null)
        {
            // return $this->find(1)->firstOrFail();
            abort(404);
        }
    }

这是我的Post控制器:

    <?php

    namespace App\Http\Controllers;

    use Illuminate\Http\Request;
    use App\Models\Post;

    class PostController extends Controller
    {
        public function view(Post $post) {
            dd($post);
        }
    }

而且,我在 web.php 中的路线:

    <?php

    use Illuminate\Support\Facades\Route;
    use App\Http\Controllers\PostController;

    Route::get('/post/{item_id}', [PostController::class, 'view']);

当我尝试在浏览器中加载此路由时,我看到了新创建的 Post 对象的转储。它似乎没有执行 abort(404) 并且其他模型->查找逻辑不起作用。直接从 artisan tinker 调用 resolveRouteBinding 方法按预期工作,因此,我知道该方法有效。

    $ php artisan tinker
    Psy Shell v0.10.4 (PHP 7.4.10 — cli) by Justin Hileman
    >>> use App\Models\Post;
    >>> $post = new Post();
    => App\Models\Post {#3552}
    >>> $post->resolveRouteBinding(1, null);
    Symfony/Component/HttpKernel/Exception/NotFoundHttpException
    >>> quit
    Exit:  Goodbye

谁能告诉我我错过了什么?我知道这在 Laravel 5.8 中有效。我不确定临时版本。

谢谢。

如果要进行隐式路由模型绑定,则必须将方法中的 type-hinted 参数与路由参数的名称匹配:

Route::get('/post/{post}', [PostController::class, 'view']);

public function view(Post $post)

名为 post{post} 的路由参数匹配名为 post$post.

的方法参数