Пользовательский путь хранения для каждой модели - PullRequest
2 голосов
/ 31 мая 2019

Я внедряю систему обработки электронной почты, в которой я хочу сохранить исходную электронную почту и все ее вложения в путь. Например - mail-data / 123456/5

Где 123456 - идентификатор родителя, а 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?
}

1 Ответ

2 голосов
/ 31 мая 2019

Правильно, я был немного глупым ... получается, что когда вы запускаете 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());
}

Очень доволен этим решением, и я надеюсь,это пригодится кому-то еще в будущем:)

...