• Подскажете по архитектуре системы уведомлений?

    mayton2019
    @mayton2019
    Bigdata Engineer
    При данной схеме тебе база и крон вообще не нужны. Пиши сразу в Rabbit. Если consumer обладает логикой неуспеха обработки - то пускай кидает необработанное вообщение в специальную мусорку (Dead-Letter-Quee) для анализа ошибок впоследствии.

    Какой возможен программный потолок количества отправляемых уведомлений в единицу времени, при такой архитектуре на одном сервере?

    На этот вопрос невозможно ответить. Цифры могут отличаться в разы в зависимости от выбранного железа. Но современные MQ настолько быстрые что с большей вероятностью твой софт не сможет их загрузить событями.
    Узким местом в такой системе будет скорее всего твой софт.
    Ответ написан
    2 комментария
  • Обязательно ли возвращать объект в методе, если в PHP его изменение идет по ссылке?

    @rPman
    Нет никаких требований ООП или ограничений на то, как возвращать, надо ли возвращать, сколько возвращать и прочее.

    Делай так как удобно и по возможности так, чтобы сделать меньше всего ошибок.
    Ответ написан
    Комментировать
  • Как кастомизировать ексепшены в общем методе?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Первый вариант - это однозначно глупость. Какое-то совсем уже натягивание процедурного подхода на ООП.
    Второй какой-то невнятный, про него ничего нельзя сказать толком.

    В общем случае, как правильно написал sl0 в комментарии, кидать надо ОДИН тип исключения, но с разными сообщениями.

    В данном конкретном случае, поскольку речь идёт о валидации, то никакое исключение в принципе кидаться не должно. Исключение кидается в случае, если функция не может выполнить свою работу. Но для функции checkParam() невалидный параметр НЕ ЯВЛЯЕТСЯ исключительной ситуацией. Потому что роль этой функции - как раз и определить валидность переданного параметра. В случае неверных данных функция должна записать сообщение об ошибке во внутренний массив ошибок класса-валидатора и вернуть false.
    spoiler

    Исключение в случае неверных параметров может кидать например функция сохранения в БД. Потому что её задача - сохранить переданные данные, а не валидировать их. И в случае, если функция не может сохранить данные - она должна кинуть исключение, в том числе из-за невалидности данных.
    Ответ написан
    9 комментариев
  • Можно ли в Symfony инициализировать в конструкторе сервисы если их не используешь?

    voronkovich
    @voronkovich
    Под ваше описание подходит Service Subscriber

    Что такое "подписчик сервисов"?

    Это сервис, который получает свои зависимости в виде локатора (https://en.wikipedia.org/wiki/Service_locator_pattern). При этом, локатор реализует ленивую загрузку, что позволяет не создавать экземпляры сервисов без необходимости.

    Когда его следует использовать?

    Когда у сервиса много зависимостей, но не все они используются им одновременно.
    Примером, может служить AbstractController, который зависит от Twig, Doctrine, Router и т.д.
    Очевидно, что не для каждого запроса нужен Twig (json api), и не в каждом запросе есть обращение к БД.
    См. https://github.com/symfony/symfony/blob/e1581a0937...

    Как его создать?

    Реализовать интерфейс ServiceSubscriber:

    <?php
    
    use Psr\Container\ContainerInterface;
    use Symfony\Contracts\Service\ServiceSubscriberInterface;
    
    class SomeService 
    {
        public function __constructor(
            private ContainerInterface $container,
        ) {
        }
        
        public static function getSubscribedServices(): array
        {
            return [
                ServiceFirst::class => ServiceFirst::class,
                ServiceSecond::class => ServiceSecond::class,
                SomeCommonService::class => SomeCommonService::class,
            ];
        }
        
        public function methodFirst()
        {
            $this->container[SomeCommonService::class]->doSomethingCommon();
            $this->container[ServiceFirst::class]->doSomethingFirst();
    
            return $this->commonMethod();
        }
        
        public function methodSecond()
        {
            $this->container[SomeCommonService::class]->doSomethingCommon();
            $this->container[ServiceSecond::class]->doSomethingSecond();
            
            return $this->commonMethod();
        }
    
        private function commonMethod(): string
        {
            // some code
            
            return 'some string';
        }
    }


    Однако, я соглашусь с ответами выше. В подавляющем большинстве случаев лучше будет разбить на несколько сервисов.
    Ответ написан
    1 комментарий
  • Как избавиться от try-catch в контроллерах?

    myks92
    @myks92 Куратор тега PHP
    Нашёл решение — пометь вопрос ответом!
    Смотря для чего вы делаете эти try catch. Это не всегда повторяемость иногда действительно нужна, например, чтобы перебросить своё исключение. Пойти можно разными способами. Но а простой - это вам нужно просто их убрать и сделать Listener или Subscriber, который будет обрабатывать ошибки и отдавать их в нужном формате в api. Если правильно понял для чего нужно. Пример.
    Ответ написан
    1 комментарий
  • Как организовать роли в Symfony?

    BoShurik
    @BoShurik Куратор тега Symfony
    Symfony developer
    security.yml
    security:
        access_control:
            - { path: ^/ }

    RequestVoter.php
    use Symfony\Component\HttpFoundation\Request;
    use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
    use Symfony\Component\Security\Core\Authorization\Voter\VoterInterface;
    use Symfony\Component\Security\Core\Security;
    
    class RequestVoter implements VoterInterface
    {
        /**
         * @var Security
         */
        private $security;
    
        public function __construct(Security $security)
        {
            $this->security = $security;
        }
    
        /**
         * @inheritDoc
         */
        public function vote(TokenInterface $token, $subject, array $attributes)
        {
            if (!$subject instanceof Request) {
                return self::ACCESS_ABSTAIN;
            }
    
            $route = $subject->attributes->get('_route');
            $routeRole = $this->getRoleByRoute($route);
    
            if ($this->security->isGranted($routeRole)) {
                return self::ACCESS_GRANTED;
            }
    
            return self::ACCESS_DENIED;
        }
    
        protected function getRoleByRoute(string $route): string
        {
            // ...
        }
    }
    Ответ написан
    3 комментария
  • Как организовать контроллер под psr-15?

    @alexkozlov1982
    public function handle(ServerRequestInterface $request)
        {
            // получаем каким либо образом ваш метод action
            // в данном случае берем его из Request
            $this->action = $request->getAttribute('action') . 'Action';
    
            return $this->{$this->action}($request);
        }
    
    private function getAction(ServerRequestInterface $request)
        {
              //  обработка вашего метода
        }
    Ответ написан
    1 комментарий
  • Nginx: Как сделать rewrite всех корневых запросов на index.php?

    kotomyava
    @kotomyava
    Системный администратор
    Как-то так:
    location = /index.php {
      # тут проксирование или fcgi
    }
    
    location ~ /[^\/]+ { 
      rewrite .* /index.php;
    }
    Ответ написан
    Комментировать
  • Как сделать редирект доменов через DNS без добавлений в нем новых доменов?

    saboteur_kiev
    @saboteur_kiev
    software engineer
    Нет. Но вместо A-записи, можно добавлять C-записи...
    Ответ написан
    3 комментария