Используете Sentry со степлером Codesleeve?

Обновление №1

Итак, я думаю, что выяснил, в чем проблема, но, поскольку мне не хватает знаний, у меня нет способа ее решить.

При использовании Sentry я пытался расширить как «Модель», которая используется по умолчанию, с пакетом Sentry, так и «Красноречивый» Laravel под Illuminate\Database\Eloquent\Model. Ни один из них не работал. Но при использовании Eloquent от Laravel отдельно (без надстроек пакета Sentry) Stapler работает прекрасно.

Поэтому я предполагаю, что между Stapler и моделью пользователя Sentry существует некоторая проблема совместимости, даже несмотря на то, что она использует Eloquent (его дополнительные функции могут конфликтовать с чертами степлера или функцией построения, я не знаю). Очень жаль, поскольку Sentry — отличный пакет для управления аутентификацией и регулированием, и, насколько я знаю, он широко используется.

Есть ли простой способ использовать агностическую версию степлера с часовым, или мне придется переписать весь мой код, чтобы использовать аутентификацию laravel?


Главный вопрос

Я создаю приложение, которое использует Sentry Cartalyst для управления пользователями. Однако я хочу, чтобы пользователи и другие модели могли иметь связанные аватары, поэтому я также использую степлер 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 запрашивает, как если бы аватар был строкой, а Stapler не работал.

Вот моя пользовательская модель 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, но я не смог найти никакой информации, которая помогла бы мне решить проблему.

Заранее спасибо!


person Gabriel Rebello    schedule 31.03.2015    source источник


Ответы (1)


Да, это может быть сделано. Судя по тому, что находится в вашем OP, основная причина заключается в том, что ваша пользовательская модель не знает, что avatar является столбцом, предоставленным Stapler.

Теория: поставщик пользователей Sentry создает модель пользователя, прямо здесь. Эта пользовательская модель должна поддерживать работу со степлером в соответствии с документами по сшивателю. К счастью, 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 использовать это. Ниже я использую изменения конфигурации во время выполнения, как я предпочитаю. Но вы также можете изменить файл конфигурации Sentry:

<?php // app/bootstrap.php

\Sentry::getUserProvider()->setModel('App\Model\UserModel');

Я делаю это по памяти на Laravel 4, поэтому может потребоваться некоторая настройка.

person bishop    schedule 25.09.2015