Задать вопрос
  • Определение значений передаваемой в функцию переменной типа массив?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Это один из тех вопросов новичков, на который нельзя давать прямой ответ. Он превратится в пустое умствование и говнокод. Соглашусь с комментарием Дмитрий: тут просто не нужен массив. И тем более не нужно городить огород из абстракций. Тут явно нужен банальный VO/DTO, а автору надо перестать пытаться заворачивать привычные массивы в солидно выглядящие объекты, и начать использовать сами объекты.

    Если нам нужна конкретная структура, то и описываем её в конкретном классе, безо всяких интерфейсов:

    final readonly class Parameters
    {
        public function __construct(
            public string $key1,
            public int $key2,
            public DateTimeImmutable $key3,
        ) {}
    }
    public function execute(Parameters $parameters):


    В итоге у "стороннего разработчика" есть готовая документация - простое и понятное определение класса, экземпляр которого он должен передать в ваш метод. И уже на этапе создания этого объекта РНР надаёт разработчику по рукам, если хоть какое-то свойство не будет задано, или будет не того типа. При желании можно в конструктор добавить дополнительную валидацию, если просто типа недостаточно.

    При этом если внутри execute() вдруг зачем-то понадобится обратиться к свойствам именно как к массиву, то использовать волшебную функцию get_object_vars().

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

    Для этого есть либо стандартные валидаторы, когда на вход подаётся массив и набор правил, вот например как в ларавле, симфони или в десятке отдельно стоящих библиотек, а на выходе - или гарантированно валидная структура данных, или ошибка.

    Либо готовые библиотеки десериализации, когда входящий JSON автоматом мапится на существующий объект, и в итоге получается или либо гарантированно валидный объект, или ошибка.

    В этом случае документацией для обоих вариантов является сваггер, а фидбеком - ошибки валидатора.
    Ответ написан
    Комментировать
  • Как назвать классы заказа для паттерна "Состояние"?

    sfi0zy
    @sfi0zy
    Creative frontend developer
    Попробуйте вместо попыток натянуть сову на глобус, а задачу на паттерн, действовать от простого. Пусть заказ бывает бесплатным. У заказа есть флаг "является ли он бесплатным". Мы даже можем воспользоваться возможностями языка и прикрутить какой-то геттер для надежности, чтобы флаг менялся в зависимости от устанавливаемой цены (в примерах условно JS):
    class Order {
        get isFree() { return this.price === 0; }
    }

    Мы можем прям сюда присобачить и оплату, но допустим мы не хотим, чтобы заказ что-то знал об урлах для оплаты. Ему это не надо. Заказ - это список товаров, какой-то статус завершенности, адрес доставки и.т.д. Он про данные, не про процессы. Путь будет обработчик, который может провести заказ как кассир в пятерочке:
    class Order { /* --- */ }
    
    class Сashier {
        proceed(order) {
            const url = order.isFree ? "free url" : "paid url";
            // ...редиректим, проводим оплату, предлагаем пакетик и кофе по акции
        }
    }

    Допустим у нас есть много платежных систем, там все сложно. Инфраструктура - не кассира дело. Ок, дадим ему доступ к адаптеру, который скрывает все за собой и проводит непосредственно оплату.
    class Order { /* --- */ }
    
    class PaymentHandler {
        charge(price) {
            // ...редиректим куда надо, в зависимости от цены и привязанной карты
        }
    }
    
    class Cashier {
        proceed(order) {
            const isSuccess = PaymentHandler.charge(order.price);
            
            if (isSuccess) {
                // заказ прошел
            } else {
                throw new Error('ГААААААЛЯЯЯ ОТМЕЕЕЕНА!!!!');
            }
        }
    }

    Получается четкое разделение ролей. Заказ - про данные, кассир - про процесс, обработчик оплаты - про муть с платежными системами. Возможно, что даже флаг isFree не особо нужен у заказа. И, возможно, что к паттерну "состояние" мы не придем, потому что он в первую очередь решает проблему бесконечного количества комбинаций флагов, но если нет флагов, то нет и проблемы. И.т.д. Развивайте конструкции по мере их естественного появления. Тогда проблем с именованием будет на порядок меньше. Потому что каждое слово в коде отражает какую-то заранее сформированную сущность в алгоритмах в голове.
    Ответ написан
    2 комментария
  • Как синхронизировать проекты между компьютерами?

    @rPman
    syncting или rsync (если подойдет ручное управление) и git (не смешивая их).

    syncting хорошо работает с большими данными и любыми схемами передачи данных (вплоть до источник -> смартфон пользователя offline, смартфон -> целевая машина, и так же обратно, т.е. без интернета)

    git - дисциплинирует ставить 'точки в правильных местах', т.е. вы работаете не абы как а до commit-а, даже если вы один работаете, это дает вам историю изменений, которая может и нужна очень редко, но метко.
    Ответ написан
    Комментировать
  • Как называют "сервисный сбор" в корзине?

    ThunderCat
    @ThunderCat Куратор тега Веб-разработка
    {PHP, MySql, HTML, JS, CSS} developer
    Упаковка/сборка заказа, можно даже сделать ее бесплатной от какой-то суммы.
    Ответ написан
    1 комментарий
  • Как загрузить патч другого разработчика?

    yesbro
    @yesbro
    Думаю, помогаю думать
    Есть несколько вариантов.

    1) Сделать свой форк, внести туда эти изменения. Дальше использовать его подключая либу через гитхаб или сделать свой пакет через packegist.

    2) Использовать https://github.com/khanhvu14/rating/tree/patch-1 подключая через гитхаб с указанием определенной ветки.

    https://stackoverflow.com/questions/33525885/compo...

    Код вот такой. Обязательно надо указать что `minimum-stability` теперь `dev`
    "repositories": [
        {
          "type": "git",
          "url": "https://github.com/khanhvu14/rating.git"
        }
      ],
      "minimum-stability": "dev",
      "require": {
        "rennokki/rating": "dev-patch-1"
      }


    Тут мы даем инструкцию компоузеру, что для пакета rennokki/rating надо использовать ветку patch-1, а найти ее мы можем в репозитории https://github.com/khanhvu14/rating.git. Что бы это все сработало обязательно надо ключу minimum-stability задать значение dev.
    Ответ написан
    5 комментариев
  • Как разделить заказ в маркетплейсе?

    tsklab
    @tsklab
    Здесь отвечаю на вопросы.
    Мне нужно разделить заказ по вендорам.
    Разделите логически, а не физически, используя составной ключ: код заказа, код производителя.
    Ответ написан
    1 комментарий
  • Как свойства объекта сделать массивами?

    Seasle
    @Seasle Куратор тега JavaScript
    Object.fromEntries(Object.entries(...).map(([key, value]) => [key, [value]]));
    Ответ написан
    3 комментария
  • Как получить доступ к свойству?

    @ForSureN1
    frontend dev
    Попробуй так
    errors[`fees.${index}.fee`]
    Ответ написан
    Комментировать
  • Почему не переключается php на новую версию на сервере?

    Adler_lug
    @Adler_lug
    Я может что-то не понял, но какое отношение имеет выполняемый в каталоге сайта php -v к тому, что использует nginx?
    phpinfo() в браузере какую версию показывает?
    Ответ написан
    6 комментариев
  • Как сделать так, чтобы длинный текст не выдавлилвал цену из блока?

    Fragster
    @Fragster
    помогло? отметь решением!
    https://play.tailwindcss.com/gHtpfh8F2Q но эти бездумные миллион вложенных флексов смешанных со space-x все равно сжечь
    Ответ написан
    1 комментарий
  • Очищать корзину после оплаты или нет?

    Adamos
    @Adamos
    Если хочется хранить корзину в БД - так вам ее все равно хранить после оформления заказа.
    Сделайте таблицу, где большинство полей - NULL до момента оформления заказа (цены и проч. для отображения берется с текущих карточек). Выборка текущей корзины - по order_id = NULL. Заказ оформлен - текущая корзина опустела, товары естественным порядком перекочевали в заказ.
    Ответ написан
    9 комментариев
  • Как отцентрировать по вертикали?

    @Speakermen
    Так?
    .parent{
      position: relative;
    }
    .child{
      position: absolute;
      top: 50%;
      left: 50%;
      transform: translate(-50%, -50%);
    }
    Ответ написан
    1 комментарий
  • Почему картинка сжимается?

    Get-Web
    @Get-Web Куратор тега CSS
    Front-End Developer
    Потому что картинка в вашем случае это флекс элемент, точнее даже её обертка.
    Добавьте к обертке shrink-0
    Ответ написан
    Комментировать
  • Как запустить computed в VUE3?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Ключевое слово в качестве имени переменной - что за бред?
    Как достучаться до параметров из script setup - читаем документацию.
    У вычисляемого свойства нет сеттера - так пусть будет функцией, объект не нужен.

    Исправляем:

    const props = defineProps({
      showBgBlue: {
        type: Boolean,
        default: true,
      },
    });
    
    const mainClass = computed(() => props.showBgBlue ? 'bg-blueGray-50 py-12' : 'bg-white');
    Ответ написан
    5 комментариев
  • IT компании + судимость?

    nykakdelishki
    @nykakdelishki
    Системный аналитик
    1. Потратьте этот год с условной судимостью, на изучение языков программирования.

    2. Когда погасите судимость устройтесь на работу(Примут там где нет СБ). Средним классом вы станете однозначно.

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

    Так что смелее
    Ответ написан
    Комментировать
  • Как засетать свойство в такой конструкции?

    Aetae
    @Aetae Куратор тега Vue.js
    Тлен
    Используй стрелочную функцию вместо обычной и почитай как работает this в javascript.
    Ответ написан
    2 комментария
  • Писать ли Unit-тесты до готовности MVP?

    @jazzus
    Дело не только в поддержке кода. С тестами, если писать их до фичи, имхо самая продуктивная и быстрая разработка.
    Во-первых это детальное тз. А любое тз ускоряет процесс.
    Во-вторых не нужно шлепать браузером при кажом чихе. Заполнять формы руками и т.д. Плюс если несколько ролей доступа или связанные процессы, то руками проверять геморой.
    В третьих поддерживает код в дальнейшем, незаменим при рефакторинге и является отличной документацией. Нужно вспомнить процесс и какая логика - печатаешь тест на принтере и вспоминаешь под кофеек. Короче рекомендую.
    Ответ написан
    2 комментария
  • Как покрасить разные элементы в dropdown в разные цвета?

    ktim8168
    @ktim8168
    Frontend Developer
    .dropdown-item:hover {
      background-color: blue;
      color: white;
    }
    
    .dropdown-item:hover .badge {
      background-color: white;
      color: blue;
    }
    Ответ написан
    Комментировать
  • Как извлечь дату из ячейки?

    datka
    @datka
    UPD
    spoiler
    5f30f6be6b439006308689.png5f30f6c38cf1f431875942.png5f30f6c81844d068087216.png5f30f6cca8a44906658550.png5f30f6d36cfce928420150.png5f30f6d87a60a680394680.png

    spoiler
    old
    5f30d88e8dceb990357787.png
    5f30d897aa2a4132546244.png
    5f30d89e88b0a699593123.png
    Каждый не нужный столбик выбираете и жмете на на Do not import column
    5f30d8a508cd1094509492.png
    Ответ написан
    4 комментария