删除模型无效后的Laravel Queueable通知

时间:2017-05-22 07:09:20

标签: php laravel laravel-5 notifications laravel-5.3

我正在使用L5.3。

我有很多Queueable Laravel Notifications,他们与Redis合作得很好。除了与删除某些El​​oquent模型相关的通知。

这是通知源示例:

<?php

namespace App\Notifications\Games;

use App\Helpers\NotificationHelper;
use App\Game;
use Illuminate\Bus\Queueable;
use Illuminate\Notifications\Notification;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Notifications\Messages\MailMessage;
use Illuminate\Support\Facades\Log;

class Deleted extends Notification implements ShouldQueue
{
  use Queueable;

  public $game;
  private $game_id;

  public function __construct($game_id)
  {
    $this->game_id = $game_id;
    $this->game = Game::withTrashed()->with('situation')->find($game_id);
    // Log::info($this->game) here shows everything is ok
  }

  /**
   * Get the notification's delivery channels.
   *
   * @param  mixed $notifiable
   * @return array
   */
  public function via($notifiable)
  {
    return ['database'];
  }

  /**
   * Get the array representation of the notification.
   *
   * @param  mixed $notifiable
   * @return array
   */
  public function toDatabase($notifiable)
  {
    return [
      'game_id' => $this->game->id,
      'html' => '' . view('notifications.games.deleted', ['id' => $this->id, 'game' => $this->game, 'notifiable' => $notifiable])
    ];
  }
}

我发送的方式如下: $user->notify(new Deleted($id));

如果我删除implements ShouldQueue,则通知有效。但我需要队列,因为使用了几个外部服务(如电报,Facebook,One信号等),一些通知可以发送给很多用户。

storage\logs\laravel.logstorage\logs\worker.log文件中也没有错误。 failed_jobs表中没有项目。

是的,我正在使用soft deleting模型。

1 个答案:

答案 0 :(得分:0)

好的,最后我找到了两个解决方案,发布了两个:

这不是一个真正的解决方案,对我而言似乎更像是一个肮脏的黑客,因为根据情况它可以让你写更多的代码。

// Remove $game from constructor...
public function __construct($game_id)
  {
    $this->game_id = $game_id;
  }

// Then add it to your toDatabase, toMail, toFacebook etc methods:
public function toDatabase($notifiable)
  {
    $game = Game::withTrashed()->with('situation')->find($this->game_id);
    return [
      'game_id' => $this->game_id,
      'html' => '' . view('notifications.games.deleted', ['id' => $this->id, 'game' => $game, 'notifiable' => $notifiable])
    ];
  }

这是我决定使用的:

     // ENTER
  bars
  .enter()
    .append("rect")
    .style("fill", "green")
    .attr("width", x.bandwidth())
    .attr("x", 0)
    .attr("x", function(d) { return x(d.date); })
    .attr("y", y(0))
    .attr("height", 0)
    .style("opacity", 0)
    //.merge(bars)
    .transition()
    .duration(500)
    .attr("y", function(d) { return y(d.total); })
    .attr("height", function(d) { return height - y(d.total); })
    .style("opacity", 1);

使用第二种方法,如果我们有2个通知频道,我们将从DB中检索Game模型2次,如果我们有10个频道,我们将检索10次..是的,这是开销,但我们能够使用所有Eloquent Collection助手等。这就是我选择第二种方法而不是数组的原因。我希望有一天能帮到某人。

我很高兴听到为什么我们不能在构造函数中获得Eloquent模型。