Мягкое удаление с помощью Sentry 2 и Laravel 4.2

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

User.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;

}

controller.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',

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

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

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(); работает должным образом, добавляя метку времени «Удален_кат» вместо уничтожения пользователя.

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

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

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

1

Другие решения

Этот параметр работал для меня:

На модели пользователя: 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 ();

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

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

1

По вопросам рекламы [email protected]