L5在中间件中使用Hashid返回null

时间:2017-02-19 05:17:55

标签: laravel hash laravel-5 laravel-5.3

我正在使用hashid来对url中的id参数进行哈希处理。我在我的模型中设置它来自动散列id。这工作正常。我的问题是解码中间件中的散列返回null。我不确定这是我的中间件的问题还是因为散列问题。

型号:

public function getIdAttribute($value)
    {
        $hashids = new \Hashids\Hashids(env('APP_KEY'),10);
        return $hashids->encode($value);
    }

中间件:

<?php

namespace App\Http\Middleware;

use Closure;

class HashIdsDecode
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        dd($request->id); //Returns null on show method - example localhost:8000/invoices/afewRfshTl
        if($request->has('id'))
        {
            $hashids = new \Hashids\Hashids(env('APP_KEY'),10);
            dd($hashids->decode($request->input('id')));
        }

        return $next($request);
    }
}

路线:

Route::resource('invoices','InvoiceController');

控制器:

public function show($id)
    {
        $invoice = Invoice::find($id);
        return view('invoices.show', [
            'invoice' => $invoice,
            'page_title' => ' Invoices',
            'page_description' => 'View Invoice',
        ]);
    }

注意: 如果我绕过中间件并直接在我的控制器中这样做就可以了,但是它要求我一遍又一遍地重复自己,可能不是最好的这样做的方法。

public function show($id)
    {
        $hashids = new \Hashids\Hashids(env('APP_KEY'),10);
        $invoiceId = $hashids->decode($id)[0];
        $invoice = Invoice::find($invoiceId);

        return view('invoices.show', [
            'invoice' => $invoice,
            'page_title' => ' Invoices',
            'page_description' => 'View Invoice',
        ]);
    }

1 个答案:

答案 0 :(得分:0)

就个人而言,我更倾向于写一个模特特征。然后,您可以仅在需要的模型上使用特征,而不是假设请求中的每个ID参数都是哈希ID。

E.g。

namespace App\Models\Traits;

use Hashids\Hashids;
use Illuminate\Database\Eloquent\Builder;

trait HashedId
{
    public function scopeHashId(Builder $query, $id)
    {
        $hashIds = new Hashids(env('APP_KEY'), 10);
        $id = $hashIds->decode($id)[0];

        return $query->where('id', $id);
    }
}

然后使用它,您将使用发票模型上的特征(编辑):

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Invoice extends Model
{
    use \App\Models\Traits\HashedId;

    // ...
}

在控制器中执行以下查询:

public function show($id)
{
    $invoice = Invoice::hashId($id)->firstOrFail();

    return view('invoices.show', [
        'invoice' => $invoice,
        'page_title' => ' Invoices',
        'page_description' => 'View Invoice',
    ]);
}