gpt4 book ai didi

laravel - 每个模型的自定义存储路径

转载 作者:行者123 更新时间:2023-12-02 02:04:21 26 4
gpt4 key购买 nike

我正在实现一个电子邮件处理系统,我想将原始电子邮件及其所有附件保存到路径中。例如 - mail-data/123456/5

其中 123456 是父 ID,5 是子 ID。

在 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?
}

最佳答案

对,我在这里有点愚蠢...事实证明,当您在适配器上运行 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());
}

对这个解决方案非常满意,我希望它将来对其他人有用:)

关于laravel - 每个模型的自定义存储路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56395989/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com