dd

Рубрика: Разработка

  • Пожалуй, самое время подвести итоги года

    Во-первых, этот бложек. Сильно, имхо, вырос, вас аж 12, спасибо. Он дал многое, из самого важного — начало формироваться понимание того, как надо в письменном виде доводить свои идеи
    Во-вторых, работа. Было много проектов, было много кранчей, было много крутого. Из особенно хороших получившихся приложений могу выделить те, где я прям в полной мере дал себе свободу в написании апи и выделил это все в отдельную либу.
    В-третьих, знакомства. Познакомился с двумя крутыми молодыми фронтами, с ними на работе было очень весело, редко бывает такое совпадение взглядов.
    В-четвертых, семья. У меня ни в один год не было столько приобретений — машина, квартира, а главное — дочь. Для моего мозга это всё где-то ещё лет через 20, а на самом деле я уже отец🤔
    Теперь к целям в новом году
    Бложек. В связи со сменой работы ожидается куча нового контента, учитывая, что я на 90% уверен, что сменю фреймворк.
    Работа. Ищу новую, есть много предложений, много интересных проектов и команд, очень рад. Гораздо круче выходить на рынок с большим опытом, рыбка уже сильно крупнее. Из особо интересного — 30.12 был первый этап собеседования в яндекс, алгоритмический. По ощущениям прошел, по факту узнаем после праздников.
    Знакомства. Все опять сводится к работе, но если совсем всё хорошо, то залететь бы на подкаст к Антону Назарову.
    Семья. В этом году все приобрел, теперь надо улучшать. Дочь растёт ежечасно, квартира нас ждёт, к лету переедем, машина радует глаз, но скорее всего будет передана тёще, ввиду роста семьи.

    Всех с наступающим! А я пошёл отмечу и начну готовиться к новой волне собеседований
    🥳🥳🥳

  • Доброе утро

    Доброе утро!😍😍😍

  • file_get_contents как HTTP-клиент

    Век живи — век учись
    Сегодня я узнал, что для особой категории энтузиастов есть (возможно) малоизвестный прикол с file_get_contents
    Оказалось, что с его помощью можно делать не только get-запросы, да и вообще конфигурировать как хочешь
    Спойлер — лучше так не делать, запинают, curl/guzzle вам в помощь
    Подробнее: https://stackoverflow.com/questions/11064980/php-curl-vs-file-get-contents/74178711#74178711

  • Не пишите свой фреймворк

    На всякий случай небольшое напоминание — используйте фреймворки
    В 99% случаев "мелкий проект на одно действие" перерастёт в нечто большее и тогда начнутся проблемы
    Не просто так это пишу — провёл несколько вечеров переводя такое "маленькое приложение" на фреймворк, потому что без него работать уже становилось тяжко
    Особенно это касается вопросов роутинга и шаблонизации
    Была мысль всё это писать самому, но хорошо, что что-то умное щёлкнуло в голове, иначе застрял бы на неделю
    Выше писал про Slim, как раз на него и переводил — прекрасный фреймворк, интуитивный, простой и модульный
    Вообще, наблюдать за тем, как из кучки старых файлов проекта рождается обновлённый проект с грамотной структурой — одно удовольствие
    Оплачиваемый рефакторинг — одни из лучших рабочих моментов, пожалуй🙃

  • ADR и информационный шум в разработке

    При написании апи в итоге пришел к некоему своему пониманию его построения, проведения границ и разделения ответственности
    Сегодня узнал, что все что я «придумал» называется ADR и существует уже давно (естественно): https://github.com/pmjones/adr
    Еще недавно узнал про фреймворк Slim, в который идеально вписывается ADR (https://www.slimframework.com/docs/v3/cookbook/action-domain-responder.html) и он очень похож на Express в мире джаваскриптизёров. Крайнее рекомендую его посмотреть, он очень минималистичен и выглядит приятно
    А вообще пост скорее о том, что информации огромное количество, есть проблемы с ее категоризацией и обучением других людей, что в итоге приводит к тому, что я, как наверняка и многие другие, изобретают колесо. А может быть проблема просто в том, что я не всегда могу выразить концепцию словами и поэтому не могу загуглить существующие решения🤔🤔🤔

  • Подготовка к собеседованиям

    Готовлюсь к смене работы, потихонечку хожу по собеседованиям
    Спрашивают иногда всякие мелочи по языку, какие-то неочевидные, но известные вещи
    По счастливой случайности наткнулся на тред на реддите, где у человека ровно та же ситуация
    Читать можно всё, в любом порядке, просто открываете ссылку из любого коммента и внимаете
    Читать лучше даже то, что уже известно, повторение — мать учения)
    https://www.reddit.com/r/PHPhelp/comments/z9q587/starting_new_job_need_to_hone_my_php_skills/

  • Спред-оператор в конструкторе PHP

    Сегодня я узнал, что, оказывается, в конструктор классов можно передавать данные через оператор ...
    Например, у меня есть класс MailSettings, у него простейший конструктор:

    public function __construct(
    private readonly string $senderEmail,
    private readonly string $senderName,
    private readonly string $server,
    private readonly string $port,
    private readonly string $password,
    ) {}

    В нём хранятся настройки, которые я тяну из файла, получается примерно так:

    new MailSettings(
    senderEmail: $decodedJson['senderEmail']
    ...
    );

    Но что-то мне взбрело в голову попробовать сделать new MailSettings(...$decodedJson)… и оно сработало!
    Не помню, чтобы где-то это видел, но штука крайне полезная

  • Дебаг тестов из PHPStorm

    Я очень долго откладывал момент, но сегодня мне особенно нечего было делать и я решился — пора научиться запускать тесты (и не только) с дебаггером из PHPStorm
    Как это всегда оказывается — сделать это было проще простого:
    1. Добавляем докер-контейнер с пхп в конфиг шторма
    2. Указываем где в контейнере лежит исполнительный файл codeception
    3. В конфиг контейнера прописываем установку xdebug
    4. Готово

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

  • RBAC и вытекающие из него приколы

    На работе мы уже 2 месяца разрабатываем ряд приложений, отвечающих определённым бизнес-процессам заказчика. В каждом из них существует довольно строгое разделение по ролям и разрешениям пользователей. Кто-то видит всё, кто-то только часть, а кто-то видит всё, но получить полную информацию может только у части сущностей. Соответственно, на фронте надо условно рисовать кнопки, основываясь на том, что пользователю можно делать.

    Так как важнее было выкатить простейший работоспособный продукт, разработку этой системы было принято немного отложить, пока заказчик сам не начнёт явно указывать на отсутствие разделения по ролям. И вот на этой неделе этот момент настал — поступило сообщение от тестировщиков со стороны заказчика, что пользователи, которые видеть должны только свои сущности, видят все. Долго думал как это всё реализовать и по итогу получилась система из 2.5 шагов для получения данных.
    Первый шаг — план минимум. Уровень — контроллер. На контроллер вешается условие — «пользователь должен обладать как минимум одним из следующих разрешений, чтобы запрос прошёл дальше»
    Второй шаг — уточнение плана минимум. Уровень — контроллер. У пользователя есть разрешение на просмотр своих документов, но точно ли это его документ?
    2.5 шаг — то же самое, что и второй шаг, но действия происходят на уровне класса DataHandler. Пример — поиск документов. У пользователя есть разрешение на просмотр своих документов, значит выборка должна быть изначально сужена до документов, которые привязаны к пользователю.

    И на этом моменте получилась интересная концепция — инъекция объектов ActiveQuery (скорее, фабрика, конечно). Я понимаю, что это довольно очевидная идея, но я привык, что через DI подключаются сервисы типа смс, email, кассы, платёжки и тд, а вот что бы у меня был сервис, который мне возвращает сконфигурированные объекты ActiveQuery — это что-то новенькое. По итогу такой сервис мне вернёт, например, объект DocumentQuery, где изначально будет вбит текущий пользователь как создатель документа, так на большее у пользователя прав нет.

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

  • Обновлённый код после рефакторинга

    А вот как сейчас выглядит обновлённый код — гораздо яснее цель и намерения, чем когда всё называлось Form