Laravel-将代码移至作业队列,而不触发

时间:2019-03-05 19:07:18

标签: php laravel redis

我允许我的用户将图像上传到特定的模型(Stream)。我想将此代码逻辑移到队列中,以便使上传过程更流畅。

这是我的StreamDocumentsController.php,特别是存储方法:

public function store(Stream $stream)
{
    //Validate the request.
    //Removed in this example.

    //Store the actual document on the server.
    $store = request()->file('file')->store($stream->token);

    //Set the attributes to save to DB.
    $attributes['name'] = request()->file->getClientOriginalName();
    $attributes['path'] = $store;

    dispatch(new UploadDocuments($stream, $attributes));

    //Return URL for now. (JSON later on..)
    return response()->json([
        'status' => 'success'
    ]);
}

因此,上面的代码实际上将图像存储到服务器上的这一行:

//Store the actual document on the server.
$store = request()->file('file')->store($stream->token);

现在,当我尝试运行此代码(上传图像)时,我可以在Laravel Horizon中看到确实添加了作业,但从未将文档添加到数据库中。

这是我的UploadDocuments工作:

protected $stream;
protected $attributes;

/**
 * Create a new job instance.
 *
 * @return void
 */
public function __construct(Stream $stream, $attributes)
{
    $this->stream = $stream;
    $this->attributes = $attributes;
}

/**
 * Execute the job.
 *
 * @return void
 */
public function handle()
{
    $this->stream->addDocuments($this->attributes);
}

如您所见,我希望我的工作运行addDocuments()方法。

用于此目的的实际方法存储在我的Stream模型中:

Stream.php

/**
 * A stream can have many documents
 */
public function documents()
{
    return $this->hasMany(Document::class);
}

/**
 * Add document(s) to the stream
 *
 * @return Illuminate\Database\Eloquent\Model
 */
public function addDocuments(array $attributes)
{
    return $this->documents()->create($attributes);
}

因此,基本上,在上载图像时,应将上载过程排队,但是上面的代码 only 仅将实际图像保存到服务器,而不是数据库。就像handle()方法从未被触发一样。

此外,以上是否正确?因为我在工作中不处理->store($stream->token),所以永远不会排队。

任何帮助将不胜感激,因为我有点迷茫。

0 个答案:

没有答案