Библиотека пхпшника | PHP, Laravel, Symfony, CodeIgniter
11.3K subscribers
1.35K photos
20 videos
26 files
4.05K links
Все самое полезное для пхпшника в одном канале.

По рекламе: @proglib_adv

Учиться у нас: https://proglib.io/w/bca892d6

Для обратной связи: @proglibrary_feeedback_bot

РКН: https://gosuslugi.ru/snet/67a5d13cd6fa92100ee6f68b
Download Telegram
#laravel

Тред от опытного разработчика Марселя Почета с советами по улучшению производительности запросов при использовании Eloquent.

https://twitter.com/marcelpociot/status/1480541086972096514
👍5
#mustread

Интересный тред о том, нужно ли следовать строгости при написании кода. Автор треда жалуется, что PHP разработчики, которые все классы делают финальными, проставляют типы всем свойствам и аргументам, усложняют возможность расширять свой код.

Вы согласны с этим?

https://twitter.com/davert/status/1480489855515774978
👎6👍3
#advanced

Библиотека, которая умеет переопределять вызов функций внутри ваших классов в целях облегчения тестирования. Например, вы можете замокать результат вызова таких функций как rand или sleep, чтобы не зависеть от сайд-эффектов их выполнения.

https://github.com/adriansuter/php-autoload-override
👍4
#mustread

Чеклист для кодревью. В нем рассматриваются многочисленные аспекты при проведении кодревью: например, правильно ли автор кода обрабатывает ошибки, логирует ли их, не влияет ли его код на перфоманс, удобен ли он при использовании и поддержке и много другое.

https://github.com/mgreiler/code-review-checklist
👍13
#golang #php #docker #kubernetes

Команда Авито ищет крутого бэкенд-разработчика

Наша команда отвечает за подачу объявлений на Авито. Сотни тысяч пользователей ежедневно нажимают кнопку «Разместить объявление», и тот опыт, который они получат в процессе, во многом зависит от результатов работы нашей команды. В продукте нужно учесть интересы разных типов продавцов: одинаково удобно должно быть и крупному бизнесу, ежедневно продающему новые товары на Авито, и обычному человеку, который приходит к нам раз в полгода. Мы хотим, чтобы на Авито было легко разместить любое объявление — от редкого автомобиля до нового телефона. Нам важно, что пользователь может начать подавать объявление в приложении, а продолжить на десктопе.

Одна из метрик нашего продукта — TTA (time-to-add) — время, затраченное на подачу объявления. Улучшая продукт, мы экономим секунды у одного пользователя и десятки тысяч часов у всех продавцов Авито. Приходите к нам, и вашу работу смогут оценить миллионы человек.

С нами вы будете решать сложные технические задачи, заниматься разработкой и поддержкой высоконагруженных (~100k RPM) микросервисов с использованием современных технологий и языков программирования (Golang, PHP 8, Docker, Kubernetes).

Мы ожидаем, что вы:
▪️имеете опыт коммерческой разработки на PHP или Go;
▪️разрабатывали высоконагруженные приложения;
▪️знакомы с шаблонами проектирования и умеете их применять, придерживаетесь принципов SOLID;
▪️знакомы с основными алгоритмами и структурами данных;
▪️умеете писать поддерживаемый и тестируемый код;
▪️способны тщательно планировать и приоритизировать свою работу;
▪️используете в общении убедительные аргументы и конструктивно реагируете на аргументы других.

Не обязательно, но круто если вы:
▪️знаете SQL, работали с реляционными и нереляционными БД;
▪️работали с Docker/Kubernetes;
▪️разрабатывали распределенные сервисы;
▪️умеете работать с командной строкой;
▪️знаете, как оптимизировать приложение и сделать его быстрее.

Что предстоит делать:
▪️разрабатывать высокопроизводительные микросервисы на Go и поддерживать код на PHP;
▪️участвовать в проработке архитектурных решений;
▪️работать в кросс-функциональной команде, в тесном взаимодействии с client-side разработчиками;
▪️участвовать в принятии технических решений и планировании процесса разработки;
▪️быть ответственным за крупную часть проекта, над которой работает несколько инженеров;
▪️сопровождать полный цикл жизни продукта от проработки продуктового решения до деплоя кода на сервера;
▪️участвовать в Code Review.

Работа у нас — это:
▪️возможность реализовать свои идеи в проекте с многомиллионной аудиторией;
▪️команда профессионалов, готовых поддержать ваши инициативы;
▪️помощь с переездом: если вы живёте в другом городе, мы оплатим приезд на интервью и поможем обустроиться в Москве;
▪️красивый и комфортный офис в 2 минутах от метро «Белорусская»: панорамный вид на центр города, места для уединённой работы, зоны отдыха, гамаки и скейтборды. А на время пандемии вы можете работать из дома. Для этого компания предоставляет необходимую технику: ноутбуки, мониторы, модемы;
▪️компенсация расходов на питание;
▪️забота о здоровье: с первого дня работы вы получите страховку со стоматологией, в офисе ведут приём терапевт, психолог и массажист;
▪️прозрачная система бонусов и премий, достойная зарплата — размер обсудим на собеседовании.

Контакты для связи:
▪️Телефон: +7 (931) 367-75-19 (Юлия)
▪️Email: [email protected]
▪️Подробнее: https://www.avito.ru/vacancies/sx-backend/
👍10
#advanced

"Правило трех" при разработке качественного ПО, или когда возникает необходимость избавляться от дублирования.

https://understandlegacycode.com/blog/refactoring-rule-of-three/
👍4
#advanced

