Чего я пытаюсь достичь: учитывая простую систему поддержки (билеты). Каждый тикет может быть обновлен новыми «title», «body» и т. Д. c. Кроме того, у меня есть метод с именем 'changeStatus' в TicketsController, для которого в поле 'closed_at' установлено значение now()
или null
. В основном отметьте состояние заявки как закрытое или открытое. Моя система уведомлений использует laracasts / fla sh и toastr. Это моя модель Ticket:
<?php
namespace App;
use App\Traits\Assignable;
use App\Traits\Contributable;
use App\Traits\Flashable;
use App\Traits\Multitenantable;
use App\Traits\Noteable;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Notifications\Notifiable;
class Ticket extends Model
{
use Notifiable, Multitenantable, Assignable, Contributable, Noteable, Flashable;
protected $fillable = [
'owner_id', 'assignee_id', 'title', 'description', 'closed_at'
];
protected $table = 'tickets';
protected static function boot()
{
parent::boot();
static::created(function () {
flash('Your ticket has been created')->success();
});
static::updating(function () {
flash('Your ticket has been updated')->success();
});
static::deleted(function () {
flash('Your ticket has been deleted')->success();
});
}
А вот моя черта Flashable:
<?php
namespace App\Traits;
trait Flashable
{
protected static function bootFlashable()
{
if (auth()->check()) {
static::saved(function () {
self::flashMessages();
});
}
}
public static function flashMessages()
{
if (session()->has('flash_notification')) {
foreach (session('flash_notification', collect())->toArray() as $message) {
toastr($message['message'],
$message['level'],
ucfirst($message['level']),
$message['important'] ? [
'timeOut' => 0,
'closeButton' => true,
'positionClass' => 'toast-top-full-width'
] : []);
}
}
}
}
Итак, как вы видите, я высвечиваю сообщения в зависимости от различий, когда они уволены. Когда я обновляю модель, все работает как положено, но когда я пытаюсь изменить статус заявки (в основном то же самое обновление, но только для одного поля), я вызываю метод fla sh () внутри контроллера, и, очевидно, получить два сообщения fla sh: одно для обновления, второе для изменения статуса. И я не могу избавиться от сообщения «обновление» внутри контроллера, когда вызывается метод «changeStatus».
Мое решение: я добавил toastr()->clear();
к своей черте Flashable, а также к внедренной черте Fleashable. внутри контроллера, чтобы переопределить предыдущее сообщение. Вот мой контроллер с решением:
<?php
namespace App\Http\Controllers;
use App\Helpers\Helper;
use App\Note;
use App\Notifications\Tickets\TicketCreated;
use App\Notifications\Tickets\TicketUpdated;
use App\Notifications\Tickets\TicketStatusChanged;
use App\Ticket;
use App\Traits\Authorizable;
use App\Traits\Flashable;
use App\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Notification;
class TicketsController extends Controller
{
use Authorizable, Flashable;
/**
* Instantiate a new controller instance.
*
* @return void
*/
public function __construct()
{
$this->middleware('mark_as_read')->only('show');
}
public function index()
{
$tickets = Ticket::available()->get();
return view('app.tickets.index', compact('tickets'));
}
public function update(Ticket $ticket)
{
if (!request()->has('setContributors')){
$this->validateTicket();
Notification::send(Helper::getNotificationRecipients($ticket), new TicketUpdated($ticket->withoutRelations()));
}
$ticket->fill(request()->all())->save();
return redirect(route('tickets.show', $ticket->id));
}
public function changeStatus(Request $request, Ticket $ticket)
{
$status = is_null($ticket->closed_at) ? now() : null;
if ($request->has('statusChange')) {
$ticket->closed_at = $status;
$ticket->save();
flash(is_null($status) ? 'Your ticket has been reopened' : 'Your ticket has been closed')->success();
self::flashMessages();
Notification::send(Helper::getNotificationRecipients($ticket), new TicketStatusChanged($ticket->withoutRelations()));
}
return redirect(route(is_null($status) ? 'tickets.show' : 'tickets.index', $ticket->id ));
}
Это решение отлично работает. Итак, мой вопрос: это лучший способ достичь sh моей цели - переопределить сообщение о событии «обновление» по умолчанию, введя в контроллер ту же черту, которая уже внедрена в модель, или вы можете посоветовать лучшее решение? Заранее спасибо.