我允许我的用户将图像上传到特定的模型(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)
,所以永远不会排队。
任何帮助将不胜感激,因为我有点迷茫。