Мягкое удаление с Sentry 2 и Laravel 4.2

Я хочу иметь возможность мягко удалять пользователей с помощью метода $user->delete();, но, похоже, он не работает должным образом. Он всегда жестко удаляет, независимо от того, что я делаю. Я просмотрел всю документацию по Laravel 4.2 и думаю, что правильно настроил Sentry. Вот мой код:

Пользователь.php

<?php

use Cartalyst\Sentry\Sentry;
use Illuminate\Auth\UserTrait;
use Illuminate\Auth\UserInterface;
use Illuminate\Auth\Reminders\RemindableTrait;
use Illuminate\Auth\Reminders\RemindableInterface;
use Illuminate\Database\Eloquent\SoftDeletingTrait;

class User extends Cartalyst\Sentry\Users\Eloquent\User implements UserInterface, RemindableInterface 
{ 

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

    use UserTrait, RemindableTrait, SoftDeletingTrait;

    /**
     * The database table used by the model.
     *
     * @var string
     */
    protected $table = 'users';

    /**
     * The attributes excluded from the model's JSON form.
     *
     * @var array
     */
    protected $hidden = array('password', 'remember_token');

    //Soft deleting

    protected $dates = ['deleted_at'];
    public $timestamps = true;

}

Контроллер.php

public function postDeactivate() 
{

    $validator = Validator::make(Input::all(), array('password' => 'required|min:6'));

    if ($validator->fails()) {
        return Redirect::route('account-deactivate')->withErrors($validator);
    } else {

        try {
            $user = Sentry::getUser();
            if ($user->checkPassword(Input::get('password'))) {
                Mail::send(
                    'emails.deactivate',
                    array('username' => $user->username), 
                    function($message) use ($user) {
                        $message->to($user->email, $user->username)->subject('Hope to see you soon!');
                    }
               );

               if ($user->delete()) {
                   return Redirect::route('home')                                                       ->with('global','Account deactivated!');
               } else {
                   return Redirect::route('account-deactivate')->with('global','Error!');
               }

           } else {
               return Redirect::route('account-deactivate')->with('global','Wrong password.');
           }

       } catch (Cartalyst\Sentry\Users\UserNotFoundException $e) {
           return Redirect::route('account-sign-in-get')->with('message','User not found!');
       }

}

Кстати, я опубликовал файл конфигурации Sentry в разделе

/vendor/cartalyst/sentry/src/config/config.php

и изменил строку 123 на

'model' => 'User',

Я также создал миграцию, чтобы добавить столбец «deleted_at» в свою таблицу, поэтому я в недоумении. Любая помощь будет принята с благодарностью.

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


person Gabriel Rebello    schedule 10.03.2015    source источник
comment
Привет, Габриэль, ты нашел решение? Я столкнулся с той же самой проблемой. Спасибо!   -  person Mwirabua Tim    schedule 22.03.2015
comment
Я сделал! Скоро напишу ответ :)   -  person Gabriel Rebello    schedule 22.03.2015


Ответы (2)


Итак, на самом деле решение было довольно простым. При работе с Sentry вы используете не модель Eloquent, предварительно настроенную в Laravel, а собственную модель Cartalyst. Итак, что мне нужно было сделать, это получить декларацию мягкого удаления внутри пользовательской модели Sentry под /vendor/cartalyst/sentry/src/Cartalyst/Sentry/Users/Eloquent/User.php вместо той, которую я пытался сделать, когда этот вопрос был открыт.

Вот моя модель Sentry User:

<?php namespace Cartalyst\Sentry\Users\Eloquent;

use Illuminate\Database\Eloquent\SoftDeletingTrait;
use Illuminate\Database\Eloquent\Model;
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 {

        use SoftDeletingTrait;

        protected $dates = ['deleted_at'];
        /**
         * The table associated with the model.
         *
         * @var string
         */
        protected $table = 'users';

Теперь $user->delete(); работает правильно, добавляя временную метку 'deleted_at' вместо уничтожения пользователя.

Однако это связано с некоторыми проблемами. У меня еще не было времени протестировать все, но я столкнулся с некоторыми трудностями, такими как модель Sentry, которая не может запрашивать с удаленными результатами и, следовательно, не может получить обратимо удаленного пользователя. На данный момент я просто делаю это с помощью метода User::withTrashed(); Laravel, который отлично работает.

И не забудьте расширить модель Cartalyst до /app/models/User.php!

Надеюсь, это работает и для других!

person Gabriel Rebello    schedule 22.03.2015
comment
Проверьте ответ, который я предоставил ниже, он должен работать и для вас. :) - person Mwirabua Tim; 22.03.2015

Эта настройка работала для меня:

На пользовательской модели: app/models/User.php

<?php
use Cartalyst\Sentry\Users\Eloquent\User as SentryUserModel;
use Illuminate\Database\Eloquent\SoftDeletingTrait;

class User extends SentryUserModel {

    use SoftDeletingTrait;
    protected $softDelete = true;
    protected $dates = ['deleted_at'];

Добавлено поле delete_at при миграции пользователей:

class UpdateUsersTable extends Migration {

public function up()
{
    Schema::table('users', function(Blueprint $table)
        $table->datetime('deleted_at');
    });
}

public function down()
{
    Schema::table('users', function(Blueprint $table)
    {
        $table->dropColumn('deleted_at');
    });
}

Опубликован файл конфигурации часового

php artisan config:publish --path="vendor/cartalyst/sentry/src/config/config.php" cartalyst/sentry

И я изменил строку 123 в этом опубликованном файле, чтобы использовать пользовательскую модель laravel: (app/config/packages/cartalyst/sentry/config.php)

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

Это сработало, и даже это работает: User::withTrashed()->get();

Если это не сработает, попробуйте очистить миграцию запуска базы данных заново.

Преимущество этого метода в том, что даже после обновления sentry вы не потеряете свои изменения в папке поставщика, и в вашем приложении не будет ошибок. Удачи!

person Mwirabua Tim    schedule 22.03.2015