所以我觉得我发现问题所在,但由于我缺乏知识,我无法解决问题。
使用Sentry时,我已经尝试过扩展'模型'这是Sentry包和Laravel' Eloquent'的默认值。在Illuminate\Database\Eloquent\Model
下。都没有奏效。但是当他自己使用Laravel的Eloquent(没有Sentry包插件)时,Stapler工作得很好。
所以我猜Stapler和Sentry的用户模型之间存在一些兼容性问题,即使它使用Eloquent(其额外的功能可能与订书机的特性或构造函数相冲突,我不会这样做)。知道)。太糟糕了,因为Sentry是一个管理身份验证和限制的绝佳软件包,据我所知广泛使用。
有没有简单的方法可以使用订书机与哨兵的不可知版本,还是我必须重写我的所有代码才能使用laravel' s?auth?
我正在构建一个使用Cartalyst's Sentry来管理用户的应用。但是,我希望用户和其他模型能够拥有关联的头像,所以我也使用了代码套袖的订书机。
我已阅读了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正在查询,好像化身是一个字符串而Stapler不工作。
这是我的Sentry用户模型(我在Laravel' s中扩展):
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的新手,但我找不到任何能让我解决问题的信息。
提前致谢!
答案 0 :(得分:1)
是的,可以做到。根据OP中的内容,根本原因似乎是您的用户模型不知道avatar
是订书机提供的列。
理论:Sentry用户提供商制造用户模型right here。根据{{3}},该用户模型必须是Stapler感知的。幸运的是,Sentry是可配置的,您可以告诉它使用Stapler docs的自定义模型。
解决方案的粗略概述:首先,您需要一个能够识别Stapler的模型。你可能已经有了这个。请注意,它扩展了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使用它。下面我使用运行时配置更改,这是我的偏好。但你也可以setModel():
<?php // app/bootstrap.php
\Sentry::getUserProvider()->setModel('App\Model\UserModel');
我是在Laravel 4的记忆中做到这一点的,因此可能需要进行一些调整。