加密的路由为什么没有走 resolveRouteBinding ($value){} 方法呢

laravel 5.5 根据教程操作,访问 http://localhost/users/n8vgO967DB 不会自动调用 model 中的方法,难道要自己写个中间件实现?

vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php

...
public function resolveRouteBinding($value)
{
    return $this->where($this->getRouteKeyName(), $value)->first();
}
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
最佳答案

只有控制器中注入相应的模型实例才会调用\Illuminate\Routing\Middleware\SubstituteBindings::class 中间件,可以将控制器代码如下修改:(注意:模型 app/User.php 需要引用性状 use App\Models\Traits\HashIdHelper; )

UserController.php

/**
     * 展示某个详情数据
     *
     * @param User $user
     *
     * @return \Illuminate\Http\Response
     */
    public function show(User $user)
    {
        return $this->out(200, $user);
    }

    public function out($code = 200, $data = [], $reason = 'success')
    {
        return response()->json(compact('code', 'reason', 'data'))->setEncodingOptions(JSON_UNESCAPED_UNICODE);
    }
6年前 评论
讨论数量: 5
liyu001989

那研究一下为什么没有调用啊

6年前 评论

@liyu001989 中间件通过参数查找模型的时候会调用模型的 resolveRouteBinding 方法,想知道你这个路由,还有控制器中如何调用 model 来查询的?
我的代码如下:

  1. routes/api.php 定义的路由:
    Route::resource('users', 'UserController');

  2. 控制器 UserController.php
    public function show($id)
    {
        $data = User::findOrFail($id);
        return $this->out(200, $data);
    }
  3. 模型 User.php 定义方法
    public function resolveRouteBinding($value)
    {
        if (!is_numeric($value)) {
            $value = current(Hashids::decode($value));
            if (!$value) {
                return;
            }
        }
        return parent::resolveRouteBinding($value);
    }
6年前 评论
liyu001989

你可以看看 bindings 中间件时如何运行的

6年前 评论

只有控制器中注入相应的模型实例才会调用\Illuminate\Routing\Middleware\SubstituteBindings::class 中间件,可以将控制器代码如下修改:(注意:模型 app/User.php 需要引用性状 use App\Models\Traits\HashIdHelper; )

UserController.php

/**
     * 展示某个详情数据
     *
     * @param User $user
     *
     * @return \Illuminate\Http\Response
     */
    public function show(User $user)
    {
        return $this->out(200, $user);
    }

    public function out($code = 200, $data = [], $reason = 'success')
    {
        return response()->json(compact('code', 'reason', 'data'))->setEncodingOptions(JSON_UNESCAPED_UNICODE);
    }
6年前 评论

@lisgroup 今天遇到了和楼主一样的问题,按楼主的思路和larbbs的源码最终解决了。另外补充一点:
如果不使用资源路由,需要对路由进行模型绑定,具体请参考手册 路由 => 路由模型绑定 部分。

6年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!