Анна Филина продолжает развивать тему репозиториев. На этот раз она рассуждает, можно ли использовать репозитории без ORM.

https://afilina.com/learn/design/repos-without-orms
👎3
#offtop

Какой ваш любимый язык программирования и почему это PHP?
🔥68👍4
Как строить архитектуры приложений, которые позволяют не снижать скорость разработки по мере развития проекта?

💻Освойте основные паттерны проектирования и прокачайте свои навыки архитектора программного обеспечения в режиме живых занятий с опытным разработчиком-практиком.

Старт интенсива «Архитектуры и шаблоны проектирования» уже 3 февраля.

🚀После интенсива вы будете:

– Знать границы применения SOLID принципов и уметь их использовать не только в объектно-ориентированных языках.
– Писать модульные тесты на Mock-объектах.
– Уметь применять IoC контейнеры и CI.

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

Записаться сейчас со скидкой 20% до 21 января здесь.
#junior

Введение в тему внедрения зависимостей для начинающих.

https://afilina.com/learn/design/dependency-injection
👍3
#legacy

Анне Филине достался очередной легаси проект. С некоторыми перлами она поделилась в треде. Например, try..catch блок, который все равно падает с ошибкой, потому что в catch блоке используется переменная из try, которой ещё не присвоено значение. Больше интересных ошибок в треде.

https://twitter.com/afilina/status/1288126813303001094
👍1
#laravel

Релиз минорной версии Laravel с интересными фичами:
- Реализация полнотекстового поиска для MySQL и PostgreSQL;
- Улучшения пагинатора;
- Улучшения контейнера зависимостей.

Больше информации и примеров использования в статье.
👍3🔥2
#laravel

Если вы используете Laravel версии ниже, чем 8.4.2, то вы подвержены серьёзной уязвимости. Подробнее в статье. Не забудьте обновиться.
👍3😁1
#psalm

Как использовать Psalm на легаси проекте

Если вы задумались о необходимости использования Psalm'а на большом легаси проекте, вам нужно подумать, что делать с текущими ошибками, которых наверняка может быть больше тысячи.

Править их все сразу — это мог быть правильный вариант, если не был бы таким утомительным и долгим.

Глобально подавлять ошибки — это однозначно плохой способ, так как повлияет и на новый код.

Конфиг

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

<psalm>
....
<projectFiles>
<directory name="src"/>
<ignoreFiles>
<directory name="src/Module1"/>
<directory name="src/Module2"/>
<directory name="src/Module3"/>
</ignoreFiles>
</projectFiles>
....
</psalm>


Этот способ имеет ещё один недостаток: наверняка вы до сих пор что-то правите в этих модулях, и тогда ваш новый код в старых модулях тоже не будет проанализирован псалмом. Но вы же не этого добивались?

psalm-baseline

У псалма есть решение для таких случаев — baseline. Данный способ найдёт и сохранит все текущие ошибки в конкретный xml файл и будет их игнорировать при анализе. Также вам не придётся игнорировать директории и глобально подавлять ошибки. Зато новый код в любых директориях — новых и старых — будет успешно проанализирован псалмом. Чтобы настроить baseline, вам необходимо выполнить следующую команду в вашем проекте:

./vendor/bin/psalm --set-baseline=psalm-baseline.xml


У вас в проекте появится psalm-baseline.xml файл, который необходимо закоммитить. Теперь вы сможете спокойно использовать psalm в CI. Только не забывайте в свободное время править ошибки в старых модулях. Когда вы поправите часть из них, обновите baseline:

./vendor/bin/psalm --update-baseline


И так до тех пор, пока вы не избавитесь от всех ошибок, либо не удалите модули, заменив их новыми 😎.
👍17🔥5
#symfony

Основная беда Symfony – она предоставляет богатые возможности для решения многочисленных сложных проблем, но с помощью нее сложно решать простые задачи. Например, возьмем миддлвары. Достаточно простой и удобный механизм, упрощающий написание http-обработчиков. Для миддлвар даже придумали стандарт в php-fig.

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

В Laravel, например, есть миддлвары, хоть и не следующие стандарту psr-15. Можно ли такое сделать в Symfony? Оказывается, можно. Есть такой пакет, который реализует psr-15 и дает возможность использовать как глобальные миддлвары, так и миддлвары конкретно для контроллера.

Следование стандарту позволяет вам поставить любую известную вам миддлвару и использовать ее вместе с этим пакетом. Он (пакет) перехватывает событие ControllerArgumentsEvent, на этапе которого уже известен и контроллер, и его аргументы. Пакет проверяет, нужно ли запускать какие-то миддлвары – глобальыне и/или локальные – и запускает их до выполнения контроллера.

Преимущества по сравнению с событиями:
- Следование стандарту psr-15;
- Возможность объединять миддлвары в группы;
- Возможность точечно поставить миддлвары над конкретным контроллером;
- Возможность из коробки запускать миддлвары в зависимости от условия (например, в дебаг режиме запустить миддлвару, включающую логирование sql запросов, а в прод режиме – не запускать).

Также автор собирается добавить поддержку аргументов в миддлварах, чтобы можно было динамически указывать специфические для каждого из контроллеров аргументы.
👍13🔥5💩32
#advanced

Один из хардкорных способов избавиться от класса, используемого по всему проекту, при рефакторинге — это убрать его из автозагрузки и под тем же неймспейсом загрузить другой. На эту тему есть плагины для композера, но что если это можно сделать и без них? Автор статьи подробно рассказывает, как этого можно добиться нативными средствами пакетного менеджера.

https://downing.tech/posts/overriding-vendor-classes