Php 更改队列作业中的区域设置

Php 更改队列作业中的区域设置,php,laravel,eloquent,laravel-queue,laravel-jobs,Php,Laravel,Eloquent,Laravel Queue,Laravel Jobs,我有一个变形器,可以将模型的主体转换为所需的转换格式 public function getTextAttribute() { return $this->constructText($this->body); // which does __($key, $value) } protected $appends = ['text']; 然而,一旦它们进入队列作业,我就无法更改语言环境,无论我尝试了什么,即使我传递了一个有说服力的集合,它也会将它们更改为默认语言环境 我尝试

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

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

protected $appends = ['text'];
然而,一旦它们进入队列作业,我就无法更改语言环境,无论我尝试了什么,即使我传递了一个有说服力的集合,它也会将它们更改为默认语言环境

我尝试的是:

  • 在启动作业之前,将$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
        }
    

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

    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
        }
    
    然而,这也不起作用。当我在$locale中登录
    constructText()
    时,它也会返回默认的区域设置

    你能想出什么办法或解决办法吗?我想到的另外两个可能的解决办法是:

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

    • 是否有一种方法可以将有说服力的集合值(包括“文本”)转换为对象(无需连接到实际模型)?所以我可以直接把它交给工作

    • MyEvent::dispatch($collection, $language)
      

    只有在创建事件的新实例并随后被激发/调度时,才会调用事件的构造函数。当包含需要广播的此事件的作业运行时,它只有序列化的有效负载可处理。您需要尝试在作业的handle方法调用的方法中设置区域设置或类似的内容。这些广播事件将具有队列作业的
    句柄
    方法调用的
    broadcastAs
    broadcastOn
    broadcastWith
    方法。您应该能够在其中一个方法中设置所需内容,因为它们将由工作线程运行的队列作业运行,因此它不是原始请求生命周期的一部分(除非事件已实现
    ShouldBroadcastNow
    ,因为这将使用
    sync
    驱动程序而不是队列工作线程).

    您不会试图在构造函数中设置应用程序区域设置,它是在创建作业/分派作业时运行的,它在未序列化后不会被调用(当工作人员运行它时),您需要在
    句柄
    方法中调用它。这是一个广播事件,因此我使用的方法是
    broadcastOn()
    broadcastAs()
    \uu构造()
    。我应该把它放在哪里?
    broadcastWith()
    是这样做的好地方吗?您有一个listener类,还是它自己处理?因为您一直在说‘job’,“您不会试图在构造函数中设置应用程序区域设置,它是在创建作业/分派作业时运行的,它在未序列化后不会被调用”,这一点非常清楚-我让它与
    broadcastWith()
    一起工作。非常感谢。亲爱的,这是一种方法。。。如果有更像handle方法的东西就好了,但是从作业端调用的任何东西都可以很好地工作:)