在Laravel工作中,我有:
use Spatie\Valuestore\Valuestore;
和
public function __construct()
{
$this->settings = Valuestore::make(storage_path('app/settings.json'));
}
和
public function handle()
{
if($this->settings->get('foo') == 'test') {
etc...
,由此我得到一个错误Undefined property App\Jobs\MyJobName::$settings
。怎么了?
即使我这样做:
public function handle()
{
$this->settings = Valuestore::make(storage_path('app/settings.json'));
if($this->settings->get('foo') == 'test') {
etc...
我遇到同样的错误。
根据评论进行更新
MyJobName
在定制的工匠命令中被调用,碰巧也使用了Valuestore
,但我认为这是不相关的。
在CustomCommand
类中:
use Spatie\Valuestore\Valuestore;
和
public function __construct()
{
parent::__construct();
$this->settings = Valuestore::make(storage_path('app/settings.json'));
}
和
public function handle()
{
if($this->settings->get('foo') == 'test') // This works in this custom command!
{
$controller = new MyController;
MyJobName::dispatch($controller);
}
}
因此,在CustomCommand
中,我使用Valuestore
的方式与在MyJobName
中使用的方式完全相同,但是在后者中,它不起作用。
根据其中一项评论:我也没有将$this->settings
设为全局,因为我也没有在CustomCommand
中这样做,因此在这里工作正常。
更新2
如果我根据注释在$settings;
函数上方添加了受保护的__construct()
,它仍然不起作用,同样的错误。
答案 0 :(得分:1)
如果您通过QUEUE使用JOB,则需要使用方法handle
public function handle()
{
$this->settings = Valuestore::make(storage_path('app/settings.json'));
....
}
因为构造函数在创建类的对象时起作用,并且该对象被序列化并存储在数据库中,并且在反序列化并触发了句柄之后。
答案 1 :(得分:1)
只需在您的作业类中将 settings 属性声明为 public。
public $settings;
public function __construct()
{
$this->settings = Valuestore::make(storage_path('app/settings.json'));
}
答案 2 :(得分:0)
您可能需要重新启动队列工作器
请记住,队列工作器是长期存在的进程,并将启动的应用程序状态存储在内存中。因此,启动它们后,他们将不会注意到代码库中的更改。因此,在部署过程中,请确保重新启动队列工作器。
如果您使用守护程序php artisan queue:restart
如果您在{strong> bash 击中queue:work
时使用Ctrl+C
,那么php artisan queue:work
应该足够
答案 3 :(得分:0)
我最近遇到此错误。我试图使变量公开,删除Jobs
类内的所有变量,甚至重命名并删除类本身。但这没用。
很快,我运行此artisan命令 php artisan optimize:clear
来清除所有缓存,视图,路由等。这以某种方式解决了我的变量问题。对于仍然有此OP问题的任何人,请尝试上面的我的解决方案。