Все сервисы Хабра

Сообщество IT-специалистов

Ответы на любые вопросы об IT

Профессиональное развитие в IT

Удаленная работа для IT-специалистов

Войти на сайт
  • Все вопросы
  • Все теги
  • Пользователи

Хабр Q&A — вопросы и ответы для IT-специалистов

Получайте ответы на вопросы по любой теме из области IT от специалистов в этой теме.

Узнать больше
другие проекты хабра
  • Хабр
  • Карьера
  • Фриланс
Задать вопрос
voronkovich

voronkovich

  • 116
    вклад
  • 1
    вопрос
  • 104
    ответа
  • 37%
    решений
Комментарии
  • Информация
  • Ответы
  • Вопросы
  • Комментарии
  • Подписки
  • Нравится
  • Достижения
  • Подключение платежного шлюза СберБанк. Как реализовать подключение?

    voronkovich
    voronkovich @voronkovich
    андрей громов, не знаю, я подобных вещей не делал.
    Написано более двух лет назад
  • Подключение платежного шлюза СберБанк. Как реализовать подключение?

    voronkovich
    voronkovich @voronkovich
    андрей громов, Я не знаю ответа на ваш вопрос. При помощи API Сбербанка такую форму сделать не получится. Вам лучше написать в службу поддержки эквайринга Сбербанка.
    Написано более двух лет назад
  • Где и когда стоит использовать partial объекты doctrine?

    voronkovich
    voronkovich @voronkovich
    Николай Егоров, Я бы не стал указывать DTO явно. Если бы вы использовали гидратацию в массивы, вы вряд ли бы стали именовать метод: findCateroryArrayForMenuBuild?
    Написано более трёх лет назад
  • Где и когда стоит использовать partial объекты doctrine?

    voronkovich
    voronkovich @voronkovich
    Николай Егоров, Я имел ввиду, что используя DTO, мы сами применяем шаблон Приспособленец. Хотя и не уверен, т.к. не сильно разбираюсь в шаблонах.
    Написано более трёх лет назад
  • Как добавить свою функцию для twig?

    voronkovich
    voronkovich @voronkovich
    Никита Колесников, есть, но я не уверен, что он актуальна: https://x-twig.ru/blog/polzovatelskie_funktsii_v_twig/
    Написано более трёх лет назад
  • Подключение платежного шлюза СберБанк. Как реализовать подключение?

    voronkovich
    voronkovich @voronkovich
    ale3x, Всё верно, это должна быть JSON-строка. Я добавил автоматическую конвертацию в JSON параметра orderBundle (https://github.com/voronkovich/sberbank-acquiring-... ). Обновитесь до версии 2.3
    Написано более трёх лет назад
  • Phpunit в Symfony 4, изменить URL сайта?

    voronkovich
    voronkovich @voronkovich
    Евгений Ромашкан, Переопределите метод self::createClient():

    public function createClient()
    {
        $client = parent::createClient();
        $client->setServerParameter('HTTP_HOST', 'symfony-test');
    
        return $client;
    }
    Написано более трёх лет назад
  • Задавать явно все default значения для полей через php каждый раз при создании объекта?

    voronkovich
    voronkovich @voronkovich
    Евгений Ромашкан, Он добавил: options={"default": "default_value"}. Что вас смущает?
    Написано более трёх лет назад
  • Symfony4 Flex + Doctrine: какой бандл для data grid можно прикрутить?

    voronkovich
    voronkovich @voronkovich
    Beit, Вы можете поставить sylius/grid-bundle, но beta-версию. По мне так это нормально, beta - это почти стабильно.

    composer require 'sylius/registry:^1.2@beta'  'sylius/grid:^1.2@beta' 'sylius/grid-bundle:^1.2@beta'


    Потом, когда 1.2 выпустят удалите суффикс beta и первые две зависимости.
    Написано более трёх лет назад
  • Symfony 4 REST API: как правильно включить метод OPTIONS?

    voronkovich
    voronkovich @voronkovich
    Дмитрий Щербаков, Ну, вообще говоря, вы правы. Если понадобится что-то сложнее лучше сразу взять CorsBundle, а не писать свои костыли :) Пока хватает 3-х строчек, пусть будут 3 строчки.
    Написано более трёх лет назад
  • Symfony 4 REST API: как правильно включить метод OPTIONS?

    voronkovich
    voronkovich @voronkovich
    Дмитрий Щербаков, Ну тогда я могу предложить вам идеальное решение :)

    Когда маршрут есть, но не принимает HTTP-метод (OPTIONS, в вашем случае) маршрутизатор бросает исключение: MethodNotAllowedHttpException.

    Когда бросается исключение, HttpKernel запускает событие 'kernel.exception'. Можно сделать подписчик на это событие, который будет возвращать нужный ответ для запроса OPTIONS:

    <?php
    
    namespace App\EventSubscriber;
    
    use Symfony\Component\EventDispatcher\EventSubscriberInterface;
    use Symfony\Component\HttpFoundation\Response;
    use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;
    use Symfony\Component\HttpKernel\Exception\MethodNotAllowedHttpException;
    use Symfony\Component\HttpKernel\KernelEvents;
    
    class ApiOptionsSubscriber implements EventSubscriberInterface
    {
        public function onKernelException(GetResponseForExceptionEvent $event)
        {
            $exception = $event->getException();
    
            if (!$exception instanceof MethodNotAllowedHttpException) {
                return;
            }
    
            $request = $event->getRequest();
    
            if (!$request->isMethod('OPTIONS') && 0 !== strpos($request->getUri(), '/api/')) {
                return;
            }
    
            $allowedMethods = 'OPTIONS, '.$exception->getHeaders()['Allow'];
    
            $response = new Response();
            $response->headers->set('Access-Control-Allow-Methods', $allowedMethods);
    
            $event->setResponse($response);
            $event->allowCustomResponseCode();
        }
    
        public static function getSubscribedEvents()
        {
            return [
               KernelEvents::EXCEPTION => 'onKernelException',
            ];
        }
    }
    Написано более трёх лет назад
  • Symfony 4 REST API: как правильно включить метод OPTIONS?

    voronkovich
    voronkovich @voronkovich
    Дмитрий Щербаков, Если вы хотите конфигурировать OPTIONS для нескольких маршрутов, рекомендую создать отдельный контроллер для этих целей:

    <?php
    
    namespace App\Controller;
    
    use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
    use Symfony\Component\HttpFoundation\Request;
    use Symfony\Component\HttpFoundation\Response;
    use Symfony\Component\HttpKernel\Exception\MethodNotAllowedHttpException;
    
    class OptionsController extends AbstractController
    {
        public function __invoke(Request $request, string $allowedMethods = ''): Response
        {
            if (!$request->isMethod('OPTIONS')) {
                throw new MethodNotAllowedHttpException();
            }
    
            $response = new Response();
    
            $response->headers->set('Allow', 'OPTIONS, '.$allowedMethods);
    
            return $response;
        }
    }


    Конфигурацию производить в YAML-файле:

    api_options:
        path: /api
        controller: App\Controller\OptionsController
        methods: OPTIONS
        defaults:
            allowedMethods: 'GET, POST'
    
    api_blog_options:
        path: /api/blog
        controller: App\Controller\OptionsController
        methods: OPTIONS
        defaults:
            allowedMethods: 'GET, POST, PUT'


    Тогда не придется пиcать проверки в контроллерах.
    Написано более трёх лет назад
  • Symfony 4 - Как сделать редирект в Сервисе?

    voronkovich
    voronkovich @voronkovich
    Подписчик события нужен для того, чтобы вернуть ответ на ранней стадии работы приложения, до маршрутизации, вызова контроллера и т.д.

    У экземпляра события есть метод GetResponseEvent#setResponse() api.symfony.com/master/Symfony/Component/HttpKerne...

    # Подписчик события может установить ответ приложения.
    # В таком случае приложение завершает работу и возвращает заданный подписчиком ответ
    function onKernelRequest(GetResponseEvent $event): void
    {
        $event->setResponse(new RedirectResponse('/login'));
    }


    Компонент HttpFoundation является абстракцией над стандартными средствами PHP т.е. над $_GET, $_POST, header() и т.д.

    Чтобы ответ был возвращен броузеру нужно сделать вызов Response#send():

    <?php
    
    require 'vendor/autoload.php';
    
    use Symfony\Component\HttpFoundation\Response;
    
    function getResponse(string $body = 'ok'): Response
    {
        return new Response($body);
    }
    
    // Здесь отправка не происходит, мы просто получаем экземпляр
    $response = getResponse();
    
    // Отправка ответа в браузер
    $response->send();


    Если вы заглянете в исходный код метода send, вы увидите, что там используется header() и все остальное https://github.com/symfony/http-foundation/blob/15...

    В Symfony, метод Response#send вызывается в самом конце front-контроллера (public/index.php).
    Написано более трёх лет назад
  • Symfony 4 - Doctrine - Repository как вытащить правельный тип данных??

    voronkovich
    voronkovich @voronkovich
    Спасибо, за рецепт, DevMan! А там нету никаких подводных камней? Если для поля используется BIGINT то в PHP'ный тип для некоторых платформ он не влезет.


    The size of an integer is platform-dependent, although a maximum value of about two billion is the usual value


    Эта штука только для integer работает? Или для других типов тоже?
    Написано более трёх лет назад
  • Почему после отправки формы в Symfony 4 isPasswordValid() работает иначе, чем до отправки?

    voronkovich
    voronkovich @voronkovich
    hiimnotwordy, Лучше не передавать объект пользователя в форму вообще (или использовать DTO). Если я понял правильно, у вас всего два поля в форме: 'password" и 'currentPassword'. Присланные данные можно получить через метод getData (тут есть нестолько примеров https://symfony.com/doc/current/forms.html#creatin...

    $form = $this->createForm(ChangePasswordType::class);
    
    $form->handleRequest($request);
    
    if ($form->isSubmitted() && $form->isValid()) {
        $newPassword = $form['password']->getData();
        $currentPassword = $form['currentPassword']->getData();
    
        if ($encoder->isPasswordValid($this->getUser(), $currentPassword)) {
            // OK, можно сохранять
        }
    }
    Написано более трёх лет назад
  • Есть ли какие-то глобальные отличия symfony от django?

    voronkovich
    voronkovich @voronkovich
    Максим Федоров, Думаю, если взять Flask вместе с flask-sqlalchemy и какую-нибудь реализацию DI-контейнера (Например, pinject, то можно сделать что-то наподобие Symfony.

    UPD. Прямого аналога я не встречал.
    Написано более трёх лет назад
  • Как правильно тестировать валидацию сущности?

    voronkovich
    voronkovich @voronkovich
    Если в документации об этом упоминается, значит это кому-нибудь нужно.

    Вам виднее какие тесты писать. Но, на мой взгляд подобные тесты отнимают много времени и не приносят никакой ощутимой пользы. Они даже процент покрытия не повышают :) Поищите на гитхабе тег symfony-application. Там есть несколько OS-приложений. У всех есть тесты, ни у одного не тестируется валидация.

    Все таки это больше похоже на модульное - тестируется, установлены ли нужные ограничения на сущность

    Спорить не стану. Я не очень хорошо различаю виды тестирования.

    У меня была мысть протестировать ограничение на уникальность как раз в функциональном тесте, а другие ограничения быстро прогнать в таком

    Так проще тогда все и протестировать в одном функциональном тесте. Полезность функциональных тестов гораздо выше.
    Написано более трёх лет назад
  • Как создать каскадную форму Symfony 2?

    voronkovich
    voronkovich @voronkovich
    Виталий Сорокин, Да, именно так. Я динамические формы создаю прямо в конроллерах (так сразу есть Response и FormBuilder). В сервисы есть смысл выносить если собираетесь переиспользовать.
    Написано более трёх лет назад
  • Как создать каскадную форму Symfony 2?

    voronkovich
    voronkovich @voronkovich
    Виталий Сорокин, Есть еще один вариант - использовать другое событие: PRE_SUBMIT. Там вы сможете получить доступ ко всем данным.

    По крайней мере в документации это так: https://symfony.com/doc/current/form/events.html#e...
    Написано более трёх лет назад
  • Как создать каскадную форму Symfony 2?

    voronkovich
    voronkovich @voronkovich
    Виталий Сорокин, Возмите их сами. Вы можете внедрить в форму экземпляр Request или использовать $_POST, если совесть позволяет :).

    Можно передать прямо из контроллера:
    $form = $this->createForm(.., $data, [ 'request' => $request ]);


    Также вы можете построить форму динамически прямо в контроллере, тоже получая данные прямо из Request.
    Написано более трёх лет назад
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • Следующие →
Самые активные сегодня
  • Evgenii
    • 22 ответа
    • 0 вопросов
  • Drno
    • 6 ответов
    • 0 вопросов
  • firedragon
    Владимир Коротенко
    • 6 ответов
    • 0 вопросов
  • Борис Алексеев
    • 5 ответов
    • 0 вопросов
  • work_jabir
    Джабир
    • 5 ответов
    • 0 вопросов
  • hint000
    hint000
    • 5 ответов
    • 0 вопросов
  • © Habr
  • О сервисе
  • Правила
  • Обратная связь
  • Блог

Войдите на сайт

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