Ушла из жизни Юлия Insolita
Юлия — самая активная участница русского PHP-сообщества. Она контрибьютила в Open Source, возглавляла сообщество Иркутска в Telegram, помогала Роме с дайджестами, комментировала каждый стрим.
По-итальянски insolita означает "необычная", "необыкновенная". Такой Юля и была, такой мы её и запомним.
В память о Юлии предлагаю полистать её блоги на dev.to и medium.
Юлия — самая активная участница русского PHP-сообщества. Она контрибьютила в Open Source, возглавляла сообщество Иркутска в Telegram, помогала Роме с дайджестами, комментировала каждый стрим.
По-итальянски insolita означает "необычная", "необыкновенная". Такой Юля и была, такой мы её и запомним.
В память о Юлии предлагаю полистать её блоги на dev.to и medium.
😢179👍3
Какой стиль именования лучше всего подходит для кейсов enum?
Anonymous Poll
29%
camelCase
15%
PascalCase
4%
snake_case
51%
SCREAMING_SNAKE_CASE
💩16👍3🔥3
enum EnumNaming
{
case camelCase;
case PascalCase;
case snake_case;
case SCREAMING_SNAKE_CASE;
}
dump(
EnumNaming::camelCase,
EnumNaming::PascalCase,
EnumNaming::snake_case,
EnumNaming::SCREAMING_SNAKE_CASE,
);
💩27🔥7👍6
🤝 Встреча с программным комитетом PHP Russia 2022
• У меня есть тема, но я не решаюсь выступить.
• Я выступил на митапе, но не уверен, что мой доклад подходит для конференции.
• Однажды я подал доклад, но его отклонили, больше не хочу.
• Я хотел бы выступить, но, кажется, в нашем высоконагруженном проекте с тремя фреймворками, пятью видами БД, сотней микросервисов и кубернетесом нет ничего интересного.
Пыхарь, если при упоминании слова "конференция" у тебя проносятся такие мысли, то это замечательно, потому что ты без пяти минут докладчик! Мы ждём тебя сегодня в 19:00, чтобы вдохновить, помочь и направить. Буду рад стать твоим ментором и выступить бок о бок в сентябре!
Подробности в канале конференции: https://news.1rj.ru/str/PHPRussiaConfChannel/295.
• У меня есть тема, но я не решаюсь выступить.
• Я выступил на митапе, но не уверен, что мой доклад подходит для конференции.
• Однажды я подал доклад, но его отклонили, больше не хочу.
• Я хотел бы выступить, но, кажется, в нашем высоконагруженном проекте с тремя фреймворками, пятью видами БД, сотней микросервисов и кубернетесом нет ничего интересного.
Пыхарь, если при упоминании слова "конференция" у тебя проносятся такие мысли, то это замечательно, потому что ты без пяти минут докладчик! Мы ждём тебя сегодня в 19:00, чтобы вдохновить, помочь и направить. Буду рад стать твоим ментором и выступить бок о бок в сентябре!
Подробности в канале конференции: https://news.1rj.ru/str/PHPRussiaConfChannel/295.
Telegram
PHP Russia Channel
Всем привет,
21 апреля в 19:00 приглашаем на онлайн-встречу с Программным комитетом PHP Russia.
Мы принимаем доклады до 25 мая - остается всего месяц, поэтому в четверг расскажем:
- про тематические секции,
- какие заявки проходят в программу,
-…
21 апреля в 19:00 приглашаем на онлайн-встречу с Программным комитетом PHP Russia.
Мы принимаем доклады до 25 мая - остается всего месяц, поэтому в четверг расскажем:
- про тематические секции,
- какие заявки проходят в программу,
-…
👍27💩25🔥7👎2
📺 Очень крутая серия видео про дженерики в PHP от Brent Roose, смотрится легко и быстро.
https://youtube.com/playlist?list=PL0bgkxUS9EaKyOugEDffRzsvupBE2YEoD
https://youtube.com/playlist?list=PL0bgkxUS9EaKyOugEDffRzsvupBE2YEoD
YouTube
Generics in PHP
This is the first video in a four-part series on using generics in PHP. This video covers the basics about what generics are and what they can be used for.
🔥32
🤯 Перестань не использовать функции в PHP!
Функции??? Да! Те самые функции, которые когда-то все спокойно юзали, но которые позже заменили класс-ориентированным программированием с неймингом вида
Функция — это никакой не code smell, а удобная конструкция процедурного программирования, которую не стоит избегать и недооценивать. Если ты считаешь наоборот, я попробую тебя переубедить!
Сначала разберём два традиционных замечания к функциям. Во-первых, в PHP для функций не предусмотрен автолоадинг. Да, файлы с функциями нужно явно прописывать в autoload.files, они будут загружаться на каждом хите. Однако, этот оверхед пренебрежим в случае "умирающего" PHP и отстутствует вообще, если используется preloading или PHP "не умирает". Поэтому тут в минусы запишем только возню с
Во-вторых, функции нельзя мокать. Это традиционное мокистское заявление, на которое почти всегда можно ответить: "Так не мокай!" и послать к Фаулеру. Функция — это имплементация, а не интерфейс. "Интерфейс" функции
А вот плюсов я насчитал куда больше!
➕Функции идеально подходят для операций, не требующих организации состояния. Согласитесь, класс с приватным конструктором без состояния — этокастрат костыль.
➕Декларация функции, очевидно, лаконичнее декларации класса.
➕В один файл можно положить несколько функций, это не нарушает стандарты. При этом название файла не должно соответствовать имени функции.
➕Так же, как и классы, функции могут быть определены в неймспейсе, ничто не мешает вам объявить свои функции для каждого модуля.
➕Функция лаконичнее выглядит в вызывающем коде:
Критерии хорошей функции всё те же: низкая цикломатическая сложность, небольшое количество параметров, SRP. Если функцию "раздуло", то либо её надо разбить на несколько функций с разными именами, либо задачу всё-таки надо решать с использованием классов.
Вот несколько функций из нашего проекта: https://gist.github.com/vudaltsov/eb53927894cb467588e67352e2d8f1d9.
И напоследок статья Никиты Попова, которая несколько лет назад могла мне поменять отношение к функциям: https://www.npopov.com/2012/08/10/Are-PHP-developers-functophobic.html.
Пиши в комментариях, используешь ли ты функции или нет и почему.
Функции??? Да! Те самые функции, которые когда-то все спокойно юзали, но которые позже заменили класс-ориентированным программированием с неймингом вида
Utils, *Helper и т.д. Функция — это никакой не code smell, а удобная конструкция процедурного программирования, которую не стоит избегать и недооценивать. Если ты считаешь наоборот, я попробую тебя переубедить!
Сначала разберём два традиционных замечания к функциям. Во-первых, в PHP для функций не предусмотрен автолоадинг. Да, файлы с функциями нужно явно прописывать в autoload.files, они будут загружаться на каждом хите. Однако, этот оверхед пренебрежим в случае "умирающего" PHP и отстутствует вообще, если используется preloading или PHP "не умирает". Поэтому тут в минусы запишем только возню с
composer.json.Во-вторых, функции нельзя мокать. Это традиционное мокистское заявление, на которое почти всегда можно ответить: "Так не мокай!" и послать к Фаулеру. Функция — это имплементация, а не интерфейс. "Интерфейс" функции
time — это callаble в PHP и callable(): int в Psalm/PHPStan. Чтобы заабстрагировать функцию, её следует объявить как callable инъекцию или параметр (см. пост #133), и тогда в тесте можно передать всё что угодно. Если же мы говорим про "захардкоженное" использование функции, то, если она не берёт на себя больше, чем должна, это не составит проблем. Никто же не боится в коде "хардкодить" array_map или trim. Главное, чтобы функции сами были протестированы.А вот плюсов я насчитал куда больше!
➕Функции идеально подходят для операций, не требующих организации состояния. Согласитесь, класс с приватным конструктором без состояния — это
➕Декларация функции, очевидно, лаконичнее декларации класса.
➕В один файл можно положить несколько функций, это не нарушает стандарты. При этом название файла не должно соответствовать имени функции.
➕Так же, как и классы, функции могут быть определены в неймспейсе, ничто не мешает вам объявить свои функции для каждого модуля.
➕Функция лаконичнее выглядит в вызывающем коде:
myFunction() vs MyClass::myMethod().Критерии хорошей функции всё те же: низкая цикломатическая сложность, небольшое количество параметров, SRP. Если функцию "раздуло", то либо её надо разбить на несколько функций с разными именами, либо задачу всё-таки надо решать с использованием классов.
Вот несколько функций из нашего проекта: https://gist.github.com/vudaltsov/eb53927894cb467588e67352e2d8f1d9.
И напоследок статья Никиты Попова, которая несколько лет назад могла мне поменять отношение к функциям: https://www.npopov.com/2012/08/10/Are-PHP-developers-functophobic.html.
Пиши в комментариях, используешь ли ты функции или нет и почему.
👍66👎37🔥9
📈 Выборочная оптимизация на примере Composer 2.2
Рекомендую январский выпуск Пятиминутки PHP, в котором Пётр разобрался, как разработчики ускорили Composer, и поставил под сомнение их результат.
Однако в этом посте я хочу поговорить не про результат, а про подход. Он называется выборочной оптимизацией: подпрограмму улучшают не целиком, а только для конкретных случаев. Попробую обобщить и формализовать такой метод:
1. Исследуем очередное узкое горлышко в программе.
2. Ищем предпосылку, при которой можно можно провести оптимизацию подпрограммы.
3. Выдвигаем гипотезу о том, что при использовании программы предпосылка выполняется достаточно часто.
4. В случае подтверждения гипотезы, проводим оптимизацию для этой предпосылки.
Здесь важен баланс между стоимостью оптимизации (затраты на внедрение, прирост сложности кода) и профитом от неё (изменение целевых метрик, доля улучшенных сценариев). Иными словами, игра должна стоить свеч.
https://5minphp.ru/episode95/
Рекомендую январский выпуск Пятиминутки PHP, в котором Пётр разобрался, как разработчики ускорили Composer, и поставил под сомнение их результат.
Однако в этом посте я хочу поговорить не про результат, а про подход. Он называется выборочной оптимизацией: подпрограмму улучшают не целиком, а только для конкретных случаев. Попробую обобщить и формализовать такой метод:
1. Исследуем очередное узкое горлышко в программе.
2. Ищем предпосылку, при которой можно можно провести оптимизацию подпрограммы.
3. Выдвигаем гипотезу о том, что при использовании программы предпосылка выполняется достаточно часто.
4. В случае подтверждения гипотезы, проводим оптимизацию для этой предпосылки.
Здесь важен баланс между стоимостью оптимизации (затраты на внедрение, прирост сложности кода) и профитом от неё (изменение целевых метрик, доля улучшенных сценариев). Иными словами, игра должна стоить свеч.
https://5minphp.ru/episode95/
Пятиминутка PHP
Оптимизация производительности в Composer 2.2
В декабре 2021 года вышло обновление пакетного менеджера Composer, версия 2.2. Заявлено увеличение производительност в некоторых случаях на 90%. Как это возможно и почему Composer раньше …
🔥15👍7
Пыхарь, используешь ли ты мутационное тестирование?
Anonymous Poll
55%
Что?
38%
Слышал про такое, не пробовал.
3%
Использую только в pet-проектах.
2%
Пробовали на работе, не удалось внедрить. Сейчас в комментариях расскажу, почему.
2%
Успешно используем в рабочем проекте.
👍17
SuperJob о зарплатах PHP-разработчика в июне 2022 года
Информация для канала предоставлена пресс-службой SuperJob.
Программисты PHP в среднем зарабатывают в Москве 250 тыс. руб. в месяц, в Санкт-Петербурге — 210 тыс. руб., в Екатеринбурге и Ростове-на-Дону — по 200 тыс. руб. Наиболее востребованы специалисты с опытом разработки на PHP от 2 лет. Работодатели отдают предпочтение кандидатам с опытом работы с различными фреймворками, навыками рефакторинга чужого кода и unit-тестирования. Также востребован опыт проектирования и поддержки клиент-серверного API.
Минимальные зарплаты для кандидатов с опытом работы с PHP от полугода составляют 90-120 тыс. руб. в Москве, 80-100 тыс. руб. в Санкт-Петербурге и от 60/70-100 тыс. руб. в городах миллионниках. Чтобы претендовать на такую зарплату, кандидат должен знать теории баз данных и иметь опыт работы с СУБД, знать ООП, JavaScript, HTML и CSS, XM, а также уметь читать техническую документацию на английском языке.
При этом максимальные зарплатные предложения составляют 300-500 тыс. руб. в Москве, 250-420 тыс. в Санкт-Петербурге, до 350 тыс. руб. в Екатеринбурге, Ростове-на-Дону и Краснодаре — до 400 тыс. руб. в месяц, в Новосибирске — 380 тыс. и в Казани – 350 тыс. руб. в месяц.
Кстати по данным SuperJob, за год средние зарплатные предложения в IT-сфере выросли на 20,4%, а количество вакансий в IT за месяц увеличилось на 11%.
Подробнее и больше цифр: https://www.superjob.ru/research/articles/113508/programmist-php/
Информация для канала предоставлена пресс-службой SuperJob.
Программисты PHP в среднем зарабатывают в Москве 250 тыс. руб. в месяц, в Санкт-Петербурге — 210 тыс. руб., в Екатеринбурге и Ростове-на-Дону — по 200 тыс. руб. Наиболее востребованы специалисты с опытом разработки на PHP от 2 лет. Работодатели отдают предпочтение кандидатам с опытом работы с различными фреймворками, навыками рефакторинга чужого кода и unit-тестирования. Также востребован опыт проектирования и поддержки клиент-серверного API.
Минимальные зарплаты для кандидатов с опытом работы с PHP от полугода составляют 90-120 тыс. руб. в Москве, 80-100 тыс. руб. в Санкт-Петербурге и от 60/70-100 тыс. руб. в городах миллионниках. Чтобы претендовать на такую зарплату, кандидат должен знать теории баз данных и иметь опыт работы с СУБД, знать ООП, JavaScript, HTML и CSS, XM, а также уметь читать техническую документацию на английском языке.
При этом максимальные зарплатные предложения составляют 300-500 тыс. руб. в Москве, 250-420 тыс. в Санкт-Петербурге, до 350 тыс. руб. в Екатеринбурге, Ростове-на-Дону и Краснодаре — до 400 тыс. руб. в месяц, в Новосибирске — 380 тыс. и в Казани – 350 тыс. руб. в месяц.
Кстати по данным SuperJob, за год средние зарплатные предложения в IT-сфере выросли на 20,4%, а количество вакансий в IT за месяц увеличилось на 11%.
Подробнее и больше цифр: https://www.superjob.ru/research/articles/113508/programmist-php/
SuperJob.ru
Программист PHP - Исследовательский центр портала SuperJob.ru
Обзоры зарплат: Программист PHP
👍55👎10
Пых
Какая у тебя ЗП в тысячах рублей?
Дудь, разлогинься 😂
Дудь, разлогинься 😂
В продолжение предыдущего поста предлагаю повторить наш опрос о ЗП. Сравним результаты с сентябрём 2020. Итак, пыхарь, сколько нынче получаешь в тысячах рублей?
Anonymous Poll
10%
<50
15%
50-100
18%
100-150
18%
150-200
15%
200-250
9%
250-300
5%
300-350
3%
350-400
1%
400-450
5%
>450
🔥43🤩5👍4👎4
🏫 Мой продвинутый курс по PHP
Я уже пару лет мечтаю о том, чтобы масштабно и комплексно поделиться знаниями, и наконец-то мне представилась возможность записать свой продвинутый курс по PHP! Огромное спасибо Loftschool за предложение посотрудничать!
Осенью мы начнём работу над курсом, а пока приглашаю вас посмотреть мастер-класс про паттерн middleware, который я записал в качестве пролога.
https://youtu.be/yMrbatAM3bw
Я уже пару лет мечтаю о том, чтобы масштабно и комплексно поделиться знаниями, и наконец-то мне представилась возможность записать свой продвинутый курс по PHP! Огромное спасибо Loftschool за предложение посотрудничать!
Осенью мы начнём работу над курсом, а пока приглашаю вас посмотреть мастер-класс про паттерн middleware, который я записал в качестве пролога.
https://youtu.be/yMrbatAM3bw
YouTube
Готовим Middleware в PHP
В этом мастер-классе Валентин Удальцов расскажет о middleware как об архитектурном шаблоне и ООП-паттерне в контексте PHP. Вы узнаете, как выглядит контракт middleware, как построить пайплайн для запуска цепочки обработчиков, какие преимущества имеет middleware…
🔥130👍32👎3🎉1👌1
Тип parent
Недавно осознал, что
https://3v4l.org/TDXEa
Недавно осознал, что
parent можно использовать как тип в любых местах. Вроде и логично, но как-то странно... Согласитесь, вы бы поёжились, если бы увидели что-то подобное на ревью.
final class ParentOverdose extends ArrayObject
{
public function __construct(
public parent $iAmParent,
) {
parent::__construct();
}
public function iReturnParent(): parent
{
return new parent();
}
public function iAcceptParent(parent $parent): void
{
}
}
https://3v4l.org/TDXEa
3v4l.org
Online PHP editor | output for TDXEa
Run your php code online; get statistics, vld output and compare output from all versions.
🤯54🔥13👍11🤩7👏2
Ищу к себе в команду middle/senior разработчика!
В Happy Inc мы исследуем вовлечённость и лояльность персонала в крупных компаниях: проводим анонимные опросы, строим сложные отчёты, доставляем их клиентам в различных форматах.
У нас модульный монолит без легаси. PHP 8.1 / Symfony 6.1 / PostgreSQL 14 / RabbitMQ / OpenAPI / CQRS / Psalm / Thesis и всё, о чём я тут рассказываю. 😜
Full-time, пока приоритетно в офис, ЗП по результатам собеса.
Резюме мне в ЛС @vudaltsov.
Update: пока неактуально в связи с ситуацией.
В Happy Inc мы исследуем вовлечённость и лояльность персонала в крупных компаниях: проводим анонимные опросы, строим сложные отчёты, доставляем их клиентам в различных форматах.
У нас модульный монолит без легаси. PHP 8.1 / Symfony 6.1 / PostgreSQL 14 / RabbitMQ / OpenAPI / CQRS / Psalm / Thesis и всё, о чём я тут рассказываю. 😜
Full-time, пока приоритетно в офис, ЗП по результатам собеса.
Резюме мне в ЛС @vudaltsov.
Update: пока неактуально в связи с ситуацией.
Happy INC
Экосистема digital платформ для понимания клиентов, проведения аудита компании, ее процессов, корпоративной культуры и настроя…
Опросник для персонала и клиентов со встроенными рекомендациями и инструментами для анализа. Гарантируем интересные и эффективные опросы для сотрудников - Happy...
👍33🤯3👎1
bind
Помните, я недавно рассказывал, почему не стоит пренебрегать функциями в PHP? В этом посте приведу ещё один пример функции, выполняющей роль фасада.
Иногда в инфраструктурном коде приходится обходить инкапсуляцию. Например, когда пишешь свой DataMapper или оборачиваешь корявое вендорное API.
Самый простой способ получить доступ к чему-то приватному — это привязать замыкание к контексту класса при помощи Closure::bind (подробнее в статье Ocramius). Однако у сигнатуры этого метода есть ряд проблем:
1. По опыту удобнее всего менять
2. Можно было бы скипнуть второй параметр, используя именованные аргументы, но
3. Метод возвращает
4. Не поддерживается статанализ (лечится добавлением соответствуюещго стаба в проект или в анализаторы через PR).
Что будем делать? Мучиться? Нет, добавим в проект простую функцию
Вариант такой функции: https://3v4l.org/K1LUG.
Кстати, Psalm падает при использовании
И ещё. Я считаю, не стоит делать composer-пакеты из таких функций, потому что в каждом проекте они будут называться и выглядеть по-разному. Такие тривиальные штуки гораздо проще копировать и адаптировать под свои представления о прекрасном, чем тянуть сомнительные зависимости.
Помните, я недавно рассказывал, почему не стоит пренебрегать функциями в PHP? В этом посте приведу ещё один пример функции, выполняющей роль фасада.
Иногда в инфраструктурном коде приходится обходить инкапсуляцию. Например, когда пишешь свой DataMapper или оборачиваешь корявое вендорное API.
Самый простой способ получить доступ к чему-то приватному — это привязать замыкание к контексту класса при помощи Closure::bind (подробнее в статье Ocramius). Однако у сигнатуры этого метода есть ряд проблем:
1. По опыту удобнее всего менять
scope, а не $this, но параметр $newScope идёт третьим.2. Можно было бы скипнуть второй параметр, используя именованные аргументы, но
$newThis не имеет значения по умолчанию, поэтому приходится явно передавать null.3. Метод возвращает
?Closure, из-за чего приходится проверять !== null вместо того, чтобы сразу писать Closure::bind(fn () => ...)().4. Не поддерживается статанализ (лечится добавлением соответствуюещго стаба в проект или в анализаторы через PR).
Что будем делать? Мучиться? Нет, добавим в проект простую функцию
bind, которая разом решит все проблемы!Вариант такой функции: https://3v4l.org/K1LUG.
Кстати, Psalm падает при использовании
@template of Closure, а вот PhpStan справляется: https://phpstan.org/r/40205124-4b2f-4c1b-94fe-a05eb14488e2.И ещё. Я считаю, не стоит делать composer-пакеты из таких функций, потому что в каждом проекте они будут называться и выглядеть по-разному. Такие тривиальные штуки гораздо проще копировать и адаптировать под свои представления о прекрасном, чем тянуть сомнительные зависимости.
Telegram
Пых
🤯 Перестань не использовать функции в PHP!
Функции??? Да! Те самые функции, которые когда-то все спокойно юзали, но которые позже заменили класс-ориентированным программированием с неймингом вида Utils, *Helper и т.д.
Функция — это никакой не code smell…
Функции??? Да! Те самые функции, которые когда-то все спокойно юзали, но которые позже заменили класс-ориентированным программированием с неймингом вида Utils, *Helper и т.д.
Функция — это никакой не code smell…
👍22🔥8👎1
Как изощрённо очистить свойство после чтения
Встретил в коде Symfony альтернативное решение задачи из старого поста.
Пишите в комментариях, пропустили ли бы вы такой код на ревью и почему.🤓
Встретил в коде Symfony альтернативное решение задачи из старого поста.
Пишите в комментариях, пропустили ли бы вы такой код на ревью и почему.
/**
* @return list<object>
*/
public function releaseEvents(): array
{
try {
return $this->events;
} finally {
$this->events = [];
}
}
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥67🤯34👎18👍4
Podlodka PHP Crew
Думаю, все вы слышали про однонедельные интенсивы от авторов известного подкаста Podlodka. Так вот, 31-ого октября стартует первая Podlodka PHP Crew!
Тема этого сезона — архитектура (антипаттерны, best practices, DDD, API, события). Среди докладчиков Александр Макаров, Антон Титов, Дмитрий Елисеев, Павел Лакосников и другие пыхари из Skyeng, ManyChat и Тинькофф.
Подробности на сайте, там же скоро финализируют расписание. Покупать билеты лучше сейчас — скидки действуют только до следующего понедельника!
Думаю, все вы слышали про однонедельные интенсивы от авторов известного подкаста Podlodka. Так вот, 31-ого октября стартует первая Podlodka PHP Crew!
Тема этого сезона — архитектура (антипаттерны, best practices, DDD, API, события). Среди докладчиков Александр Макаров, Антон Титов, Дмитрий Елисеев, Павел Лакосников и другие пыхари из Skyeng, ManyChat и Тинькофф.
Подробности на сайте, там же скоро финализируют расписание. Покупать билеты лучше сейчас — скидки действуют только до следующего понедельника!
podlodka.io
Онлайн-конференция Podlodka PHP Crew, сезон #8
Недельное мероприятие от команды Podlodka: ежедневные интерактивные сессии в Zoom по актуальным вопросам PHP-индустрии, нон-стоп общение с экспертами и звёздами индустрии, закрытое профессиональное сообщество в Telegram.
👍33🔥8👎3
Пых
Continuous Integration CI — must have для проекта любого размера. CI повышает качество кодовой базы, дисциплинирует команду и сокращает количество и продолжительность ревью. Идеи проверок на базе нашего пайплайна в Happy Inc.: • кодстайл (PHP CS Fixer, …
Continuous Integration Tools 2.0
Почти полтора года назад я выложил пост с основными идеями для CI-пайплайна проекта на PHP. С тех пор не так много изменилось, разве что Rector стабилизировался и для многих стал инструментом рефакторинга номер один, а в Composer появился встроенный анализ уязвимостей.
Представляю обновлённый список по категориям ("+" помечены новые пункты, через "/" перечислены альтернативы).
Рефакторинг
+ автоматический рефакторинг и актуализация кода (Rector),
• кодстайл (PHP CS Fixer / PHP_CodeSniffer / EasyCodingStandard),
• статический анализ (Psalm / PHPStan / PHPMD).
Пакеты
+ проверка на уязвимости (composer audit),
• валидность composer.json (composer validate),
• явное требование задействованных пакетов (ComposerRequireChecker),
• отсутствие неиспользуемых пакетов (composer-unused).
Symfony Dependency Injection
+ собирабельность prod-контейнера (
• проверка синтаксиса Yaml-файлов (
• проверка соответствия типов инъекций контейнера Symfony (
• отсутствие устаревших сервисов и конфигов Symfony (
Twig
• проверка синтаксиса Twig-шаблонов (
Doctrine
• валидность маппинга и соответствие ему схемы БД (
• корректность продакшн-конфигурации (
Модули
• контроль связности/зацепления и направления зависимостей (Deptrac).
Ну и конечно же тесты
+ мутационное тестирование (Infection),
• сами тесты (PHPUnit / Codeception).
Список всё так же вдохновлён нашим пайплайном в HappyInc. Пишите в комментариях, без чего не обходится сборка вашего проекта и что ещё рекомендуете попробовать.
Также обратите внимание на репозиторий Static analysis tools for PHP и доклад 25+ инструментов для аудита кода.
Почти полтора года назад я выложил пост с основными идеями для CI-пайплайна проекта на PHP. С тех пор не так много изменилось, разве что Rector стабилизировался и для многих стал инструментом рефакторинга номер один, а в Composer появился встроенный анализ уязвимостей.
Представляю обновлённый список по категориям ("+" помечены новые пункты, через "/" перечислены альтернативы).
Рефакторинг
+ автоматический рефакторинг и актуализация кода (Rector),
• кодстайл (PHP CS Fixer / PHP_CodeSniffer / EasyCodingStandard),
• статический анализ (Psalm / PHPStan / PHPMD).
Пакеты
+ проверка на уязвимости (composer audit),
• валидность composer.json (composer validate),
• явное требование задействованных пакетов (ComposerRequireChecker),
• отсутствие неиспользуемых пакетов (composer-unused).
Symfony Dependency Injection
+ собирабельность prod-контейнера (
bin/console cache:clear --env=prod),• проверка синтаксиса Yaml-файлов (
bin/console lint:yaml config --parse-tags),• проверка соответствия типов инъекций контейнера Symfony (
bin/console lint:container),• отсутствие устаревших сервисов и конфигов Symfony (
bin/console debug:container --deprecations).Twig
• проверка синтаксиса Twig-шаблонов (
bin/console lint:twig).Doctrine
• валидность маппинга и соответствие ему схемы БД (
bin/console doctrine:schema:validate),• корректность продакшн-конфигурации (
bin/console doctrine:ensure-production-settings --env=prod).Модули
• контроль связности/зацепления и направления зависимостей (Deptrac).
Ну и конечно же тесты
+ мутационное тестирование (Infection),
• сами тесты (PHPUnit / Codeception).
Список всё так же вдохновлён нашим пайплайном в HappyInc. Пишите в комментариях, без чего не обходится сборка вашего проекта и что ещё рекомендуете попробовать.
Также обратите внимание на репозиторий Static analysis tools for PHP и доклад 25+ инструментов для аудита кода.
GitHub
GitHub - rectorphp/rector: Instant Upgrades and Automated Refactoring of any PHP 5.3+ code
Instant Upgrades and Automated Refactoring of any PHP 5.3+ code - rectorphp/rector
🔥76👍27🤩3❤1
🔴 Пыхэфир в эту субботу!
Дорогие пыхари, давненько мы с вами не виделись! В эту субботу у меня как раз будет время, чтобы это исправить.
Буду готов обсудить новости из мира PHP, прокомментировать чей-нибудь код, ответить на любые вопросы по PHP да и просто поговорить за жизнь. Пишите в комментариях, всё, что вам могло бы быть интересно.
Встречаемся в субботу в 17 на канале PHP Point. Если не будете онлайн, не переживайте, запись никуда не денется.
https://youtu.be/2UiGZVrNG6c
Дорогие пыхари, давненько мы с вами не виделись! В эту субботу у меня как раз будет время, чтобы это исправить.
Буду готов обсудить новости из мира PHP, прокомментировать чей-нибудь код, ответить на любые вопросы по PHP да и просто поговорить за жизнь. Пишите в комментариях, всё, что вам могло бы быть интересно.
Встречаемся в субботу в 17 на канале PHP Point. Если не будете онлайн, не переживайте, запись никуда не денется.
https://youtu.be/2UiGZVrNG6c
YouTube
Пыхэфир #2
Дорогие пыхари, давненько мы с вами не виделись! В эту субботу у меня как раз будет время, чтобы это исправить.
Буду готов обсудить новости из мира PHP, прокомментировать чей-нибудь код, ответить на любые вопросы по PHP да и просто поговорить за жизнь. Пишите…
Буду готов обсудить новости из мира PHP, прокомментировать чей-нибудь код, ответить на любые вопросы по PHP да и просто поговорить за жизнь. Пишите…
👍53🔥27👎1
🔨 Первый в мире PHP-линч!
После нашей субботней встречи у меня появилась идея комментировать PHP-код на постоянной основе. Должно получиться пхплебно, зрелищно и очень познавательно!
Попробуем такой процесс:
1. Во время стрима вы скидываете в чат трансляции ссылки на репозитории и в трёх словах описываете, что там. Это может быть ваш пет-проект или библиотека, а может быть компонент (не)известного фреймворка. Заранее ссылки не принимаются.
2. Я выбираю проект по душе и клонирую репозиторий.
3. Комментирую на лету, говорю, что думаю, без обид.
Первый в мире PHP-линч пройдёт в эту среду в 18 часов на канале PHP Point. Запись обязательно будет.
https://youtu.be/MwMCzqvCGKo
После нашей субботней встречи у меня появилась идея комментировать PHP-код на постоянной основе. Должно получиться пхплебно, зрелищно и очень познавательно!
Попробуем такой процесс:
1. Во время стрима вы скидываете в чат трансляции ссылки на репозитории и в трёх словах описываете, что там. Это может быть ваш пет-проект или библиотека, а может быть компонент (не)известного фреймворка. Заранее ссылки не принимаются.
2. Я выбираю проект по душе и клонирую репозиторий.
3. Комментирую на лету, говорю, что думаю, без обид.
Первый в мире PHP-линч пройдёт в эту среду в 18 часов на канале PHP Point. Запись обязательно будет.
https://youtu.be/MwMCzqvCGKo
YouTube
PHP-линч #1 • fp4php/functional • shoman4eg/moy-nalog
После нашей субботней встречи у меня появилась идея комментировать PHP-код на постоянной основе. Должно получиться пхплебно, зрелищно и очень познавательно!
Попробуем такой процесс:
1. Во время стрима вы скидываете в чат трансляции ссылки на репозитории…
Попробуем такой процесс:
1. Во время стрима вы скидываете в чат трансляции ссылки на репозитории…
🔥111👍25🤩2👎1