JSON Web Token 仅适用于具有 Eloquent 模型的 Laravel

Posted

技术标签:

【中文标题】JSON Web Token 仅适用于具有 Eloquent 模型的 Laravel【英文标题】:JSON Web Token only work in Laravel with Eloquent model 【发布时间】:2015-12-28 12:50:33 【问题描述】:

我正在使用 Laravel,我想使用 JSON Web Token (JWT)。我下载了tymon vendor。当我尝试生成令牌时,它引发了一个错误,说我的模型不是 Eloquent 模型的实例。所以我检查了供应商代码,我在EloquentUserAdapter 看到了这个:

<?php

namespace Tymon\JWTAuth\Providers\User;

use Illuminate\Database\Eloquent\Model;

class EloquentUserAdapter implements UserInterface

    /**
     * @var \Illuminate\Database\Eloquent\Model
     */
    protected $user;

    /**
     * Create a new User instance
     *
     * @param  \Illuminate\Database\Eloquent\Model  $user
     */
    public function __construct(Model $user)
    
        $this->user = $user;
    

    /**
     * Get the user by the given key, value
     *
     * @param  mixed  $key
     * @param  mixed  $value
     * @return Illuminate\Database\Eloquent\Model
     */
    public function getBy($key, $value)
    
        return $this->user->where($key, $value)->first();
    

我的问题是这个适配器只使用 Eloquent 模型 注入。我正在使用 Doctrine 模型。所以我的问题是:

    是否可以更改此适配器以返回新模型(我的学说 模型)。我问是因为我是 PHP 和 Laravel 的新手,我看到了 EloquentUserAdapter 用在 vendor 的其他地方。 如果我创建一个新的适配器,我认为我必须返回一个 Eloquent 模型,那么我如何只重新定义模型并重用另一个 供应商的类和方法?

有什么线索吗?

【问题讨论】:

【参考方案1】:
    是的,您可以:

use App\Entities\User;
use Doctrine\ORM\EntityManagerInterface;
use Tymon\JWTAuth\Providers\User\UserInterface;

class DoctrineUserAdapter implements UserInterface

    protected $em;

    public function __construct(User $user, EntityManagerInterface $em)
    
        $this->em = $em;
    

    public function getBy($key, $value)
    
        return $this->em->find('App\Entities\User', $value);
    

您可以注入 EntityManagerInterface 对象作为第二个参数,第一个参数是 jwt.php 配置中“providers.user”中的用户模型类型,为什么?看JWTAuthServiceProvider.php中的代码:

/**
 * Register the bindings for the User provider.
 */
protected function registerUserProvider()

    $this->app['tymon.jwt.provider.user'] = $this->app->share(function ($app) 
        return $app->make($this->config('providers.user'), [$app->make($this->config('user'))]);
    );

我的简单用户模型:

use DOctrine\ORM\Mapping as ORM;

/**
 * Users *
 * @ORM\Table(name="users")
 * @ORM\Entity
 */
class User implements \Illuminate\Contracts\Auth\Authenticatable

    use \LaravelDoctrine\ORM\Auth\Authenticatable;

    /**
     *
     * @var integer *
     * @ORM\Column(name="id", type="integer", nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
     public $id;

    您可以在版本 1.0.0 中执行此操作。更多问题:https://github.com/tymondesigns/jwt-auth/issues/343

【讨论】:

以上是关于JSON Web Token 仅适用于具有 Eloquent 模型的 Laravel的主要内容,如果未能解决你的问题,请参考以下文章

JWT -- JSON WEB TOKEN

JWT -- JSON WEB TOKEN

Json Web Token JJWT

Json Web Token(JWT)

Json Web Token(JWT)详解

JWT--JSON WEB TOKEN