• Почему так много нестабильных людей пытается стать программистами?

    @sidni
    иногда мне кажется многиe живут по принципу "Если у тебя нет последнего АйФона, то Земля не должна носить на себе таких неудачников" ))))))))))
  • Почему не формируется URL в yii2?

    @sidni
    а почему
    '/profile'
    а не просто
    'profile'
    или раз уж пошло
    'profile/index'
    ?
  • Система оплаты liqpay. Как исправить ошибку "У получателя не установлена карта для приема платежей"?

    @sidni
    Рефанд это рефанд, а оплата это оплата.
    Может в настройках мерчанта поискать
  • Почему советуют не выбирать yii2 для разработки?

    @sidni
    batyrmastyr,
    2) Об этом писал Павел Климов в паблике юии в фейсбуке, если я не ошибаюсь он даже советовал использовать Ларавел вместо yii
  • Как вставить галерею к товару на twig?

    @sidni
    Владимир Дружаев,
    Нет, это уже тупиковая ветвь развития, вернемся к предыдущему комменту назад.
    Темплейт это темплейт и служит для отображения информации, там нет места для пхп кода кроме связанного для вывода все той же информации. Но к сожалению таких программистов очень мало в мире, и если дать писать в темплейте писать php код, уверяю на 100% он там будет. И вот когда в темплейте начинаются запросы к базе данных, производить вычисления (каких-нибудь процентов лайков, тегов и тд), а если собрать все сайты на wordpress можно и не такое найти, отлаживать такие сайты или делать дальнейшие кастомизиции очень сложно.
    И если люди решили использовать твиг (а это самый ненавистный шаблонизатор к php коду), то это уже крик отчаяния от предыдущего опыта использования php кода в шаблонах.
  • Как вставить галерею к товару на twig?

    @sidni
    твиг для того и предназначен, чтоб туда нативно ничего не внедрял, только html разметку
  • Почему плохо писать код в шаблонах?

    @sidni
    Если говорить конкретно о php то для таких вещей пишут функционал виджет, где выборка происходит в php файле а в шаблоне только нативный для шаблона цикл отображения информации.
    далее виджет "регистрируется" в системе и вызывается в нужном шаблоне.
    Я понимаю что щас все умные, но с каких делов верстальщик должен знать sql, у него и так голова забита всякими less, sass, npm, js и тд.
  • Можно ли в репозиторий использовать для сохранения обьектов?

    @sidni
    похоже у вас просматривается
    Я есть CRUD

    Вы вольны в своем коде делать что угодно и как угодно и тут вас никто не попрекнет.
    грубо говоря Паттерн Репозиторий можно расценивать как
    гейтвей к хранилищу
    доменной сущности и ничего не мешает генерировать и обрабатывать коллекции этой сущности.
    CRUD если выйти за пределы SQL (а поскольку в тегах нет тега SQL, то это разумно), то CRUD содержит такие операции как принятие входных данных, их валидация и обработка, только потом мы доходим до изменения в базы и вывод результата.
    Так вот классическому варианту Паттерн Репозиторий это перебор у него совсем другие задачи.
  • Этот код сильно ужасен)?

    @sidni
    Philipp,
    Не согласен, испортить репутацию можно в случаях когда продукт не отвечает ТЗ/не работает/ или во-время не сдан, в большинстве случаев заказчик не разбирается в технических моментах и в конце концов взять любую книжку по программированию для новичка другого кода как подобный Вы не увидете а раз он есть в книгах, значит имеет право место быть, другое дело когда условия оговариваются зарание в ТЗ(фреймверк, солид, реляции базы и тд), а это уже другая история.
    И заказчик будет обращаться к тебе до тех пор пока не изменятся условия труда или пока ты сам не поймешь что не сможешь поддерживать данный код ( а это уже снова совсем другая история)
  • Что за ошибка с GROUP BY в запросе?

    @sidni
    Можно конечно в ручную выполнить sql команды set global если позволят права пользователя но их надо выполять в каждой сессиии.
    Но в целом надо искать доступы иначе придется переписывать кучу запросов
  • Как лучше реализовать sender?

    @sidni
    ClientException нет, в данном случаее я имел ввиду Ваш собственный класс (можно обычный класс отнаследованный не важно Exception, RuntimeException, DomainException и т. д.) с помощью которого Вы в дальнейшем разделять серверные ошибки api от Ваших собственных (например не валидные данные) и ошибки Вашего модуля и ошибки приложения в целом
  • Как лучше реализовать sender?

    @sidni
    Да, но тут нюанс, что Вы теряете оригинальное сообщение об ошибке хранящееся где то $responseData['error'], и когда вы будет дебажить логи для отладки приложения у Вам будет доступно Json-rpc client error вместо реальной причины отказа API
    если Вы хотите для конечного пользователя замаскировать ошибку (может быть потому что там содержаться системные данные которые лучше не публиковать), то необходимо в Вашу систему прокидывать логгер в который будет помещаться оригинальные респонсы ошибок и тут два варианта
    1) Если не хотите заморачиваться. Вернуть try ... catch в этот код и прокинуть туда логгер и сделать

    <?php
    try {
                $response = $this->client->post($url, [
                    RequestOptions::JSON => [
                        'jsonrpc' => '2.0',
                        'method'  => $methodName,
                        'params'  => ($params),
                        'id'      => Uuid::uuid4(),
                    ],
    
                    RequestOptions::HEADERS => $headers,
                ]);
    
                $responseData = json_decode($response->getBody()->getContents(), true);
    
                if (isset($responseData['error'])) {
                     throw new \Exception($responseData['error']['message']);
                }
    
                return $responseData['result'];
    
            } catch ( \Exception $exception) {
                $logger->error($exception->getMessage());
                throw new ClientException('Json-rpc client error');
            }

    2) более правильный но немного замороченней: оставить Ваш последний вариант
    только вместо
    <?php
    throw new \Exception('Json-rpc client error');

    напишите
    <?php
    throw new \ClientException($responseData['error']['message']);

    и оббернуть его (см паттерн Декоратор) другим классом и в этот класс прокинуть логгер
  • Стоит ли создавать учебный и самый минимальный PHP-код для создания простого блога?

    @sidni
    Поддерживаю.
    Я когда изучаю что то, ищу на github доступный проект для разбора, но "сухой" код трудно понять почему автор решил сделать так а не так и за частую после долгого анализа оказывается я и автор придерживаются разных целей которые нужно подробно описать в проекте и на которые не стоит заострять особого внимания и в итоге оказывается проект мне не подходит.
    С другой стороны если взять допустим тот же блог, взять его базовые функции и навалить на него все популярные практики проектирования модно получить неоправданного монстра, который все запутает.
    Допустим в плане пхп есть уроки Д. Елесеева где подробно описано как построить приложение по архетиктуре ddd, tdd и т. д.
    Где за основу берется приложение сложнее блога, но несмотря на всю специфику мастер классов (должен остаться только один) всеравно этого не хватает, когда берешь рефакторить легаси проект а там просто миллионы сущностей и зависимостей на один экран монитора и ты на минус морали даже не понимаещь за что взяться первым тк любое изменение и у тебя рухнет пол сайта.
  • Как лучше реализовать sender?

    @sidni
    SendRequest должен вернуть либо результат либо ошибку почему этот результат не получен. Тип ошибки обозначен соответсвующим классом exception и соответвующим сообщением а далее вы обрабатываете результат или в catch исключение
  • Как это работает в symfony через Interface?

    @sidni
    так оно так и работает, в DI указываешь интерфейс и соответствующий класс, который вместо него будет подставлять DI в коде, там где указан этот интерфейс.
  • Php DateTimeImmulable как проверить даты в диапазоне?

    @sidni
    pro-dev,


    2019-11-01 - 2019-11-02
    2019-11-03- 2019-11-05
    2019-11-06 - 2019-11-08

    Добавляем в массив
    2019-11-08 - 2019-11-10

    Должен ругнуться. У меня тесты что-то не проходят.


    попробуйте так
    <?php
    
    class MDate {
        public $start;
        public $end;
        public function __construct($start, $end) {
            $this->start = new \DateTimeImmutable($start);
            $this->end = new \DateTimeImmutable($end);
        }
    }
    
    $pDates = [];
    $pDates[] = new MDate('2019-11-01','2019-11-02');
    $pDates[] = new MDate('2019-11-03','2019-11-05');
    $pDates[] = new MDate('2019-11-06','2019-11-08');
    
    $currentPDate = new MDate('2019-11-08','2019-11-10');
    
    foreach ($pDates as $pdate) {
        if ( 
            ($currentPDate->start >= $pdate->start && $currentPDate->start <= $pdate->end) ||
            ($currentPDate->end >= $pdate->start && $currentPDate->end <= $pdate->end)
        ) {
            echo 'Входит в диапазон';
        }
    }
  • Php DateTimeImmulable как проверить даты в диапазоне?

    @sidni
    Должен ругнуться. У меня тесты что-то не проходят.

    а код тогда выложите
  • Php DateTimeImmulable как проверить даты в диапазоне?

    @sidni
    не понятна структура массива, но в целом запускаете цикл и поочередно сравниваете
    начало из массива с началом добавляемого и конец из массива и концом добовляемым
  • Php DateTimeImmulable как проверить даты в диапазоне?

    @sidni
    $start = new \DateTimeImmutable('2000-01-01');
    $end = new \DateTimeImmutable('2022-01-01');
    $today = new \DateTimeImmutable();
    if ($today>=$start && $today<=$end) {
        echo 'Мы в диапазоне';
    }