【问题标题】:Using Sentry with Codesleeve Stapler?将 Sentry 与 Codesleeve 订书机一起使用?
【发布时间】:2015-06-05 11:25:55
【问题描述】:

更新 #1

所以我想我找到了问题所在,但是由于我缺乏知识,所以我没有办法解决它。

使用 Sentry 时,我尝试扩展 Sentry 包默认的“模型”和 Illuminate\Database\Eloquent\Model 下的 Laravel 的“Eloquent”。都没有奏效。但是在单独使用 Laravel 的 Eloquent(没有 Sentry 包插件)时,Stapler 工作得很好。

所以我猜 Stapler 和 Sentry 的 User 模型之间存在一些兼容性问题,即使它使用 Eloquent(我不知道它的额外功能可能与stapler 的特征或构造函数冲突)。太糟糕了,因为 Sentry 是一个用于管理身份验证和节流的出色软件包,并且据我所知被广泛使用。

是否有任何简单的方法可以将订书机的不可知版本与哨兵一起使用,还是我必须重写所有代码才能使用 laravel 的身份验证?


主要问题

我正在构建一个使用 Cartalyst 的 Sentry 来管理用户的应用程序。但是,我希望用户和其他模型能够拥有关联的头像,所以我也在使用 Codesleeve 的订书机。

我已经阅读了laravel-stapler 的自述文件和stapler 的大部分独立版本文档,但不知道如何使它们与 Sentry 一起使用。每当我尝试通过此功能创建用户时:

$user = Sentry::createUser(array(
    'username'      => Input::get('username'),
    'email'         => Input::get('email'),
    'password'      => Input::get('password'),
    'activated'     => false,
    'avatar'        => Input::file('avatar')
));

return 'success';

我明白了:

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'avatar' in 'field list' 

所以看起来 Sentry 正在查询,好像头像是一个字符串,而订书机不工作。

这是我的 Sentry 用户模型(我在 Laravel 中对其进行了扩展):

use Illuminate\Database\Eloquent\SoftDeletingTrait;
use Illuminate\Database\Eloquent\Model;
use Codesleeve\Stapler\ORM\StaplerableInterface;
use Codesleeve\Stapler\ORM\EloquentTrait;
use Cartalyst\Sentry\Groups\GroupInterface;
use Cartalyst\Sentry\Hashing\HasherInterface;
use Cartalyst\Sentry\Users\LoginRequiredException;
use Cartalyst\Sentry\Users\PasswordRequiredException;
use Cartalyst\Sentry\Users\UserAlreadyActivatedException;
use Cartalyst\Sentry\Users\UserExistsException;
use Cartalyst\Sentry\Users\UserInterface;

class User extends Model implements UserInterface, StaplerableInterface {

        use SoftDeletingTrait, EloquentTrait;

        protected $fillabe = array('username','email','password','password_temp','code','active','avatar');

        public function __construct(array $attributes = array()) {
                $this->hasAttachedFile('avatar', [
                    'styles' => [
                        'medium' => '300x300',
                        'thumb' => '100x100'
                    ]
                ]);

                parent::__construct($attributes);
        }
        protected $dates = ['deleted_at'];

在 Sentry 的配置中:

'model' => 'Cartalyst\Sentry\Users\Eloquent\User',

这可能很容易解决,因为我对 Laravel、Sentry 和 Stapler 还很陌生,但我找不到任何可以帮助我解决问题的信息。

提前致谢!

【问题讨论】:

    标签: laravel avatar cartalyst-sentry


    【解决方案1】:

    是的,可以做到。根据您的 OP 中的内容,根本原因似乎是您的用户模型不知道 avatar 是 Stapler 提供的列。

    理论:Sentry User Provider 制造了一个用户模型,right here。根据Stapler docs,该用户模型必须支持订书机。幸运的是,Sentry 是可配置的,您可以通过 setModel() 告诉它使用您的自定义模型。

    解决方案的大致轮廓:首先,您需要一个能够识别订书机的模型。你可能已经有了这个。请注意,它扩展了 Sentry 提供的模型类并导入了 Stapler 特征。 两者都很重要。

    <?php // app/models/UserModel.php
    namespace App\Model;
    use Codesleeve\Stapler\ORM\StaplerableInterface;
    use Codesleeve\Stapler\ORM\EloquentTrait;
    use Cartalyst\Sentry\Users\Eloquent\User as SentryUserModel;
    
    class UserModel extends SentryUserModel implements StaplerableInterface {
        use EloquentTrait;
    }
    

    其次,您需要指示 Sentry 使用它。下面我使用运行时配置更改,这是我的偏好。不过你也可以change the Sentry configuration file:

    <?php // app/bootstrap.php
    
    \Sentry::getUserProvider()->setModel('App\Model\UserModel');
    

    我是在 Laravel 4 上凭记忆做的,所以可能需要进行一些调整。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-24
      • 2013-01-14
      • 1970-01-01
      • 2011-12-25
      • 2013-08-03
      相关资源
      最近更新 更多