Как обновить устаревшую функцию PHPUnit withConsecutive()
В PHPUnit 9 метод
Метод
Для этого используется объект
Преимущества перехода на
🔸улучшенную читаемость кода и простоту его поддержки;
🔸возможность добавлять любые проверки и возвращаемые значения прямо в теле функции;
🔸независимость от особенностей реализации PHPUnit, что упрощает переход на будущие версии.
Кроме того, с использованием обычного PHP-кода можно легко внедрять в тесты необходимые исключения, возвращаемые значения и прочие проверки. Такой подход делает тесты проще и гибче, а код становится более поддерживаемым.
В PHPUnit 9 метод
withConsecutive()
был объявлен устаревшим, а в PHPUnit 10 — удалён, что вызвало множество вопросов на форумах и в проектах. Это изменение оказалось неудобным для разработчиков, так как прямой замены для метода не предусмотрено, и обновление зачастую требует много времени. Однако существует способ заменить withConsecutive()
, который делает тесты более гибкими и читаемыми.Метод
withConsecutive()
использовался для проверки параметров вызова метода в разном порядке. Например, при первом вызове ожидался один набор параметров, при втором — другой. Однако замена его с помощью метода willReturnCallback()
позволяет использовать более гибкий подход. В новом коде параметры проверяются в переданном в willReturnCallback()
анонимном методе, где также можно отслеживать номер вызова.Для этого используется объект
InvokedCount
, который увеличивает значение с каждым вызовом. Мы можем проверять параметры по вызовам, используя метод getInvocationCount()
(в PHPUnit 10 переименованный в numberOfInvocations()
).Преимущества перехода на
willReturnCallback()
включают:🔸улучшенную читаемость кода и простоту его поддержки;
🔸возможность добавлять любые проверки и возвращаемые значения прямо в теле функции;
🔸независимость от особенностей реализации PHPUnit, что упрощает переход на будущие версии.
Кроме того, с использованием обычного PHP-кода можно легко внедрять в тесты необходимые исключения, возвращаемые значения и прочие проверки. Такой подход делает тесты проще и гибче, а код становится более поддерживаемым.
🎉5❤2👍1
Forwarded from PHP jobs — вакансии по PHP, Symfony, Laravel
#дайджест #phpdevjob
Вакансии PHP разработчиков уровня Junior
▪️PHP-разработчик
Санкт-Петербург. Неватрип — международный туристический онлайн сервис
Подробнее
▪️PHP разработчик
Удаленка. Андагар — платформа для проведения спортивных соревнований/турниров
Подробнее
Вакансии PHP разработчиков уровня Middle
▪️Программист PHP
Тольятти. Интроверт — интегратор трансформации процессов продаж
Подробнее
▪️PHP-разработчик
Удаленка. Ньюмедиа Лаб — медиа-стартап
Подробнее
Вакансии PHP разработчиков уровня Senior
▪️PHP Developer
Удаленка. РЕДСМС — телекоммуникационная компания
Подробнее
▪️PHP разработчик
Удаленка. ЯКурьер — разработчик WMS-систем
Подробнее
Понравились вакансии?
❤️ — да
🤔 — нет
Вакансии PHP разработчиков уровня Junior
▪️PHP-разработчик
Санкт-Петербург. Неватрип — международный туристический онлайн сервис
Подробнее
▪️PHP разработчик
Удаленка. Андагар — платформа для проведения спортивных соревнований/турниров
Подробнее
Вакансии PHP разработчиков уровня Middle
▪️Программист PHP
Тольятти. Интроверт — интегратор трансформации процессов продаж
Подробнее
▪️PHP-разработчик
Удаленка. Ньюмедиа Лаб — медиа-стартап
Подробнее
Вакансии PHP разработчиков уровня Senior
▪️PHP Developer
Удаленка. РЕДСМС — телекоммуникационная компания
Подробнее
▪️PHP разработчик
Удаленка. ЯКурьер — разработчик WMS-систем
Подробнее
Понравились вакансии?
❤️ — да
🤔 — нет
spb.hh.ru
Вакансия Junior PHP-разработчик в Санкт-Петербурге, работа в компании Неватрип (вакансия в архиве c 21 ноября 2024)
Зарплата: от 60000 до 90000 ₽ за месяц. Санкт-Петербург. Требуемый опыт: не требуется. Полная занятость. Дата публикации: 24.10.2024.
😁5❤3😢1
#хочу_спросить
Задавайте любые вопросы о программировании и получайте ответы от пользователей. В комментариях под постом укажите #язык, #стек и/или #библиотеку, по которым задаете вопрос.
Задавайте любые вопросы о программировании и получайте ответы от пользователей. В комментариях под постом укажите #язык, #стек и/или #библиотеку, по которым задаете вопрос.
WatchR
Это утилита командной строки для проверки дат истечения срока действия доменных имен и сертификатов TLS.
Это утилита командной строки для проверки дат истечения срока действия доменных имен и сертификатов TLS.
GitHub
GitHub - flavioheleno/watchr: command-line utility to explore and validate domain names and certificates
command-line utility to explore and validate domain names and certificates - flavioheleno/watchr
👏1
Какие техники вы используете для оптимизации запросов к базе данных в Laravel?
1. Жадная загрузка (Избегание проблемы N+1)
По умолчанию Laravel использует ленивую загрузку, что может вызвать проблему N+1 запроса. Например, когда выполняется запрос для коллекции записей, а затем для каждой записи делается отдельный запрос к связанным данным. Жадная загрузка помогает избежать этой проблемы, выполняя один запрос для связанных данных.
2. Использование select для ограничения извлекаемых столбцов
Часто нет необходимости извлекать все столбцы таблицы. Используйте метод select, чтобы выбирать только нужные данные.
3. Чанковка запросов
При работе с большими наборами данных загрузка всего набора может перегрузить память. Используйте чанковку для извлечения данных небольшими порциями.
4. Использование whereIn вместо нескольких запросов
Если вам нужно проверить несколько значений для одного столбца, используйте whereIn, чтобы избежать нескольких отдельных запросов.
6. Индексация столбцов базы данных
Убедитесь, что столбцы, по которым часто выполняются запросы (например, используемые в условиях where), имеют соответствующие индексы в базе данных. Это значительно ускорит выполнение запросов.
Индексы можно создать через миграции Laravel:
7. Избегайте COUNT(*) с Eloquent, если это не нужно
Вместо загрузки всех строк только для их подсчета, используйте функцию count() напрямую.
8. Кэширование частых запросов
Если одни и те же запросы выполняются часто, рассмотрите возможность кэширования их результатов, чтобы уменьшить нагрузку на базу данных.
9. Использование DB::raw для сложных SQL-запросов
Для сложных запросов или в случаях, когда требуются определенные SQL-оптимизации (например, использование функций или подзапросов), можно использовать
DB::raw.
10. Использование пула подключений к базе данных
Использование пула подключений (connection pooling), где это возможно, позволяет повторно использовать существующие подключения к базе данных вместо открытия новых для каждого запроса. Это может значительно сократить задержки выполнения запросов, хотя это больше относится к настройкам сервера, чем к самому Laravel.
#вопросы_с_собеседований
1. Жадная загрузка (Избегание проблемы N+1)
По умолчанию Laravel использует ленивую загрузку, что может вызвать проблему N+1 запроса. Например, когда выполняется запрос для коллекции записей, а затем для каждой записи делается отдельный запрос к связанным данным. Жадная загрузка помогает избежать этой проблемы, выполняя один запрос для связанных данных.
// Ленивая загрузка (неэффективно)
$posts = Post::all();
foreach ($posts as $post) {
echo $post->user->name;
}
// Жадная загрузка (оптимизировано)
$posts = Post::with('user')->get();
foreach ($posts as $post) {
echo $post->user->name;
}
2. Использование select для ограничения извлекаемых столбцов
Часто нет необходимости извлекать все столбцы таблицы. Используйте метод select, чтобы выбирать только нужные данные.
// Извлечение всех столбцов (неэффективно)
$users = User::all();
// Извлечение только необходимых столбцов (оптимизировано)
$users = User::select('id', 'name', 'email')->get();
3. Чанковка запросов
При работе с большими наборами данных загрузка всего набора может перегрузить память. Используйте чанковку для извлечения данных небольшими порциями.
// Извлечение по 100 записей за раз
User::chunk(100, function ($users) {
foreach ($users as $user) {
// Обработка каждого пользователя
}
});
4. Использование whereIn вместо нескольких запросов
Если вам нужно проверить несколько значений для одного столбца, используйте whereIn, чтобы избежать нескольких отдельных запросов.
// Вместо выполнения нескольких запросов
$users1 = User::where('role_id', 1)->get();
$users2 = User::where('role_id', 2)->get();
// Использование whereIn для одного запроса
$users = User::whereIn('role_id', [1, 2])->get();
6. Индексация столбцов базы данных
Убедитесь, что столбцы, по которым часто выполняются запросы (например, используемые в условиях where), имеют соответствующие индексы в базе данных. Это значительно ускорит выполнение запросов.
Индексы можно создать через миграции Laravel:
Schema::table('users', function (Blueprint $table) {
$table->index('email');
});
7. Избегайте COUNT(*) с Eloquent, если это не нужно
Вместо загрузки всех строк только для их подсчета, используйте функцию count() напрямую.
// Неэффективно: загрузка всех записей для подсчета
$users = User::all()->count();
// Эффективно: использование count напрямую
$userCount = User::count();
8. Кэширование частых запросов
Если одни и те же запросы выполняются часто, рассмотрите возможность кэширования их результатов, чтобы уменьшить нагрузку на базу данных.
// Кэширование результата запроса на 60 минут
$users = Cache::remember('users', 60, function () {
return User::all();
});
9. Использование DB::raw для сложных SQL-запросов
Для сложных запросов или в случаях, когда требуются определенные SQL-оптимизации (например, использование функций или подзапросов), можно использовать
DB::raw.
10. Использование пула подключений к базе данных
Использование пула подключений (connection pooling), где это возможно, позволяет повторно использовать существующие подключения к базе данных вместо открытия новых для каждого запроса. Это может значительно сократить задержки выполнения запросов, хотя это больше относится к настройкам сервера, чем к самому Laravel.
#вопросы_с_собеседований
👍15👾1
Property hooks на практике
В грядущем обновлении PHP 8.4 планируется добавить две значимые функции: property hooks и асимметричную видимость (асимметричный доступ к свойствам, aviz). Эти нововведения разработали Илия Товило и автор статьи, работавшие над ними два года.
Property hooks позволяют избавиться от необходимости создавать методы-геттеры и сеттеры «на всякий случай». Новая система управления свойствами позволит разработчикам добавлять логику к доступу свойств, когда это необходимо. Например, можно реализовать свойства в интерфейсах, не используя лишний код, и задавать гибкие настройки для интерфейсных свойств.
Пример из проекта автора: система, которая управляет файловыми страницами (Page) в директории (Folder). Страницы могут включать метаданные, такие как название, описание, теги и дату последнего изменения. В версии PHP 8.3 разработчикам приходилось создавать дополнительные методы для доступа к каждому свойству. С property hooks это стало проще и чище, так как теперь можно работать с интерфейсными свойствами напрямую.
В грядущем обновлении PHP 8.4 планируется добавить две значимые функции: property hooks и асимметричную видимость (асимметричный доступ к свойствам, aviz). Эти нововведения разработали Илия Товило и автор статьи, работавшие над ними два года.
Property hooks позволяют избавиться от необходимости создавать методы-геттеры и сеттеры «на всякий случай». Новая система управления свойствами позволит разработчикам добавлять логику к доступу свойств, когда это необходимо. Например, можно реализовать свойства в интерфейсах, не используя лишний код, и задавать гибкие настройки для интерфейсных свойств.
Пример из проекта автора: система, которая управляет файловыми страницами (Page) в директории (Folder). Страницы могут включать метаданные, такие как название, описание, теги и дату последнего изменения. В версии PHP 8.3 разработчикам приходилось создавать дополнительные методы для доступа к каждому свойству. С property hooks это стало проще и чище, так как теперь можно работать с интерфейсными свойствами напрямую.
PeakD
Property hooks in Practice | PeakD
Property hooks, asymmetric visibility, interface properties... PHP 8.4 has hot new features. Let's see them in action.... by crell
👏5🎉5
❗Директива
В нашем примере директива
@env_required()
позволяет проверять, что переменная среды установлена и имеет значение, отличное от null. Она может быть полезна для обеспечения того, чтобы приложение работало правильно только при наличии определенных переменных среды.В нашем примере директива
@env_required()
используется для проверки переменной среды APP_KEY
. Если переменная не установлена, будет выброшено исключение.❤5🔥2😁2🤔1
Привет, друзья! 👋
Мы готовим статью о секретах мастерства в программировании и хотим узнать ваше мнение! 💻
Какие качества, по вашему мнению, отличают действительно выдающегося программиста? 🏆
Мы готовим статью о секретах мастерства в программировании и хотим узнать ваше мнение! 💻
Какие качества, по вашему мнению, отличают действительно выдающегося программиста? 🏆
🥱4👍1👏1
Очереди задач: простой способ пакетной обработки
Как работает очередь задач на примере создания миниатюр для видео.
Цель: после загрузки видео оно должно высветиться в виде миниатюры
Как работает очередь задач на примере создания миниатюр для видео.
Цель: после загрузки видео оно должно высветиться в виде миниатюры
👍7🔥3🥰2
#дайджест новостей по PHP за неделю:
🔎PHP 8.4.0 RC3 доступен для тестирования — Команда PHP рада объявить о выпуске PHP 8.4.0, RC3. Это третий релиз-кандидат, продолжающий цикл выпуска PHP 8.4, примерный план которого указан в PHP Wiki.
🔎PHP 8.2.25 и PHP 8.3.13 выпущены! — Команда разработчиков PHP объявляет о скором выходе PHP 8.2.25 и PHP 8.3.13. Это релиз, исправляющий ошибки. Всем пользователям PHP 8.3 рекомендуется обновиться до этой версии.
🔎Выпущен Symfony 7.2.0-BETA1
🔎Выпущен Symfony 7.1.6
🔎PHP 8.4.0 RC3 доступен для тестирования — Команда PHP рада объявить о выпуске PHP 8.4.0, RC3. Это третий релиз-кандидат, продолжающий цикл выпуска PHP 8.4, примерный план которого указан в PHP Wiki.
🔎PHP 8.2.25 и PHP 8.3.13 выпущены! — Команда разработчиков PHP объявляет о скором выходе PHP 8.2.25 и PHP 8.3.13. Это релиз, исправляющий ошибки. Всем пользователям PHP 8.3 рекомендуется обновиться до этой версии.
🔎Выпущен Symfony 7.2.0-BETA1
🔎Выпущен Symfony 7.1.6
1👍4
Стратегия оптимизации производительности Laravel: от анализа исходного кода к реальной практике
Чтобы повысить производительность проектов на Laravel, разработчикам стоит использовать многогранный подход к оптимизации. Здесь рассмотрены ключевые стратегии, которые помогают ускорить работу приложений на Laravel, как с точки зрения кода, так и практической настройки.
Чтобы повысить производительность проектов на Laravel, разработчикам стоит использовать многогранный подход к оптимизации. Здесь рассмотрены ключевые стратегии, которые помогают ускорить работу приложений на Laravel, как с точки зрения кода, так и практической настройки.
DEV Community
Laravel performance optimization strategy: from source code analysis to actual practice
Laravel is a powerful and flexible PHP framework, but to achieve optimal performance in real-world...
1🥱8👍2❤1
CPX
Это как npx но для PHP. Этот инструмент позволяет выполнить любую команду из любого пакета Composer, даже если он не установлен в вашем проекте.
Это как npx но для PHP. Этот инструмент позволяет выполнить любую команду из любого пакета Composer, даже если он не установлен в вашем проекте.
GitHub
GitHub - imliam/cpx: Run any command from any composer package, even if it's not installed in your project.
Run any command from any composer package, even if it's not installed in your project. - imliam/cpx
🔥15
Forwarded from Библиотека собеса по PHP | вопросы с собеседований
Что такое TDD?
TDD (Test-Driven Development) — это методология разработки программного обеспечения, в которой разработка программы начинается с написания тестов, которые определяют желаемое поведение программы. Затем код разрабатывается и изменяется таким образом, чтобы эти тесты проходили успешно.
Процесс TDD обычно состоит из трех шагов, известных как «Красный», «Зеленый» и «Рефакторинг»:
Красный (Red): Сначала пишутся тесты для новой функциональности или для исправления ошибок. Поскольку этот этап выполняется до написания реализации, все тесты должны завершаться неудачей (иметь статус «красный»).
Зеленый (Green): Затем пишется минимальное количество кода, необходимое для прохождения тестов. Цель — сделать все тесты прошедшими (иметь статус «зеленый»).
Рефакторинг (Refactor): После того как все тесты прошли успешно, код можно улучшить, переработав его для улучшения структуры, производительности и т. д., сохраняя при этом поведение программы неизменным. Это позволяет улучшать код без риска нарушения его функциональности.
TDD (Test-Driven Development) — это методология разработки программного обеспечения, в которой разработка программы начинается с написания тестов, которые определяют желаемое поведение программы. Затем код разрабатывается и изменяется таким образом, чтобы эти тесты проходили успешно.
Процесс TDD обычно состоит из трех шагов, известных как «Красный», «Зеленый» и «Рефакторинг»:
Красный (Red): Сначала пишутся тесты для новой функциональности или для исправления ошибок. Поскольку этот этап выполняется до написания реализации, все тесты должны завершаться неудачей (иметь статус «красный»).
Зеленый (Green): Затем пишется минимальное количество кода, необходимое для прохождения тестов. Цель — сделать все тесты прошедшими (иметь статус «зеленый»).
Рефакторинг (Refactor): После того как все тесты прошли успешно, код можно улучшить, переработав его для улучшения структуры, производительности и т. д., сохраняя при этом поведение программы неизменным. Это позволяет улучшать код без риска нарушения его функциональности.
🔥10👍5
⚙️ Подпишись на нашу еженедельную email-рассылку, чтобы быть в курсе последних открытий и тенденций в мире бэкенда.
В еженедельных письмах ты найдешь:
● Языки программирования и фреймворки для бэкенда
● Архитектура и проектирование серверных приложений
● Базы данных и управление данными
● Безопасность и защита данных
● Облачные технологии и DevOps
● API и интеграции
● Тестирование и отладка
● Инструменты и утилиты для бэкенд-разработчиков
● Лучшие практики и паттерны проектирования
👉Подписаться👈
В еженедельных письмах ты найдешь:
● Языки программирования и фреймворки для бэкенда
● Архитектура и проектирование серверных приложений
● Базы данных и управление данными
● Безопасность и защита данных
● Облачные технологии и DevOps
● API и интеграции
● Тестирование и отладка
● Инструменты и утилиты для бэкенд-разработчиков
● Лучшие практики и паттерны проектирования
👉Подписаться👈
👾1
Новое в Symfony 7.2
🔸Новый линтер для проверки переводов —
🔸Улучшена работа с составными (compound) ограничениями для валидации. Compound constraint позволяет объединять несколько ограничений в одно, чтобы повторно использовать его в разных частях приложения. Например, можно создать ограничение
🔸Добавлен новый атрибут
🔸Улучшена работа с полем
Когда choice_lazy включен, список значений остается пустым до тех пор, пока они не понадобятся, что позволяет избежать ненужных запросов к базе данных и снижает нагрузку. При необходимости значения подгружаются и кэшируются.
Примеры использования лежат по ссылкам👆
🔸Новый линтер для проверки переводов —
lint:translations
. В отличие от существующей команды lint:xliff
, которая проверяет только XLIFF-файлы, lint:translations анализирует все переводы, независимо от формата. Эта команда полезна для поиска ошибок в синтаксисе ICU MessageFormat, который может быть сложным (например, легко забыть закрывающую фигурную скобку или форму для множественного числа).🔸Улучшена работа с составными (compound) ограничениями для валидации. Compound constraint позволяет объединять несколько ограничений в одно, чтобы повторно использовать его в разных частях приложения. Например, можно создать ограничение
MatchPasswordPolicy
для проверки пароля, включающее минимальную длину, отсутствие компрометации, наличие заглавных букв и другие правила. Это удобно применять к полям, требующим одинаковой проверки, как в классе пользователя User
.🔸Добавлен новый атрибут
#[WhenNot]
, который позволяет исключить сервис из определенных окружений конфигурации. Этот атрибут дополняет существующий #[When]
, который регистрирует сервисы только для указанных окружений, как dev. Новый атрибут упрощает настройку, если нужно исключить сервисы из нескольких окружений (например, из dev и test), без необходимости прописывать #[When]
для каждого окружения.🔸Улучшена работа с полем
EntityType
в формах для повышения производительности при работе с большими наборами данных. Теперь добавлена возможность использовать опцию choice_lazy
, которая включает ленивую загрузку значений с помощью нового LazyChoiceLoader
.Когда choice_lazy включен, список значений остается пустым до тех пор, пока они не понадобятся, что позволяет избежать ненужных запросов к базе данных и снижает нагрузку. При необходимости значения подгружаются и кэшируются.
Примеры использования лежат по ссылкам👆
🔥4👍3