The Ant
газл сам по себе абстракция над курлом\стримами )
The Ant
получается пилишь абстракцию над абстракцией, которую надо еще закрыть абстрактным интерфейсом. звучит как какая-то хуета, разве нет?
Павел
ну я пишу <ApiName>Client не оно?
У меня есть CdekApi в нем есть HttpClientInterface а в нем GuzzleClient. Для чегоя это делаю? МИнимум для моков. Я был в проекте где мокали галз, это пиздец. Замокать клиетнт, который генерит респост, в котором замокать гетконтент и так каждый раз
Павел
@theantt я выше скидывал скрин, разве большая абстракция?
The Ant
там просто интерфейс
The Ant
который покрывает оч мало кейсов
Павел
который покрывает оч мало кейсов
А какие кейсы мне нужны? Http запрос?
Павел
Скорее всего это гавно, но вот собственно весь код, разве много ?
Павел
Зато когда у меня сдек вообще не работал (у них фейлы), я просто свой мок подставлял пока разрабатывал, по их документации
The Ant
Скорее всего это гавно, но вот собственно весь код, разве много ?
в $this->client твой интерфейс, и твой адаптер под газл? зачем тебе тогда эксепшоны от газла? должны быть свои
The Ant
и респонс почему-то газловский, хотя должен быть уже свой
Павел
А CdekApi юзает HttpClientInterface
The Ant
ну как я вижу с твоих слов, должен юзать именно свой клиент
The Ant
внутри которого лежит газл\симфа что там еще
The Ant
да, но в твоем коде юзается код газла
The Ant
так что какая разница, будет там газл интерфейс. или твой?
The Ant
как по мне уж лучше явно указать что именно там юзается, хотябы будешь понимать с чем работаешь
Павел
так что какая разница, будет там газл интерфейс. или твой?
Для меня было разница в моках именно. Как я и говорил, мокать газл это сплошная боль
Павел
$response = $this->client->request($method, $relativeUrl, $options); $content = $response->getBody()->getContents(); $statusCode = $response->getStatusCode(); return new Response($statusCode, $content); (Это уже мой респонс) Сколько нужно замокать, чтобы отдать json без моего респонс? 1) guzzle client который отдаст мок объект guzzle response 2) guzzle response, в котором нужно релизовать getBody В соем случае: 1) Мой client, который отдает new Response(200, json_encode()); Полегче да? Ну и сам факт независимости CdekApi от конкретной реализации http client
Павел
Ну в целом это не критикал, тут на вкус и цвет. Мне показалось мокать газл ужасно неудобно, именно поэтому пришел к этому + DIP
The Ant
м.б. от стиля писателя зависит еще? ) Я например не хочу в коде разбирать ответы. Мне или данные готовые давай, или ошибку.
The Ant
зачем каждый раз разбирать гдето ответ? муторно же
Павел
Пишешь свой HttpClientInterface который или ответ или ошибка.
Павел
Просто в данном случае код передавался для того, что бы потом сделать повторную авторизацию если протух токен. Там есть еще AuthClientInterface который декоратор
Павел
Он авторизировался и получал акссес токен
Павел
Как видишь еще один плюсик) Можно навертеть сверху декораторы
The Ant
это вообще мидлварью должно делаться )
Павел
это вообще мидлварью должно делаться )
Для газла, а я не завишу от клиента
The Ant
нет, по идее. т.е. чек токена до запроса, и получение нового, если протух
Павел
нет, по идее. т.е. чек токена до запроса, и получение нового, если протух
Ага, + один запрос + шанс того что можено все равно пролететь , так как время между запросами есть. "Такое себе"
The Ant
т.е. в твоем коде этого поидее не должно быть вообще, это должно быть в настройках гдето
Павел
А, чек токена по времени внутри. Ну это если оно есть там
Павел
ТАм вроде не jwt был, точно не помню
Павел
Ну короче у каждого свое виденье, это норм)
The Ant
хз короче, думаю продолжу просто юзать газл. безо всяких сраных адаптеров :D Потому что альтернатив тупо нету всё равно
The Ant
а когда появится что-то более вменяемое, незазорно потратить пару дней и переписать там где юзается на что-то другое. Потому что в любом случае придется что-то переписывать 😄
Павел
Короче главное чтобы нравился свой стиль)
The Ant
ну, помимо стиля есть еще практичность. вот в адаптерах ради адаптеров я её не вижу, эту практичность. Учитывая что многие штуки, годами не меняются... да не то что годами, никогда примерно.
The Ant
декораторы и так можно сделать,в симфе по крайней мере
Павел
The Ant
говно, хотел бы декоратор через атрибут навесить, а некак
The Ant
в питухоне вот можно. а тут нет. какой пиздец
The Ant
это когда? )
Павел
это когда? )
6.1 вроде уже
The Ant
отлично! хоть что-то приятное за сегодня
Юра
В обычном проекте симфы и так уже овер 8000 пхп файлов. Хочется асинк загрузки файлов, берешь либу созданную для этого и грузишь. Вот а проблем?
Dima
Привет
Dima
Этот вопрос имеет некоторую специфичность для Симфы, но в целом пох Пишу валидатор апи респона. Точкой входа естть 2 публичных метода. И далее я по приватным таскаю два переданных параметра Я тут подумал, что бы не таскаь их за собой, я могу ими наполнить состояние валидатора (присвоить свойствам эти два парамера) И далее не таскать их, а просто обращаться к ним
Dima
Но, есть очень старый баян, мол сервисы не должны быть мутабельны (что я типа нарушаю присвоивши два параметра
Dima
Но по факту, мой валидатор сервис даже не полноценный сервис, т.к у него нету зависимостей которые бы я в него инжектил
Юра
Хз я такое вижу сплошь и рядом
Юра
Только я не понимаю почемк тогда не сделать просто передачу тужа данных через конструктор если это не сервис
Юра
И простл создал валидатор с параметрами, провалидировал
Юра
Как форму
Юра
Инджектить можешь в таком случае валидатор фактори с методом createValidator(req, res), которая будет возвращать новый валидатор
Юра
И не надо делать два раза initialize тогда
Юра
А то выглядит как-то не оч
Юра
А если фактори будет возвращать интерфейс, то можно еще и изменить имплементацию без гемора
Иван
Привет
я боюсь, что человек, который это будет поддерживать, захочет тебя убить
Иван
вот лично мне не нравится всё, начиная с нейминга что такое реквестдто? это реквест или дто?
Иван
почему просто валидатор и аннотации не используются?
Иван
прошу прощения, реквест дата тут дто должен быть
Юра
https://github.com/php-curl-class/php-curl-class#available-methods
Юра
Там тебе и мультикурл и addDownload(url)
The Ant
ужас
The Ant
это для коленочных скриптов :D
Юра
Значит пришло время написать свою библиотеку и поделиться со всем миром этим гениальным изобретением
The Ant
Значит пришло время написать свою библиотеку и поделиться со всем миром этим гениальным изобретением
взял старый добрый https://github.com/8p/EightPointsGuzzleBundle и ебал все эти новомодные штучки с ручным управлением через анал. Кстати в симфоневском клиенте асинк это какая-то пародия.
Руслан 🇲🇨
Здравствуйте!
Руслан 🇲🇨
Руслан 🇲🇨
При нажатии на ссылки должны выводиться товары, но не выводятся. 1.js: import $ from 'jquery'; $(document).ready(function(){ $("[href]").click(function(e){ e.preventDefault(); $("#result").load("/good?cat="+$(this).attr('id')); }); }); Контролер: public function showGood(Request $request)//: Response { $products = $this->getDoctrine()->getManager()->getRepository(Product::class)->showGood($request->query->get('cat')); for($i = 0; $i < count($products); $i++) { $out[$i]['id'] = $products[$i]->getId(); $out[$i]['name'] = $products[$i]->getName(); } return $this->render('good.html.twig', [ 'out'=>$out, ]); } Репозиторий: public function showGood(int $cat): array { $entityManager = $this->getEntityManager(); $query = $entityManager->createQuery( 'SELECT partial p.{id, name} FROM App\Entity\Product p INNER JOIN u.Category c WHERE p.id = :id')->setParameter('id', $cat); return $query->getResult(); }