• Почему в symfony в ExceptionListenet попадает только изначальное исключение?

    @galliard Автор вопроса
    BoShurik, точнее не совсем так. Вот конкретно ваш пример отработал как надо. Однако моя конкретная вот такая:
    Использую компонент секъюрити, делал по инструкции
    symfony.com/doc/current/security/api_key_authentic...
    class ApiKeyUserProvider implements UserProviderInterface
    {
        public function getUsernameForApiKey(string $authToken): string
        {
            // ...
           throw new CustomUserMessageAuthenticationException('Access denied');
            // ...
        }
    }
    
    class ApiKeyAuthenticator implements SimplePreAuthenticatorInterface
    {
        public function authenticateToken(TokenInterface $token, UserProviderInterface $userProvider, $providerKey)
        {
            // ...
            try {
                $username = $userProvider->getUsernameForApiKey($authToken);
            } catch (CustomUserMessageAuthenticationException $exception) {
                throw new AccessDeniedHttpException($exception->getMessage(), $exception);
            }
             // ...
        }
    }

    Но в итоге в метод onKernelException мне приходит инстанс CustomUserMessageAuthenticationException, хотя в блок catch интерпритатор заходит (оставлял там die()).

    И ещё важный момент, если previous не передавать - работает как надо.
  • Почему в symfony в ExceptionListenet попадает только изначальное исключение?

    @galliard Автор вопроса
    BoShurik, да именно так, только листенер я регистрировал по другому,
    class ExceptionListener
    {
        public function onKernelException(GetResponseForExceptionEvent $event): void
        {
            dump($event->getException());
        }
    }

    App\EventListener\ExceptionListener:
            tags:
                - { name: kernel.event_listener, event: kernel.exception }
  • Почему в symfony в ExceptionListenet попадает только изначальное исключение?

    @galliard Автор вопроса
    Модератор, дорогой модератор, я руководствуясь регламента работы сервиса, в частности п. 3.1, указал ровно те теги, которые имеют непосредственное отношение к задаваемому вопросу. А ваши придирки являются ничем иным, как проявлением синдрома вахтера.
  • Как получить расхождения многомерного массива?

    @galliard
    ksnk,
    array_udiff_assoc($arr1, $arr2, function ($a, $b) {
        return $a !== $b;
    });

    Даст тот же результат
  • Собрать массив из строки - PHP?

    @galliard
    Олег, регуляркой зачастую проще.
  • Слеш в роуте Symfony?

    @galliard
    Зачем вообще слеш в конце ставить? Это же не папка.
  • Как в ddd выбрать "всего" элементов?

    @galliard
    Михаил Шатилов, по вашей же ссылке вторая строчка
    Использует интерфейс, похожий на коллекции...


    Вы, видимо, под коллекцией подразумеваете некую конкретную реализацию, но это просто класс, описывающий некое множество сущностей.

    Однако это не обязательно единственная коллекция в проекте, просто наиболее общая. Так что $this ей возвращать не нужно достаточно вернуть подмножество сущностей, удовлетворяющих заданному условию.

    Это я к тому, что создавать коллекцию, которая будет содержать например 30 сущностей и ещё иметь поле totalCount со значением например 180 - не правильно, потому как никаких 180 сущностей в ней нет, а есть только 30. А 180 есть в репозитории, поэтому логично запросить эту цифре из него.
  • Как в ddd выбрать "всего" элементов?

    @galliard
    Михаил Шатилов, тут все довольно однозначно. Если и вас репозиторий - не коллекция, то и репозиторием его называть не стоит. Назовите его как-нибудь по другому, DAO например.
  • Хорошая ли практика создавать свои классы Exception для отлавливания разных ошибок?

    @galliard
    Может сейчас тебе кажется, что потом они понадобятся.
    Поверь, в 8 из 10 случаев не понадобятся (цифра с потолка).
    Вместо того чтобы выявлять требования, ты тратишь время на их выдумывание, и хорошо если угадаешь.

    2 из 10 случаев, в которых это понадобится, стоит того, чтоб написать их в оставшихся 8. Утверждение всегда верно, какие бы цифры ты не взял с потолка. Время, которое ты затратишь на эксепшны в этих условных 8 - ничтожно мало, по сравнению с временем на исправление условных 2, если это бы не было сделано сразу.

    Согласен (но не основной). Именно поэтому я предлагаю создавать Exception-ы под реальные требования проекта, а не под себя любимого.

    Нет ничего хуже самобытности в проекте. Но если у тебя другой опыт - то расскажи о нем.

    И опять же, "работа с исключениями" и "требования проекта" находятся в разных плоскостях бытия и никогда не пересекаются. Никогда не встречал требования по работе с исключениями и даже вообразить себе такое не могу.

    Стек трейс никто не отменял. Мы ведь про php говорим, да?
    Ты же сообщение об ошибке то туда положишь? throw new FileException("Нет доступа к файлу");
    У тебя же есть текстовый редактор который найдет все "new FileException", да?
    Че тут аццкого?

    Стектрейсом ты найдешь один эксепшн, у тебя их 1000. Из них только некоторые связана с доступом, их может 50, может 200, а может 500 конкретную цифру никто не знает, поэтому проверить придется всю 1000. Кто-то напишет "Нет доступа к файлу", кто-то "Файл недоступен", кто-то "Файл не читается", кто-то ещё на английском напишет. Кто-то вообще напишет что-то невнятное, и чтобы понять, что произошло, придется вчитываться в окружающий код, или ещё хуже - запускать его. После 50 таких исправлений ты устанешь заниматься муторной однотипной фигней, у тебя начнет в глазах рябить от них, ты начнешь путаться и делать ошибки. И это при том, что 95% всей работы ещё не сделано.
  • Как на PHP в консоли WINDOWS получить кириллический текст, введенный с клавиатуры?

    @galliard Автор вопроса
    Олег Муравейко, у меня ваш первоначальный вариант с UTF-8 по умолчанию и двойной перекодировкой не сработал.

    Но все-таки в наших кейсах есть отличие, я беру данные из STDOUT, а вы из предустановленного массива $argv.

    Попробовал забрать кириллические символы из $argv[1], все заработало сразу искаропки и без перекодировок при любой кодировки терминала (пробывал все 3).
  • Хорошая ли практика создавать свои классы Exception для отлавливания разных ошибок?

    @galliard
    WhoMe, а затем, что сегодня это твой проект, завтра твой и Васин, а послезавтра Васин и Димин, а послепослезавтра Димин и Ванин. И от того, что ты когда-то знал (но уже давно забыл) как там все раньше работало Диме и Ване не легче.

    Именно то, что каждый программист херачит код исключительно под себя любимого является основной причиной говнокода во всех проектах.

    Зачем вам AccessFileException?
    Если вы после этой ошибки программно выставляете нужные права - то ок.
    Если вы просто выводите сообщение - то зачем?

    Опять же затем, что сделать не трудно, а поддерживать в будущем будет легче. Может сейчас тебе кажется, что можно будет добавить этот эксепшны потом, когда он понадобится. Но поверь, когда у тебя в проекте будет миллионы строк кода, а FileException бросается в 100 разных мест, найти те места, где это происходит из-за отсутствия доступа к файлу будет аццки тяжело.
  • Хорошая ли практика создавать свои классы Exception для отлавливания разных ошибок?

    @galliard
    Вы допускаете большую ошибку считая, что эксепшны нужны для взаимодействия с пользователем. Это не так. Эксепшны нудны для взаимодействия с программистом. Именно он решает, как их обрабатывать и обрабатывать ли вообще. А взаимодействие с пользователем находится вообще в параллельной плоскости.
  • Хорошая ли практика создавать свои классы Exception для отлавливания разных ошибок?

    @galliard
    Александр Дуплий, конечно степень детализации уже определит каждый конкретный программист, но все же перекос в сторону "свое исключение на каждый чих" предпочтительнее, чем "везде одни и те же исключения, в основном только встроенные или от фреймворка".

    Ну и по поводу контроллера, конечно часть исключений там поймать можно, но вот FileException, PDOException и уж тем более Exception к таковым явно не относятся.
  • Как на PHP в консоли WINDOWS получить кириллический текст, введенный с клавиатуры?

    @galliard Автор вопроса
    Установка default_charset помогла, правда не UTF-8 (это вообще кодировка по умолчанию), а IBM866, WINDOWS-1251 или любую другую вендузытную кодировку.

    Странно, но в документации нигде не написано, что default_charset влияет на кодировку входящих данных.

    Функция mb_http_output не подходит для CLI, выдает ошибку, что не может перекодировать http-заголовки, которых нет. Аналога для CLI не нашел. Можно, конечно, написать свою, но один хрен она без буферизации не работает, а каждый раз дрочить буфер тоже не хочется.

    В двойной перекодировке тоже необходимости не увидел, одинарная вполне справляется.
  • Как изменить кодировку на PHP?

    @galliard
    $data = json_encode($_POST['data'], JSON_UNESCAPED_UNICODE);
  • Как превратит в секунды время после парсинга?

    @galliard
    livesco, не нужно пытаться встраивать его в изначальную регулярку, сделай это вторым preg_match'ем. Это будет и проще, и понятнее, и переделывать особо ниче не надо.
  • Как превратит в секунды время после парсинга?

    @galliard
    $matches = [];
    
    preg_match('/((\d{1,2}) мин )?(\d{1,2}) сек/u', $time, $matches);
    
    [2 => $min, 3 => $sec] = $matches;
    
    $totalSec = (int) $min * 60 + $sec;
  • Как превратит в секунды время после парсинга?

    @galliard
    livesco, а часами и днями они там потом не становятся? Может стоит огласить все возможные варианты?)
  • Как работает fastcgi в php и phpfpm?

    @galliard
    FastCGI - это когда веб-сервер перезапускает обработчик - в рамках темы - php каждый раз, как только пришел запрос на выполнение скрипта.

    Нет, это просто CGI. Идея FastCGI - заюзать тот же обработчик для обработки другого запроса (ну а потом 3го, 4го и т.д.)

    С другой оперы: это синхронная модель. Там же и про блокирование процесса обработчика на время отклика от того же FastCGI, например, или прокси и т.д.

    Я ничего не писал про синхронность обработки и блокировки. Это вообще про другое и в данном контексте не важно.