Как переопределить сообщение fla sh, созданное обновлением события внутри контроллера (laracasts / fla sh + toastr) - PullRequest
0 голосов
/ 17 февраля 2020

Чего я пытаюсь достичь: учитывая простую систему поддержки (билеты). Каждый тикет может быть обновлен новыми «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 моей цели - переопределить сообщение о событии «обновление» по умолчанию, введя в контроллер ту же черту, которая уже внедрена в модель, или вы можете посоветовать лучшее решение? Заранее спасибо.

...