我正在实施一个电子邮件处理系统,我想在其中将原始电子邮件及其所有附件保存到路径中。例如-mail-data / 123456/5
其中父ID为123456,子ID为5。
在filesystems.php中,我创建了一个名为mail-data
的自定义磁盘
'mail-data' => [
'driver' => 'local',
'root' => storage_path('app/public/mail-data'),
'visibility' => 'private',
],
这对于设置存储路径,可见性等前缀非常有效。但是,我想要做的是基于每个模型,调用存储属性,并返回邮件数据驱动程序集到确切的路径。这样,我所有的逻辑可以简单地是:
$model->storage->put($file->getFilename(), $file->stream());
而不是:
$path = Storage::disk('mail-data')->put($model->parent_id . '/' . $model->id . '/' . $file->getFilename(), $file->getStream())
我认为最好的方法是在模型上创建一个访问器,而且我已经能够更新适配器,但我不知道如何在文件系统实例上更新并返回它?
public function getStorageAttribute()
{
$storage = Storage::disk('mail-data');
$adapter = $storage->getAdapter();
$adapter->setPathPrefix($adapter->getPathPrefix() . $this->parent_id . '/' . $this->id);
// what to do here to return our modified storage instance?
}
答案 0 :(得分:2)
对,我在这里有点愚蠢……事实证明,当您在适配器上运行setPathPrefix时,所有操作都是通过引用进行的,因此上面的代码实际上具有预期的效果。对于以后使用谷歌搜索的任何人,这是最终代码-
在模型上-
/**
* Get our storage disk for this model
*
* @return \Illuminate\Contracts\Filesystem\Filesystem
*/
public function getStorageAttribute()
{
$storage = Storage::disk('mail-data');
$adapter = $storage->getAdapter();
$adapter->setPathPrefix($adapter->getPathPrefix() . $this->ticket_id . '/' . $this->id);
return $storage;
}
然后,我可以使用$model->storage
在绝对存储路径上访问模型存储。因此,我现在用于保存邮件数据的更简洁的代码看起来像这样(不再需要计算路径,而不必担心逻辑中其他位置的路径)-
$storage = $model->storage;
$storage->put('email.eml', $mail->message()->getStream());
/** @var MimePart $attachment */
foreach ($mail->attachments() as $attachment) {
$storage->put($attachment->getFilename(), $attachment->getStream());
}
对此解决方案非常满意,希望以后对其他人有用:)