Laravel作业中未定义的属性

时间:2019-06-17 18:42:48

标签: laravel

在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(),它仍然不起作用,同样的错误。

4 个答案:

答案 0 :(得分:1)

如果您通过QUEUE使用JOB,则需要使用方法handle

来完成所有请求或SQL查询。
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)

您可能需要重新启动队列工作器

From Laravel documentation

  

请记住,队列工作器是长期存在的进程,并将启动的应用程序状态存储在内存中。因此,启动它们后,他们将不会注意到代码库中的更改。因此,在部署过程中,请确保重新启动队列工作器。

如果您使用守护程序php artisan queue:restart

如果您在{strong> bash 击中queue:work时使用Ctrl+C,那么php artisan queue:work应该足够

答案 3 :(得分:0)

我最近遇到此错误。我试图使变量公开,删除Jobs类内的所有变量,甚至重命名并删除类本身。但这没用。

很快,我运行此artisan命令 php artisan optimize:clear来清除所有缓存,视图,路由等。这以某种方式解决了我的变量问题。对于仍然有此OP问题的任何人,请尝试上面的我的解决方案。