• Как грамотно реализовать одно соединение с базой данных на все приложение, с помощью Dependency Injection Container?

    @Vitsliputsli
    Создать зависимость можно только 2 способами, получив объект изнутри или проведя инъекцию снаружи. Если изнутри, то так или иначе понадобится синглтон, если снаружи, то ктото снаружи должен контролировать передачу одного и того же объекта во все нуждающиеся объекты.

    1. Изнутри. Очевидно просто инстанцировать объект - это очень плохой вариант. Более менее нормальный вариант, это сервис локатор, с методом возвращающим нужный объект работающим как синглтон (т.е. не нужен прям класс синглтона, только метод который проверяет существует ли объект). Выглядит это не очень, синглтон и сервис локатор не считают хорошим решением. Из минусов статичное обращение к сервис локатору создаст проблемы для подмены объекта. Для разных подключений вы можете создать отдельные методы сервис локатора или разрулить в одном методе динамический выбор. Реальная проблема - тестирование, вы не сможете мокировать объект работы с БД. Но, можно это сделать ухищрениями, сделав ленивое подключение, и метод подмены объекта БД, хотя придется этот метод тащить в каждый класс. Как вариант, делать инъекцию объекта сервис локатора. Но остается другой большой минус, сервис локатор "гвоздями прибит" к большинству классов и вам придется его везде таскать, т.е. о красивых компонентах без странной зависимости от сервис локатора можно забыть.
    2. Снаружи. Оптимально, и считается трендом - инъекция нужного объекта в конструктор. Будет ли это делать DIC или чтото иное не имеет значения. Не нужно таскать какието дополнительные сервис локаторы. Но данное решение имеет тот же минус, что и п.1, вы не сможете подменить объект на другой при мокировании:
    public function __construct(PDO $db)
    внедряемый объект обязан быть классом PDO, если хочется чтобы мок просто подсовывал одни и те же значения нужно менять на интерфейс, тогда моку достаточно выполнять требования интерфейса. Но, если ваш DIC использует автоматическое определение требуемых объектов по структуре конструктора, то использовать интерфейс не получится.
    Ответ написан
    Комментировать
  • Логирование веб-приложений: syslog и stdout/stderr?

    @ProFfeSsoRr
    Сис.админ по Linux
    stdout - это стандартный вывод, обычно это консоль. Вот запустили вы в консоли приложение - и увидели, что оно вам написало, потому что оно выводит сообщения в stdout. И не зря тут std в названии - "стандартный". С ним умеет работать много чего. Вот возьмем допустим systemd: он запускает сервис, его stdout ловится и попадает в journald. Можно куда-нить еще завернуть. Системы управления контейнерами тоже так умеют.

    Как собирать? Ну вот вы ж всё умеете, вы там про очереди, logstash пишите - вот, это оно. Вы берете filebeat, ну или там какие еще *beat'ы у него есть, ловите ими вывод ваших приложений и пихаете его в эластик. Ну или допустим fluentbit берёте и им шлете логи в очередь какую-нить, а оттуда уже в хранилку.

    1. В каких случаях обычно пишут логи в syslog ?

    ну syslog очень много лет, он был еще до всех этих контейнеров и 12-факторных приложений ;) Так что когда-то им пользовались практически все.
    Ответ написан
    Комментировать
  • Какую LMS выбрать Фрилансеру и Руководителю для обучения сотрудников в 2023?

    opium
    @opium
    Просто люблю качественно работать
    Так на мудле бы и сидели, особо хороших вариантов на самом деле на рынке нет, пару лет назад выбирали тоже ,в итоге написали свое
    Ответ написан
    Комментировать
  • Как повысить уровень создания проектов на чистом php?

    @koder_1
    Битрикс программист
    В 2005-2010 была мода, каждая веб-студия даже из одного программиста писала свою собственную cms, обычно на чистом php.
    По опыту написания своей цмс, могу сказать что со временем все равно это переходило в подобие своего фреймворка со своими классами, хелперами, со своими правилами в каких папках что хранить, как что называть, со своими общими функциями постраничного вывода, маршрутизации.

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

    Так что выбор здесь или использовать готовый фреймворк/цмс или будет собственный фреймворк внутри вашей команды разработчиков.

    На собеседовании поэтому можно так и спрашивать, а зачем писать на чистом php, если есть инструменты, которые ускоряют разработку?
    Ответ написан
    3 комментария
  • Как максимально сжимать данных в clickhouse?

    mayton2019
    @mayton2019
    Bigdata Engineer
    В парадигме современной BigData, вы должны писать все что приходит на вход.
    Как это там обзывают.... ELT (Extract, Load, Transform)
    Никто не знает наперед какие данные понядоабятся - поэтому фиксируйте весь raw
    трафик. Потом - отфильтруете. Построете материализованные views. Но главное что данные
    будут.

    Учитывая что clickhouse - column oriented - безразлично 2 поля из 2 выбирать или
    2 поля из 2000.

    Если хранилище у вас все таки переполнится - (со скоростью 2.5 Гб в день) то тогда уже почистите те
    колонки которые стали объективно не нужны после например пары месяцев эксплуатации.
    Ответ написан
    Комментировать
  • Отделение бизнес логики от фреймворка Symfony?

    Maksclub
    @Maksclub Куратор тега PHP
    maksfedorov.ru
    Генератор — просто инструмент для помощи, по итогу сущности чисты, не считая аннотаций/атрибутов для маппинга в ORM, но это просто мета-информации и завязка не существенна (не считая маленького компромисса с ArrayCollection). То есть если вы выберите др ORM, то эти аннотации вам не помешают никак, просто лишние заюзанные классы аннотаций

    Имея сущности доктрины — у нас не связанный от фреймворка код, пишите спокойно бизнесуху, не обращая внимания на то, как оно потом маппится. То есть практически все по каннонам

    Чтобы отделить репозиторий от домена — просто в домене делайте интерфейс, а вот реализация этого репозитория будет в Infrastrucure Layer, но это избыточно... риск минимальный, если сделаете не совсем по канону, а именно риск стоит как основной аргумент такового отделения (не просто же вы словам следуете, а причину понимаете?)
    Разработка строится на компромисах, если смените доктрину на др ORM — так и так писать новые репозиторий, вероятность низкая и многие например не делают такие интерфейсы — слишком усложнит код...
    Вам надо будет просто репозиторий в маппинге ORM\Repository заменить в таком случае

    Некоторые компании пишут интерфейсы и сильно усложняют код, но тк риск минимальный изменений, то такое усложнение приводит как правило к усложнению и не более. Следуйте здравому смыслу.
    Мой довод нельзя раскручивать "ну раз минимальный, то завяжусь по полной". Все же отделение логики надо делать

    чтобы все же соблюсти эту чистоту
    и не сильно усложнить, то можно систему разбить на модули/фичи
    и каждый модуль будет иметь такие слои
    почему лучше это сделать:
    - реализация репозиториев хоть и инфраструктурная, но правится часто при изменении домена, а значит сильно далеко прятать не вариант, иначе сильно все будет размазано... потому модуль делают трехслойным (инфра, домен и апликейшн слой)
    пример

    617588c41bdde421641847.png
    Ответ написан
    8 комментариев
  • Какое окружение вы используете для разработки php?

    @kot999
    Backend software engineer
    phpStorm + docker, в современном мире отпала необходимость в сборках (типа xampp или denver), все прекрасно заводится и переносится в docker, очень приближенно к production окружению
    Ответ написан
    3 комментария
  • Все говнокодеры?

    DevMan
    @DevMan
    в основном так и есть.
    бизнесу насрать на наши модели и архитектуру, ему надо деньги делать и ещё вчера.

    если вылизывать архитектуру со старта - никогда не взлетишь. а когда и если взлетишь, поляна будет уже засеяна другими, которые срать–плевали на красоту кода.

    это итеративный процесс: сначала столбим делянку как-нибудь (MVP), затем так и живём или приводим её в порядок.
    Ответ написан
    Комментировать
  • Хороший ли тон передавать Symfony\Component\HttpFoundation\Request в сервис?

    myks92
    @myks92
    Нашёл решение — пометь вопрос ответом!
    1. Работу с request используют высокоуровневые вещи вроде контроллеров, поэтому использовать их в своих сервисах не стоит. Ваш сервис это по сути слой связи приложения и вашего кода. Поэтому правильней всего переложить данные из request в какую-то DTO например из патерна CQRS это может быть Command(), Query()

    2. Даже когда вам потребуется передавать Request в какие-то свои классы, то лучше для этого использовать PSR интерфейсы. Тогда ваш Request будет фреймворконезависимым. .
    Ответ написан
    2 комментария
  • Как импортировать CSV 300k строк в Laravel?

    DevMan
    @DevMan
    эмм.... а зачем нужен laravel-excel для импорта csv?
    возьмите пакет из лиги и читайте построчно. я им миллионы строк каждый день импортирую, без всяких очередей.

    https://csv.thephpleague.com/
    Ответ написан
    4 комментария
  • Что можно использовать от фреймворка в DDD?

    @k2lhu
    При работе с Yii2 изначально стоит выносить любые компоненты в обертки, и их использовать по проекту, так вы легко сможете отвязаться от реализации, используя интерфейс обертки.

    Что касается DDD при работе с Yii2 и моделей - идеально было бы разделить приложение на различные слои, полностью отделив из средних слоев любые зависимости Yii2, но модели я бы не стал наделять интерфейсом, в этом плане вам поможет создание своего репозитория, в котором можете спрятать любые методы на выборки при помощи юшных моделей, а наружу отдавать уже самостоятельно смапленные Entity и уже их наделять интерфейсами и использовать дальше, но это именно для выборок конкретных записей. Если вам необходимо выбрать несколько записей - почти аналогично используюте Entity, создаете свою кастомную коллекцию которая имплементирует встроенные интерфейсы Iterator и Countable. Для их разделения можно использовать базовый класс как родителя, а дальше создавать нужный класс коллекции для смапленных Entity.

    Но вся ваша идеальная задумка DDD с Yii2 легко развалится при использовании ActiveRecord и базовых моделей - в них сразу пихается и валидация, и каст, и обработка поведений на сохранение/обновление/удаление, так еще в старых проектах еще и триггеры навешивают часто. Может стоит подумать, нужен ли вам вообще тут DDD? Если это сделано с целью отвязаться от фреймворка в любой момент - то используйте для моделей Entity, Collection и выносите сразу все в репозиторий, легко сможете мигрироваться на тот же симфони. Безболезненного перехода не бывает и так или иначе что-то да придется переписывать, но все сможете это сделать просто поменяв код ваших репозиториев и контроллеров с реквестами.
    Ответ написан
    1 комментарий
  • PHP Как перекодировать имена файлов с кириллицей при извлечении из zip архива?

    @borovinskiy
    Не понятно, зачем UTF-8 вначале в CP437 конвертировать, а затем из CP437 в CP865.

    Вот здесь есть решение: https://ru.stackoverflow.com/questions/606882

    $name = $zip->getNameIndex($i, \ZipArchive::FL_ENC_RAW);
    $name = iconv('cp866','UTF-8//IGNORE',$name);
    Ответ написан
    3 комментария
  • Как правильно оценивать сроки на разработку сайта в web студии?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    «В молодости я спросил у начальника, как оценить время на выполнение работы? И начальник ответил мне:
    — Время, которое ты планируешь, умножить на Пи пополам, плюс 2 недели.
    — Почему Пи пополам? — удивился я.
    — Потому что в реальной жизни ты никогда не будешь двигаться к своей цели напрямую, а скорее — по дуге окружности.
    — А почему плюс две недели?
    — А потому, что когда ты в итоге просрёшь все сроки, то за две недели хоть что-то успеешь сделать.» (с)
    Ответ написан
    1 комментарий
  • Что делать с кодировкой тела сообщения imap_body?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Курить multipart/form-data
    Ну и сразу накуривается https://github.com/php-mime-mail-parser/php-mime-m...
    Ответ написан
  • Формирование удобного номера заказа в DDD?

    1. Можно просто порядковый номер.
    2. Можно генерировать номер исходя из даты и порядкового номера в этот день
    n. ...
    Куча вариантов есть. Но я хз, причём тут DDD
    Ответ написан
    3 комментария
  • Какую выбрать CMS с упором на код, без слишком навязчивого wysiwyg?

    возможно, modx
    Ответ написан
    Комментировать
  • Как обработать ответ платежной системы?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Короче это секретный сайт, но ты вроде нормальный пацан, я тебе дам тайную ссылку.
    Прикинь, в интернете есть сайт где есть ответы на все вопросы.
    Зуб даю. Вот твой например
    Ответ написан
    Комментировать
  • Как настроить авторизацию в MVC PHP?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Причина в том, что этот код - полная бессмыслица.
    Если просто случайным образом писать операторы РНР, и то получится лучше.

    Надо на пару лет забыть про красивые слова OOP и MVC, и поучиться просто писать код, который делает то, что требуется.
    Ответ написан
    4 комментария
  • С помощью чего можно быстро поднять админ панель?

    Sanes
    @Sanes
    C помощью программиста.
    Ответ написан
    Комментировать
  • Лучшие практики разработки ecomm проектов?

    inoise
    @inoise
    Solution Architect, AWS Certified, Serverless
    Тут нет лучшего решения или лучших практик. И быть не может. E-commerce отталкивается от потребностей бизнеса и аудитории и бывает настолько разный что обычные интернет-магазины становятся просто каплей а море, а решений на рынке на любой вкус и цвет
    Ответ написан
    Комментировать