【问题标题】:Laravel using façades in a jobLaravel 在工作中使用外观
【发布时间】:2016-01-26 15:20:21
【问题描述】:

我正在尝试设置一个使用 Storage 外观的作业。不幸的是,这不起作用并引发异常。

'Symfony\Component\HttpFoundation\File\File' 的序列化不是 允许

class MoveMusicToRemoteStorage extends Job implements SelfHandling, ShouldQueue
{
    use InteractsWithQueue, DispatchesJobs;

    private $audio;

    public function __construct(AudioFile $audio)
    {
        $this->audio = $audio;
    }

    public function handle()
    {
        Storage::disk('s3')->put('/audio/' . $this->audio->file()->getFilename(), file_get_contents($this->audio->getPath()));
    }

}

如何在作业中使用 Facade?​​p>

编辑

我已阅读this post,但我不拥有 File 类,因此我无法使其可序列化。

【问题讨论】:

标签: php laravel


【解决方案1】:

问题是您将File 对象传递给作业构造函数,并且无法序列化文件。它与立面无关。您可以按原样使用外观,但要解决此问题,您需要传递对所需文件的引用(如文件名/路径),然后通过File 外观中的@987654323 检索文件@方法:

class MoveMusicToRemoteStorage extends Job implements SelfHandling, ShouldQueue
{
    use InteractsWithQueue, DispatchesJobs;

    private $audio_file_path;

    public function __construct($audio_file_path)
    {
        $this->audio_file_path = $audio_file_path;
    }

    public function handle()
    {
        $audio_file = Storage::get($this->audio_file_path);

        Storage::disk('s3')->put('/audio/' . $audio_file->file()->getFilename(), file_get_contents($audio_file->getPath()));
    }    
}

如果您通过文件上传来执行此操作,您可能不想使用作业。文件上传存储在临时目录中,如果作业要排队,文件可能会在您有机会将其移动到 S3 之前消失。

【讨论】:

  • 如异常消息所述:问题是File 无法序列化,与外观无关。
  • 不知道你在做什么。我意识到这与门面无关。我在回答中提到了这一点。 OP 的标题,但看起来问题都是关于外墙的。
  • 是的,这是针对 OP,而不是您。只是重申你所说的:)
  • Ohhhhh 我明白了,我很困惑,因为 AudioFile 没有扩展 File 这是一个自定义类 - 但我看到我在访问 $this->audio->file() 方法时使用了 File。我已经在 AudioFile 类上实现了 Serializable 并且它都在工作。谢谢
猜你喜欢
  • 2019-06-02
  • 2016-01-14
  • 1970-01-01
  • 2021-07-22
  • 1970-01-01
  • 2018-01-03
  • 1970-01-01
  • 2018-08-15
  • 2021-11-21
相关资源
最近更新 更多