Более 5 лет работаю с 1С-Битрикс, и там все файлы прикреплённые куда либо( элементы ИБ, разделы ИБ, фото аккаунта итд итп) заносятся в отдельную таблицу. А во всех остальных элементах просто ссылка на ID загруженного файла.
Стоит ли переносить этот принцип работы с файлами в Laravel(должен сказать мне этот подход нравится) или же делать как везде в тоториалах пишут - просто перенести файл в папку и в бд указать путь файла(я так делал когда только начинал изучать web разработку, и должен сказать мне такой подход кажется примитивным).
Правильнее будет создать полиморфическую связь. Сохранять в БД путь к картинке, а так же путь к миниатюре, привязывая к определенной сущности определенной модели.
Если хотите, могу описать поконкретнее с примерами кода.
Имя миниатюры может быть генерируемое, в зависимости от размера. Миниатюр может быть десяток, и всех их писатьв БД - не резонно.
К примеру оригинальный файл - uploads/products/fire.jpg
а миниатюра - uploads/resize/fire400x400.jpg
Сергей Сыса, а каким образом лучше генерировать миниатюру на лету если делаем выборку на 100 товаров к примеру. чтоб эти миниатюры повторно использовались?
Сергей Сыса, а как вы это реализовываете? каким пакетом в laravel и как определять есть уже сгенерированная или нужно сгенерировать по новой? это наверняка модуль есть такой?
Лично у меня в проекте на каждый размер миниатюры создается подпапка, например, 50х50 и туда кладется преобразованная к webp копия.
Господа Andrzej Wielski и Muhammad будьте добры объяснить мне преимущество вашего подхода хранения прикреплённых файлов перед системой как в битриксе. Просто я с высоты опыта с Битрисом не понимаю преимуществ с таким подходом.
Я так понимаю если файл будет размером 1mb, то ваша база вырастет довольно быстро.
Сколько работал с сайтами, с разлисными CMS - ни разу не всречал хранения изображений напрямую в БД.
Сергей Сыса: Речь идёт не о хранении самого файла в БД, а хранить путь и описание файла в отдельной таблице. т.е файл будет записываться в директорию, а его путь в отдельную таблицу. Если вам интересно, я могу привести пример преимущества такого подхода перед вашим.
Сергей Сыса: а кто говорит про хранение изображений в БД? В базе хранятся лишь ID медиа-файлов, привязанных к определенной сущности.
Андрей Корнев полиморфическая связь в Laravel подразумевает под собой таблицу со значениями, связанными с любым типом сущности (моделью). В одной таблице хранятся все пути к изображениям, разделенные на тип записи.
Andrzej Wielski: Так примерно это я и имею ввиду когда говорю о подходе "как в Битрикс". Просто на всех таториалах почему-то предпочитают просто в поле модели указать путь к сохранённому файлу. Вроде современный фреймворк, а рекомендуют делать как в каменном веке.
Andrzej Wielski: С высоты своего опыта, не могли бы вы подскакать хорошие ресурсы для обучения Laravel ибо в доках покрыто очень мало вопросов, а на тостере 90% вопросов из категории "Почему не лара не видит класс".
Андрей Корнев: Нет нормальных ресурсов для обучения, увы. Даже читсиды по ларавелу покрывают максимум 50% вопросов. Главное - практика.
Главное поймите принципы работы связей в Laravel (в документации разжевано достаточно хорошо), и поработайте над Events / Middleware / Providers. Этого хватит с головой на разработку более-менее крупного проекта, а с дальнейшим опытом придут и остальные знания.
Andrzej Wielski: раз уж на то пошло, вы не можете подсказать как реализовать обработку событий в модели. Как мне кажется вынос регистрации обработчиков необходим для работы с над чужими классами вовремя командной обработки, или же для изменения поведения других сторонних решений. Хотелось бы иметь обработку событий в модели. К сожалению гугл мне не помог, точнее предложили только переопределение методов добавления, изменения и удаления с вызовом метода перента.
Андрей Корнев: События (эвенты) не должны обрабатываться в модели. Создайте провайдер, и в методе boot уже обрабатывайте события.
События, кстати, разделяются на две части. События моделей, и эвенты. В первом случае пример обработки события:
User::creating(function ($user) {
// код
});
Во втором случае:
Event::listen('auth.login', function($user)
{
// код
});