0

我有一个突变器,可以将模型的主体转换为所需的翻译格式。

public function getTextAttribute() {
   return $this->constructText($this->body); // which does __($key, $value)
}

protected $appends = ['text'];

但是,一旦他们在排队的工作中,无论我尝试什么,我都无法更改语言环境,即使我传递了一个 Eloquent 集合,它也会将它们更改为默认语言环境。

我尝试了什么:

  1. 在解雇工作之前,将 $locale 和 $eloquentCollection 传递给工作。

    MyEvent::dispatch($collection, $language)
    

而在我的工作中,

    public function __construct($collection, $language)
    {
       app()->setLocale($language);
       // if I log here, it logs the given locale as my current locale
       // but as soon as hits the get mutator, it goes back to default locale
    }

  1. 在我的收藏中,我尝试放置一个属性:

    class MyModel extends Model {
       public $locale = null;
    
    }
    

而在我的工作中,

    public function __construct($collection, $language)
    {
       app()->setLocale($language);

       $collection->each(function($item) {
           $item->locale = $language;
       })
    }

并将突变器更改为:

    public function getTextAttribute() {
       if (!$this->locale) { 
           $this->locale = app()->getLocale(); 
       }

       return $this->constructText($this->body, $this->locale); 
       // which does __($key, $value, $locale) inside
    }

然而,这也不起作用。constructText()当我在$locale 中登录时- 它也返回默认语言环境。

你有什么办法或解决方法吗?我想到的其他两种可能的解决方法是:

  • 有没有办法防止集合中的 Eloquent 模型发生变异?

  • 有没有办法将雄辩的集合值(包括“文本”)转换为对象(无需连接到实际模型)?所以我可以直接把它交给工作。

4

1 回答 1

1

仅当您创建要触发/调度的事件的新实例时,才会调用 Event 的构造函数。当包含此需要广播的事件的作业运行时,它只有序列化的有效负载可以使用。您需要尝试在作业的句柄方法调用的方法中设置区域设置或类似的设置。这些广播事件将具有由队列作业的方法调用的broadcastAsbroadcastOn和方法。您应该能够在其中一种方法中设置您需要的内容,因为它们将由工作人员运行的队列作业运行,因此它不是原始请求生命周期的一部分(除非事件已实现,如这将使用驱动程序而不是队列工作人员)。broadcastWithhandleShouldBroadcastNowsync

于 2019-12-14T21:26:13.427 回答