【问题标题】:Custom storage path per model每个模型的自定义存储路径
【发布时间】:2019-05-31 13:26:21
【问题描述】:

我正在实施一个电子邮件处理系统,我想将原始电子邮件及其所有附件保存到一个路径中。例如 - 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())

我认为最好的方法是在模型上创建一个访问器,并且我已经能够更新适配器,我只是不知道如何在 Filesystem 实例上更新它并返回它?

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

【问题讨论】:

    标签: laravel laravel-5.8 laravel-filesystem


    【解决方案1】:

    是的,我在这里有点傻……原来当你在适配器上运行 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());
    }
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-08
      • 2016-09-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多