Пользовательская структура каталогов Laravel spatie medialibrary /год/месяц/дата не работает должным образом

Я использую медиабиблиотеку laravel spatie и хочу хранить файлы в структуре каталогов, например /год/месяц/дата.

Читаю здесь https://spatie.be/docs/laravel-medialibrary/v11/advanced-usage/using-a-custom-directory-structure

и я создал этот файл в /app/Services/MediaLibrary/CustomPathGenerator.php, который я перечисляю ниже.

Теперь файлы хранятся в том месте, где я хочу.

Но моя проблема в том, что когда я пытаюсь ПРОЧИТАТЬ файл, это НЕ МОЖЕТ НАЙТИ, потому что то же правило применяется при попытке прочитать местоположение файла, а дата изменилась, а затем указывает на другой путь, который не существует.

Есть идеи, как это решить?

Спасибо!

Вот мой файл /app/Services/MediaLibrary/CustomPathGenerator.php:

<?php

namespace App\Services\MediaLibrary;

use \Spatie\MediaLibrary\MediaCollections\Models\Media;
use Spatie\MediaLibrary\Support\PathGenerator\PathGenerator as BasePathGenerator;

class CustomPathGenerator implements BasePathGenerator
{
    
   
    
    /**
     * Get the path for the given media, relative to the root storage path.
     *
     * @param \Spatie\MediaLibrary\MediaCollections\Models\Media $media
     *
     * @return string
     */
    public function getPath(Media $media): string
    {   
        //return $this->getBasePath($media).'/';
        //return md5($media->id . config('app.key')) . '/';
        $md5_var=md5($media->id . config('app.key'));
        $myPath=date("Y").'/'.date("m").'/'.substr($md5_var,0,4). '/'.substr($md5_var,4,4) . '/'.substr($md5_var,8,4).'/'.$md5_var.'/'; 
        return $myPath;    
    }

    /**
     * Get the path for conversions of the given media, relative to the root storage path.
     *
     * @param \Spatie\MediaLibrary\MediaCollections\Models\Media $media
     *
     * @return string
     */
    public function getPathForConversions(Media $media): string
    {
        //return $this->getBasePath($media).'/conversions/';
        //return md5($media->id . config('app.key')) . '/conversions/';
        $md5_var=md5($media->id . config('app.key'));
        $myPath=date("Y").'/'.date("m").'/'.substr($md5_var,0,4). '/'.substr($md5_var,4,4) . '/'.substr($md5_var,8,4).'/'.$md5_var. '/conversions/'; 
        return $myPath;
    }

    /**
     * Get the path for responsive images of the given media, relative to the root storage path.
     *
     * @param \Spatie\MediaLibrary\MediaCollections\Models\Media $media
     *
     * @return string
     */
    public function getPathForResponsiveImages(Media $media): string
    {
        //return $this->getBasePath($media).'/responsive-images/';
        //return md5($media->id . config('app.key')) . '/responsive-images/';
        $md5_var=md5($media->id . config('app.key'));
        $myPath=date("Y").'/'.date("m").'/'.substr($md5_var,0,4). '/'.substr($md5_var,4,4) . '/'.substr($md5_var,8,4).'/'.$md5_var. '/responsive-images/'; 
        return $myPath;
    }
}

Но разве местоположение файла не хранится в виде информации?!

Alex 22.03.2024 11:37
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
1
111
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете изменить класс создателя пути, чтобы использовать дату create_at, если модель мультимедиа уже сохранена.

Я написал пример подхода, возможно, для его работы в вашей среде, конечно, потребуются изменения:

<?php

namespace App\Services\MediaLibrary;

use \Spatie\MediaLibrary\MediaCollections\Models\Media;
use Spatie\MediaLibrary\Support\PathGenerator\PathGenerator as BasePathGenerator;

class CustomPathGenerator implements BasePathGenerator
{

    private function getFilePath(Media $media, ?string $extra = null): string
    {
        $datePart = date('Y/m');
        if ($media->exists) {
            $datePart = $media->created_at->format('Y/m');
        }
        $md5_var = md5($media->id . config('app.key'));
        return implode('/', array_filter([
            $datePart,
            substr($md5_var, 0, 4),
            substr($md5_var, 4, 4),
            substr($md5_var, 8, 4),
            $md5_var,
            $extra
        ])) . '/';
    }

    /**
     * Get the path for the given media, relative to the root storage path.
     *
     * @param \Spatie\MediaLibrary\MediaCollections\Models\Media $media
     *
     * @return string
     */
    public function getPath(Media $media): string
    {
        return $this->getFilePath($media);
    }

    /**
     * Get the path for conversions of the given media, relative to the root storage path.
     *
     * @param \Spatie\MediaLibrary\MediaCollections\Models\Media $media
     *
     * @return string
     */
    public function getPathForConversions(Media $media): string
    {
        return $this->getFilePath($media, 'conversions');
    }

    /**
     * Get the path for responsive images of the given media, relative to the root storage path.
     *
     * @param \Spatie\MediaLibrary\MediaCollections\Models\Media $media
     *
     * @return string
     */
    public function getPathForResponsiveImages(Media $media): string
    {
        return $this->getFilePath($media, 'responsive-images');
    }
}

Другие вопросы по теме