Я работаю с Eloquent уже более пяти лет, и пришло время поделиться своим опытом. Пристегните ремни, это будет хорошая поездка!
Eloquent — это хорошо отточенный инструмент, полюбившийся многим. Он позволяет с лёгкостью выполнять операции с базами данных, сохраняя при этом простой в использовании API. Реализуя паттерн Active Record (AR), описанный Fowler в книге PoEAA, он является одной из лучших реализаций AR, доступных на сегодня.
В этой статье я хотел бы рассказать несколько советов и рекомендаций, которые я узнал, экспериментируя с различными опциями. Например, задумывались ли вы когда-нибудь о том, чтобы тем или иным образом разделить свои жадные загрузки? Нет? Тогда я уверен, что вы узнаете как минимум кое-что новое, поэтому обязательно дочитайте до конца!
Как и все существующие инструменты, Eloquent имеет свой набор компромиссов. Как ответственные разработчики, мы должны всегда помнить о том, на что мы идём. Если вы хотите узнать больше об AR и философии её разработки, я очень рекомендую статью Shawn McCool.
https://www.dev-notes.ru/articles/eloquent/unorthodox-eloquent/
Eloquent — это хорошо отточенный инструмент, полюбившийся многим. Он позволяет с лёгкостью выполнять операции с базами данных, сохраняя при этом простой в использовании API. Реализуя паттерн Active Record (AR), описанный Fowler в книге PoEAA, он является одной из лучших реализаций AR, доступных на сегодня.
В этой статье я хотел бы рассказать несколько советов и рекомендаций, которые я узнал, экспериментируя с различными опциями. Например, задумывались ли вы когда-нибудь о том, чтобы тем или иным образом разделить свои жадные загрузки? Нет? Тогда я уверен, что вы узнаете как минимум кое-что новое, поэтому обязательно дочитайте до конца!
Как и все существующие инструменты, Eloquent имеет свой набор компромиссов. Как ответственные разработчики, мы должны всегда помнить о том, на что мы идём. Если вы хотите узнать больше об AR и философии её разработки, я очень рекомендую статью Shawn McCool.
https://www.dev-notes.ru/articles/eloquent/unorthodox-eloquent/
Заметки разработчика
Неортодоксальный Eloquent
Я работаю с Eloquent уже более пяти лет, и пришло время поделиться своим опытом. Пристегните ремни, это будет хорошая поездка!
🔥2👍1
В начале этого года в Chrome 112 появилась вложенность CSS, и теперь она есть во всех основных браузерах.
Однако в синтаксис было внесено одно строгое и потенциально неожиданное требование, указанное первым в разделе "Недопустимые примеры вложения" статьи "Вложенность CSS". В этой статье мы расскажем, что изменилось в спецификации и в Chrome 120.
https://www.dev-notes.ru/articles/css/css-nesting-relaxed-syntax-update/
Однако в синтаксис было внесено одно строгое и потенциально неожиданное требование, указанное первым в разделе "Недопустимые примеры вложения" статьи "Вложенность CSS". В этой статье мы расскажем, что изменилось в спецификации и в Chrome 120.
https://www.dev-notes.ru/articles/css/css-nesting-relaxed-syntax-update/
Заметки разработчика
Обновление синтаксиса CSS вложенности
В Chrome 120 включена функция заглядывающей вперёд вложенности.
В Symfony 6.4 вводится новый атрибут
Иногда сервисам требуется доступ к нескольким другим сервисам без уверенности в том, что все они действительно будут использоваться. Инъекция всех сервисов может снизить производительность (поскольку Symfony будет инстанцировать все сервисы, даже неиспользуемые), поэтому инъекция всего контейнера в приложениях Symfony категорически не рекомендуется.
Лучшим решением в таких случаях является использование подписчиков и локаторов сервисов. Локатор сервиса — это контейнер пользовательских сервисов, включающий только те сервисы, которые вы выбрали.
В Symfony 6.4 мы усовершенствовали локаторы сервисов, теперь их можно определять не через конфигурационные файлы, а с помощью PHP атрибутов. Новый атрибут
Вы также можете определить псевдонимы для этих служб и даже включить дополнительные службы, добавив к классу службы символ
Ознакомьтесь с исходным кодом
Если вы предпочитаете получать не локатор сервиса, а итератор, замените атрибут
https://www.dev-notes.ru/articles/symfony/new-in-symfony-6-4-autowirelocator-and-autowireiterator-attributes/
AutowireLocator, позволяющий определять локаторы сервисов с помощью PHP атрибутов, а не конфигурационных файлов.Иногда сервисам требуется доступ к нескольким другим сервисам без уверенности в том, что все они действительно будут использоваться. Инъекция всех сервисов может снизить производительность (поскольку Symfony будет инстанцировать все сервисы, даже неиспользуемые), поэтому инъекция всего контейнера в приложениях Symfony категорически не рекомендуется.
Лучшим решением в таких случаях является использование подписчиков и локаторов сервисов. Локатор сервиса — это контейнер пользовательских сервисов, включающий только те сервисы, которые вы выбрали.
В Symfony 6.4 мы усовершенствовали локаторы сервисов, теперь их можно определять не через конфигурационные файлы, а с помощью PHP атрибутов. Новый атрибут
#[AutowireLocator] принимает в качестве первого аргумента один идентификатор сервиса или массив идентификаторов сервисов:use App\CommandHandler\BarHandler;
use App\CommandHandler\FooHandler;
use Psr\Container\ContainerInterface;
use Symfony\Component\DependencyInjection\Attribute\AutowireLocator;
class SomeService
{
public function __construct(
#[AutowireLocator([FooHandler::class, BarHandler::class])]
private ContainerInterface $handlers,
) {
}
public function someMethod(): void
{
$fooService = $this->handlers->get(FooHandler::class);
}
}
Вы также можете определить псевдонимы для этих служб и даже включить дополнительные службы, добавив к классу службы символ
?:use App\CommandHandler\BarHandler;
use App\CommandHandler\FooHandler;
use Psr\Container\ContainerInterface;
use Symfony\Component\DependencyInjection\Attribute\Autowire;
use Symfony\Component\DependencyInjection\Attribute\AutowireLocator;
use Symfony\Contracts\Service\Attribute\SubscribedService;
class SomeService
{
public function __construct(
#[AutowireLocator([
'foo' => FooHandler::class,
'bar' => new SubscribedService(type: 'string', attributes: new Autowire('%some.parameter%')),
'optionalBaz' => '?'.BazHandler::class,
])]
private ContainerInterface $handlers,
) {
}
public function someMethod(): void
{
$fooService = $this->handlers->get('foo');
if ($this->handlers->has('optionalBaz')) {
// ...
}
}
}
Ознакомьтесь с исходным кодом
#[AutowireLocator], чтобы узнать о других его аргументах, таких как $indexAttribute, $defaultPriorityMethod, $exclude и т.д.Если вы предпочитаете получать не локатор сервиса, а итератор, замените атрибут
AutowireLocator на AutowireIterator.https://www.dev-notes.ru/articles/symfony/new-in-symfony-6-4-autowirelocator-and-autowireiterator-attributes/
Заметки разработчика
Новое в Symfony 6.4: Атрибуты AutowireLocator и AutowireIterator
В Symfony 6.4 вводится новый атрибут AutowireLocator, позволяющий определять локаторы сервисов с помощью PHP атрибутов.
💩2🫡1
DatePoint является полноценной заменой классов даты/времени PHP, предоставляющей множество утилит, полную интеграцию с компонентом Clock и улучшенную обработку ошибок.https://www.dev-notes.ru/articles/symfony/datepoint-a-new-immutable-date-time-class-for-symfony-6-4/
Заметки разработчика
DatePoint: Новый класс иммутабельной даты/времени для Symfony 6.4
DatePoint является полноценной заменой классов даты/времени PHP, предоставляющей множество утилит, полную интеграцию с Clock и улучшенную обработку ошибок.
В Symfony 6.4 добавлено 12 новых интеграций со сторонними сервисами в компоненты
https://www.dev-notes.ru/articles/symfony/new-in-symfony-6-4-mailer-translation-notifier-webhook-and-remoteevent-integrations/
Mailer, Translation, Notifier, Webhook и RemoteEvent.https://www.dev-notes.ru/articles/symfony/new-in-symfony-6-4-mailer-translation-notifier-webhook-and-remoteevent-integrations/
Заметки разработчика
Новое в Symfony 6.4: Интеграции Mailer, Translation, Notifier, Webhook и RemoteEvent
В Symfony 6.4 добавлено 12 новых интеграций со сторонними сервисами в компоненты Mailer, Translation, Notifier, Webhook и RemoteEvent.
[Совет #62] Поисковые системы любят просматривать все ваши файлы, поэтому будьте внимательны к тому, что вы оставляете на видном месте.
https://www.dev-notes.ru/articles/laravel/security-tip-protect-your-env-file/
https://www.dev-notes.ru/articles/laravel/security-tip-protect-your-env-file/
Заметки разработчика
Совет по безопасности: Защитите свой файл .env
[Совет #62] Поисковые системы любят просматривать все ваши файлы, поэтому будьте внимательны к тому, что вы оставляете на видном месте.
На данный момент вы, скорее всего, уже знакомы с большинством методов работы с массивами, особенно с методами map(), filter() и reduce(). Однако вы, вероятно, не знали, что некоторые вещи, которые вы первоначально делали с помощью методов map() и filter(), можно также сделать с помощью метода reduce(). Мы можем возвращать из метода reduce() массивы и даже объекты, а также использовать его в качестве счётчика, в зависимости от того, для какой задачи он нужен. Не теряя времени, давайте рассмотрим некоторые из этих сценариев, в которых может пригодиться метод reduce().
https://www.dev-notes.ru/articles/javascript/returning-arrays-and-objects-from-the-reduce-method/
https://www.dev-notes.ru/articles/javascript/returning-arrays-and-objects-from-the-reduce-method/
Заметки разработчика
Возврат массивов и объектов из метода reduce()
Приёмы, которые вы, вероятно, не знали о методе reduce()
git cherry-pick: точечный перенос коммитов между веткамиУстали от слияния целых веток ради одного исправления? Узнайте, как команда
git cherry-pick позволяет выборочно переносить только нужные изменения.#Git #DevOps #GitCommands
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2❤1
Если мы не знаем, как что-то работает, то ещё больше запутываемся, когда что-то ведёт себя не так, как ожидалось.
https://www.dev-notes.ru/articles/laravel/understanding-how-laravel-sessions-work/
https://www.dev-notes.ru/articles/laravel/understanding-how-laravel-sessions-work/
Заметки разработчика
Понимание принципов работы сессий в Laravel
Если мы не знаем, как что-то работает, то ещё больше запутываемся, когда что-то ведёт себя не так, как ожидалось.
В Symfony 6.4 добавлено разрешение бейджей безопасности в профилировщике, более безопасные логи безопасности и возможность раздельного определения нескольких паттернов в брандмауэрах безопасности.
https://www.dev-notes.ru/articles/symfony/new-in-symfony-6-4-security-improvements/
https://www.dev-notes.ru/articles/symfony/new-in-symfony-6-4-security-improvements/
Заметки разработчика
Новое в Symfony 6.4: Улучшения безопасности
В Symfony 6.4 добавлено разрешение бейджей безопасности в профилировщике, более безопасные логи безопасности и возможность раздельного определения нескольких паттернов в брандмауэрах безопасности.
Повторные отправки форм или запросов могут быть распространённой проблемой в веб-приложениях, часто приводящей к непредвиденным последствиям. Laravel предлагает простое решение для предотвращения таких дубликатов с помощью атомарной блокировки. В этой статье мы рассмотрим реализацию атомарной блокировки для обеспечения того, чтобы отправленная форма обрабатывалась только один раз. Кроме того, мы рассмотрим, как атомарные блокировки могут предотвратить многократную диспетчеризацию одного и того же задания.
https://www.dev-notes.ru/articles/laravel/preventing-duplicate-form-submissions-using-atomic-locks/
https://www.dev-notes.ru/articles/laravel/preventing-duplicate-form-submissions-using-atomic-locks/
Заметки разработчика
Предотвращение повторной отправки форм с помощью атомарной блокировки
Предотвращение повторных отправок форм и диспетчеризации заданий с помощью атомарных блокировок Laravel.
Давайте разберёмся нужны ли бандлеры для сборки JavaScript проектов? Есть ли выгода от пакетирования, или лучше загружать множество небольших js-файлов?
https://www.dev-notes.ru/articles/frontend/web-performance-and-parallel-vs.-waterfall-downloads/
https://www.dev-notes.ru/articles/frontend/web-performance-and-parallel-vs.-waterfall-downloads/
Заметки разработчика
Веб-производительность и параллельная vs. waterfall загрузка
Давайте разберёмся нужны ли бандлеры для сборки JavaScript проектов? Есть ли выгода от пакетирования, или лучше загружать множество небольших js-файлов?
Иногда требуется, чтобы список отображался не вертикально, а в виде горизонтального списка (как в навигационном меню).
https://www.dev-notes.ru/articles/css/semantic-horizontal-lists/
https://www.dev-notes.ru/articles/css/semantic-horizontal-lists/
Заметки разработчика
Семантические горизонтальные списки
Иногда требуется, чтобы список отображался не вертикально, а в виде горизонтального списка (как в навигационном меню).
❤1
Docker — это инструмент, облегчающий создание, развёртывание и запуск приложений с помощью контейнеров. Контейнеры позволяют инженеру упаковать приложение со всеми необходимыми компонентами, например библиотеками и другими зависимостями, и отправить его в виде единого пакета. Это означает, что приложение будет работать на любой другой машине, независимо от настроек, которые могут отличаться от настроек машины, использовавшейся для написания и тестирования кода.
https://www.dev-notes.ru/articles/devops/what-really-happens-when-you-command-docker-run/
https://www.dev-notes.ru/articles/devops/what-really-happens-when-you-command-docker-run/
Заметки разработчика
Что на самом деле происходит при выполнении команды 'Docker Run'
Docker — это инструмент, облегчающий создание, развёртывание и запуск приложений с помощью контейнеров.
Как настроить локальную среду разработки для тестирования классов или утилит пакета в рамках локального проекта Laravel.
https://www.dev-notes.ru/articles/laravel/create-a-laravel-package-on-your-local-environment/
https://www.dev-notes.ru/articles/laravel/create-a-laravel-package-on-your-local-environment/
Заметки разработчика
Создание Laravel пакета в локальной среде
Как настроить локальную среду разработки для тестирования классов или утилит пакета в рамках локального проекта Laravel.
В программировании, особенно в динамичном и постоянно развивающемся мире JavaScript, путь от новичка до опытного профессионала сопряжён с множеством трудностей и кривых обучения. Один из важнейших выводов, который я вынес из своего богатого опыта, как в качестве интервьюера, так и в качестве интервьюируемого, заключается в огромной важности понимания "почему", стоящего за нашими кодовыми решениями. Именно такое глубокое понимание и способность чётко сформулировать причины каждого решения действительно отличают исключительных специалистов.
https://www.dev-notes.ru/articles/javascript/clean-your-javascript-transform-conditional-statements/
https://www.dev-notes.ru/articles/javascript/clean-your-javascript-transform-conditional-statements/
Заметки разработчика
Очистите свой JavaScript: Трансформация условных операторов
В динамичном и постоянно развивающемся мире JavaScript, путь от новичка до опытного профессионала сопряжён с множеством трудностей и кривых обучения.
В этой статье я рассмотрю регулярные выражения, также известные как Regex, и попытаюсь убедить вас в том, что их наличие в вашей кодовой базе — плохая идея. Для краткости я не буду пытаться объяснить внутреннюю работу и применение Regex, но постараюсь убедить вас в необходимости их рефакторинга из вашей кодовой базы.
https://www.dev-notes.ru/articles/javascript/clean-your-javascript-get-rid-of-the-regular-expressions/
https://www.dev-notes.ru/articles/javascript/clean-your-javascript-get-rid-of-the-regular-expressions/
Заметки разработчика
Очистите свой JavaScript: Избавьтесь от регулярных выражений
В этой статье я рассмотрю регулярные выражения, также известные как Regex, и попытаюсь убедить вас в том, что их наличие в вашей кодовой базе — плохая идея.
В Symfony 6.4 реализована поддержка числовых кодов ISO 3166-1, улучшено ограничение Type, повышена точность форматирования временных сообщений, улучшена работа утилит фильтрации Finder...
https://www.dev-notes.ru/articles/symfony/new-in-symfony-6-4-dx-improvements-part-1/
https://www.dev-notes.ru/articles/symfony/new-in-symfony-6-4-dx-improvements-part-1/
Заметки разработчика
Новое в Symfony 6.4: Улучшения DX (часть 1)
В Symfony 6.4 реализована поддержка числовых кодов ISO 3166-1, улучшено ограничение Type, повышена точность форматирования временных сообщений.
Цепочка прототипов — это механизм в JavaScript, позволяющий объектам наследовать свойства и методы других объектов, имея общий прототип. В JavaScript каждый объект имеет связанный с ним прототип объекта, и эти прототипы образуют цепочку. Когда свойство или метод не найдены в объекте, JavaScript просматривает цепочку прототипов, чтобы найти его в прототипе объекта или в прототипах его предков.
https://www.dev-notes.ru/articles/javascript/what-is-prototype-chaining/
https://www.dev-notes.ru/articles/javascript/what-is-prototype-chaining/
Заметки разработчика
Что такое цепочка прототипов в JavaScript
Цепочка прототипов — это механизм в JavaScript, позволяющий объектам наследовать свойства и методы других объектов, имея общий прототип.