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'];
然而,一旦它们进入队列作业,我就无法更改语言环境,无论我尝试了什么,即使我传递了一个有说服力的集合,它也会将它们更改为默认语言环境
我尝试的是:
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方法的东西就好了,但是从作业端调用的任何东西都可以很好地工作:)