Виктор
Я понимаю. Как мне посмотреть, какие именно запросы пойдут?
Виктор
Понял, сейчас попробую.
Виктор
Виктор
Того запроса, что в листенере, почему-то нет...
kakoi-to-noob
воткни дебаг, заходит ли в слушатель
Виктор
Воткнул dump. Не срабатывает. Получается, не заходит. 😕
Виктор
Сделал вот такой lifecycle listener. Всё равно не работает. #[AsDoctrineListener(event: Events::preRemove)] class SearchIndexer { public function preRemove(EntityManagerInterface $em): void { $em ->createNativeQuery('PRAGMA foreign_keys = 1', new ResultSetMapping()) ->execute(); return; } }
Я хрень написал) Вот так работает: class PragmaForeignKeysOn { public function __construct( private EntityManagerInterface $em ) { } public function preRemove(PreRemoveEventArgs $args): void { $this->em ->createNativeQuery('PRAGMA foreign_keys = 1', new ResultSetMapping()) ->execute(); return; } }
Виктор
В общем, причина действительно была в том, что foreign_keys изначально выключена в SQLite.
Виктор
Всё равно это как-то странно выглядит, хотя и работает. А нет ли возможности выполнять запрос(-ы) при подключении к базе? Что-то вроде onConnect?
kakoi-to-noob
Всё равно это как-то странно выглядит, хотя и работает. А нет ли возможности выполнять запрос(-ы) при подключении к базе? Что-то вроде onConnect?
Для примера final class PostgresPostConnectMiddleware implements Middleware { public function wrap(Driver $driver): Driver { return new class ($driver) extends AbstractDriverMiddleware { /** * {@inheritDoc} */ public function connect( // #[SensitiveParameter] array $params ): Connection { $connection = parent::connect($params); $connection->exec(sprintf('SET TIMEZONE TO "%s"', $_ENV['DB_POSTGRES_TIMEZONE'])); return $connection; } }; } }
Виктор
Не знал, что такое есть. Спасибо, сейчас поизучаю.
Alex
В общем, причина действительно была в том, что foreign_keys изначально выключена в SQLite.
Всегда когда встречаю Скл лайт, то вспоминается что она куцая. Стоит ожидать специфичные косяки от неё.. рассмотри отказ от неё если проект будет развиваться или необязательно её надо использовать
Kirill
так у неё по задачам селект онли делать и всё
Kirill
тупо чтоб в жсон не хранить всё
Виктор
services: _defaults: bind: $thumbnailsDir: '%kernel.project_dir%/public/gallery/thumbnails' when@test: services: _defaults: bind: $thumbnailsDir: '%kernel.project_dir%/public/test/thumbnails' --- class DevFixtures extends Fixture implements FixtureGroupInterface { public function __construct(private string $thumbnailsDir) { var_dump($this->thumbnailsDir); } } class TestFixtures extends Fixture implements FixtureGroupInterface { public function __construct(private string $thumbnailsDir) { var_dump($this->thumbnailsDir); } } --- > php bin/console doctrine:fixtures:load --group=dev string(51) "***/public/gallery/thumbnails" > php bin/console doctrine:fixtures:load --group=test --env=test string(51) "***/public/gallery/thumbnails"
Виктор
Всем привет! Почему в dev и test получается одно и то же значение? Насколько я понял из документации, $thumbnailsDir должна браться из when@test в случае, когда есть --env=test
Михаил
services: _defaults: bind: $thumbnailsDir: '%kernel.project_dir%/public/gallery/thumbnails' when@test: services: _defaults: bind: $thumbnailsDir: '%kernel.project_dir%/public/test/thumbnails' --- class DevFixtures extends Fixture implements FixtureGroupInterface { public function __construct(private string $thumbnailsDir) { var_dump($this->thumbnailsDir); } } class TestFixtures extends Fixture implements FixtureGroupInterface { public function __construct(private string $thumbnailsDir) { var_dump($this->thumbnailsDir); } } --- > php bin/console doctrine:fixtures:load --group=dev string(51) "***/public/gallery/thumbnails" > php bin/console doctrine:fixtures:load --group=test --env=test string(51) "***/public/gallery/thumbnails"
Можно сделать короче 1) services: _defaults: bind: $thumbnailsDir: '%kernel.project_dir%/%env(THUMBNAIL_PATH)%' 2) создать services.yaml и services.test.yaml 3) есть язык выражений для конфигураций и там можно сделать тернарный оператор (я не помню как точно пишется): services: _defaults: bind: $thumbnailsDir: 'env(APP_ENV) === test ? a/b/c : c/b/a' почему не работает when не совсем понятно
Виктор
Михаил, спасибо. Первый способ сработал. Второй не сработал, как и мой. Третий не пробовал, но по логике тоже должен сработать, как и второй.
Виктор
Любопытно, почему не сработали те, что основаны не на переменных окружения? 🤔
Виктор
Виктор
Михаил
Итого Env файлы подтягиваются правильно, но внутри кернела переменная enviroment всё равно dev Короче продебаж как собирается Kernel. Он делает это в bin/console и в public/index.php Больше идей у меня нет
Михаил
А ну и чо за версия симфы?
Михаил
Ну и это, rm -rf ./var Есть такая традиция
Михаил
А, ну неее, слишком новое ещё не шупал
Михаил
7.0.4
А и еще. В env.test и env.test.local какая app_env?
Михаил
Если её нет или она test, то тогда точно не знаю
Виктор
В .env dev, в .env.test test, .env.test.local у меня нет.
Михаил
Ну тогда ждём других ответов. Может ты где-то в конфиге опечатался или дефолты трогать нельзя
Виктор
Ща ещё покопаюсь.
Виктор
Михаил, в любом случае спасибо) Я пока через переменные окружения по твоему совету реализовал. Просто любопытно, почему не работает - вроде должно же на первый взгляд.
Виктор
Виктор
Виктор
Вот у меня в кэше и дев, и тест - одно значение. А должно быть разное.
Юра
Юра
у меня работает так даже без присутвия APP_ENV=test нигде
Юра
правда не 7
Михаил
В .env dev, в .env.test test, .env.test.local у меня нет.
Слушай, а ты в докере запускаешь? Может там env переопределяется
Виктор
а в .env.local ?
У меня только .env и .env.test
Виктор
Я так и не нашёл причину пока. Буду дальше копать, но уже не сегодня. Отпишусь по итогу в любом случае, когда пойму, в чём дело. Вдруг кому интересно будет.
Виктор
Я, кстати, пробовал не when@test, а when@dev делать. Типа есть дефолт, потом в вен-эт-дев переопределяю значение. И тоже нифига не работает!
Виктор
Хотя дев же вообще среда по умолчанию. Оно как-будто вообще не видит конфиги для определённых сред, а только общие видит.
Doom
Здравствуйте, подскажите, а в Symfony Forms есть возможность сделать кнопку, которая добавляет элемент интерфейса, или это только js надо использовать?
Юра
Может у тебя он включен и кеширует все подряд
#lest
Как получить тело ответа при throw ServerException от HttpClient
Vlad
Как получить тело ответа при throw ServerException от HttpClient
https://github.com/symfony/http-client/blob/7.1/Exception/HttpExceptionTrait.php#L74
Vlad
https://github.com/symfony/contracts/blob/main/HttpClient/ResponseInterface.php#L59
#lest
При вызове метода внутри catch выбрасывается новое исключение
Vlad
#lest
Так она выбрасывается те же исключение когда отправляешь запрос, я же не буду рекурсивно делать try catch при каждом getResponse
Vlad
так где исключение выбрасывается
Vlad
на getResponse
Vlad
или getContent
#lest
При getResponse->getContent, тело там точно есть
Vlad
false в getContent передавал?
#lest
Vlad
внимательнее надо быть.
#lest
Да не заметил, можешь помочь у меня с кодировкой что-то не то в ответе т.к. там есть кирилица и латиница, латиница нормально отображается, а кирилица формата когда 2 раз подряд делаешь json_encode (пример: \ufffd\ufffs)
Vlad
посмотри документацию json_encode, там есть ответ на твой вопрос
#lest
Я не делаю json_ecode нигде в коде, просто вывожу echo getContents
#lest
Тело ответа и так в json формате
#lest
Нашёл причину, не передался заголовок с charset
Вадим
привет! Надо посчитать в сервисе несколько значений. как православнее: отдать результат в dto или можно геттерами из сервиса поспрашивать?
Юра
На максималках конечно правильно полностью разделить слои хттп и сервисов и вернуть дто
Вадим
спасибо
Dmitriy
Абстрактно что-то тяжело советовать, может там нужны методы calculateSome():
Михаил
привет! Надо посчитать в сервисе несколько значений. как православнее: отдать результат в dto или можно геттерами из сервиса поспрашивать?
делай так, как было бы производительней. Если нужно вернуть 2,3 значения и для них нужны одинаковые запросы в бд, то лучше слить в один метод и отдать в одной дто. Идеалы чистого кода никогда не могут быть превыше производительности. Можно ещё использовать прицеп муравьеда. То есть закидывать некий контекст в этот метод, из этого контекста метод будет считывать аргументы для калькуляции и в этот же контекст он будет класть результат. А метод будет возвращать void
Михаил
Плюс если ты пользуешься инверсией зависимостей для изоляции, то скорее всего это потребует использование одного метода, чем 3 разных