Taglaravel

Laravel collections: изменить атрибут у элементов

Collections — это отличный инструмент для работы с коллекцией каких-либо данных (это может быть результат выборки Eloquent элементов, или массив объектов). Лично я его активно использовал для создания пагинации, а сегодня открыл для себя еще способ использования.

Итак, проблема заключалась в следующем: я получал из базы список дефолтных цен для товаров (таблица prices), и одновременно получал список измененных цен для них же в рамках конкретных акций. В силу построения архитектуры, я не мог получить эти данные через один SQL запрос (в моем случае — с помощью Eloquent Query Builder, если точнее). Отображать же пользователю нужно актуальные цены, а не дефолтные, поэтому я использовал получание этих значений через отдельный массив, ключом которого был guid цен.

Однако использование дополнительных массивов не «есть хорошо», поэтому мне стало интересно, есть ли в Laravel collections способ сделать код красивее. И оказалось, что решение есть!

Где «prices» — это стандартные цены (название, обычная цена и проч), а массив «currentPrices» — это актуальные цены. В blade шаблоне мне не приходится искать массив по ключу и обрабатывать ошибку если ключ не найден, теперь это делается по уму в контроллере.
 

Управление показом Laravel DebugBar

Есть крайне удобная библиотека в Laravel, которую прям готов порекомендовать всем-всем-всем разработчикам на данном фреймворке. Я говорю о Laravel Debugbar. Лично я использую для отладки SQL запросов, но была, к примеру, необходимость отлавливать вызываемые ивенты в системе… в общем, плюшек там интересных хватает.

Continue reading

Eloquent: фильтр по hasMany

Мысли в одну строку: есть модель, у которой может быть множество других моделей. Такая связь указывается с помощью метода hasMany

При этом, если вы не знали или знали, но забыли, связать объект Variant с парентом можно с помощью belongsTo

Так вот, возникла необходимость получить список shedules, и в них провести фильтрацию объектов variant. Странно, но пришлось немного покопаться как на laracast.com, так и на прочих stackoverflow. Разгадка оказалась проста, хотя пришлось перепробовать много разных вариантов.

В этом случае в метод with надо передать массив данных с фильтрами.
Особый интерес у меня вызывает список sql запросов при рендеринге каждой страницы, но это уже другой вопрос.

Laravel: CSRF токен и REST (JWT)

Всем привет!

Вчера мне пришлось немного поломать голову над тем, как совместить использование CSRF и JWT с минимальными изменениями в рабочем коде. Как известно, использование CSRF токена в Laravel настроено по умолчанию, и при POST запросах ajax используется следующая схема.

Сам токен записывается в meta тег csrf-token, верно? Это стандартно в Laravel, упоминания об этом можно найти сразу же в разделе Routing в документации. Однако все хорошо до поры до времени — эта схема нерабочая, если ваша система должна поддерживать Rest интерфейсы, например, для доступа с мобильного приложения.

В Packagist  есть очень хорошая библиотека для работы с токенами с помощью JWT Auth. Подробно узнать что такое JSON Web Token можно здесь, попробую описать кратко, буквально в пару слов что это за зверь и как мы его можем использовать.

JWT это открытый стандарт обмена данными между ресурсами в качестве JSON объекта. Эта информация считается проверенной и ей можно доверять. Указанная выше библиотека берет на себя всю логику обработки, проверки и подтверждения полученных запросов, в настройках можно указать время жизни токена, а уже в готовых Middleware процедуры проверки подлинности и обновления токена, если он истек.

Continue reading

Подготовка данных для календаря в Laravel

Так уж получилось, что пришлось мне очень активно в последнее время перелезть с привычных лыж на Android на немного подзабытые, немного ржавенькие в некоторых местах, лыжи на PHP. Понадобилось мне сделать кастомный календарь, в который я смогу запихивать какие-то события (визуальное отображение, ну, и обработчик на jquery).

С готовыми решениями у меня как-то не сложилось. Jquery плагины все как один привязываются к полю Input, чтобы в него передавать данные, а те, что так не поступают, имеют какой-то откровенно страшный дизайн, что я в ужасе закрывал страницу.

Думаю, каждому это знакомо. Я про решение «Написать свой собственный велосипед», которому в интернет-литературе можно подобрать более красивое название «свой блекджек с шлюхами». Итак, первое, что мне необходимо, это знать — с какого дня недели начинается текущий месяц (в идеале знать неплохо, на каком числе предыдущий закончился). Второе — необходимо знать количество недель в месяце.

Continue reading

Laravel. Carbon. Timezone

В Laravel есть прекрасный пакет по работе с датами — Carbon. Я долгое время подозревал, что он мне поможет решить проблему с временными зонами на сайте — все временные метки хранятся в UTC, однако выводить данные и фильтровать нужно с учетом временной зоны пользователя (то есть из браузера).

Не стану рассказывать каким образом я получаю временную зону (может быть, напишу об этом позже), опишу вкратце как я добился хранения даты в UTC  и прозрачной работе пользователя с фильтрами времени.

Для фильтрации по времени использую следующий код:

Полученный объект  Carbon я отправляю в метод Where.

Для вывода же данных в нужной временной зоне, я использую мутаторы в Eloquent:

Временную метку я храню в сессии (напрямую использую только в качестве примера)