Anonymous
чуваки, а можно ли валидировать само регулярное выражение? что оно действительно является законченным итд
Anonymous
через Assert
Юра
Просто попробуй его использовать и если нетц ошибки значит норм
Anonymous
а нельзя
Anonymous
надо чтобы он был валидным
Юра
Ну а как ты хочешь еще провалидировать регулярное выражение?
Anonymous
ну как-то блять все эти сайты это делают?
Юра
Какие сайты
Anonymous
да всякие. для валидации регулярных выражений
Daria
ну как-то блять все эти сайты это делают?
https://stackoverflow.com/questions/8825025/test-if-a-regular-expression-is-a-valid-one-in-php
Юра
$ok = @preg_match('/asd++?/', 'as'); if ($ok === false) { echo error_get_last()['message']; } else { echo 'OK'; }
Юра
preg_match(): Compilation failed: nothing to repeat at offset 5
Юра
вот можешь выдернуть отсюда офсет
Юра
Только симфа может кинуть исключительние
Юра
У нее свой хендлер ошибок
Юра
Может быть все сложнее
Юра
Мож надо будет завернуть в трай кетч
Юра
Я не пойму тебе надо валидирлвать само регулярное выражение или что-то с помощью регулярного выражения
Юра
Ну так напиши свой вадидатор и используй код выше
Юра
Как написать саой валидатор есть в доке симфы
Юра
Ткм надо создать два класса
Юра
Аннотацию и сам валидатор
Anonymous
а нафига
Anonymous
^((?:(?:[^?+*{}()[\]\\|]+|\\.|\[(?:\^?\\.|\^[^\\]|[^\\^])(?:[^\]\\]+|\\.)*\]|\((?:\?[:=!]|\?<[=!]|\?>)?(?1)??\)|\(\?(?:R|[+-]?\d+)\))(?:(?:[?+*]|\{\d+(?:,\d*)?\})[?+]?)?|\|)*)$
Юра
Ну да зачем идти по простому пути )
Anonymous
ну надо ассерт использовать
Anonymous
значит ассерт
Сергей
Валидация регулярки с помощью регулярки. Надо не забыть провалидировать этот валидатор ... Может быть этим же валидатором
Anonymous
Но я уже сломался и сделал пока что прегматч
Anonymous
Загуглить было слабо
Я да это и сделал
Сергей
Смотрел тут у Елисеева лекцию прошлогоднюю. Там ниче нового не было, но попался на глаза код. У него там типа лот аукциона. И у лота есть метод makeBid. public function makeBid(Member\Id $member, $date, int $price): void { if (!$this->isActive()) { throw new \DomainException('Lot is not active.') } foreach ($this->bids as $current) { if ($current->isFromMember($member)) { throw new \DomainException('You are already have bid.') } } if ($last = $this->bids->last()) { $min = last->getPrice(); } else { $min = $this->price->getFirst(); } if ($price <= $min) { throw new \DomainException('Your bid is too small.'); } $this->bids->add(new Bid($member, $date, $price)); } Это как раз видимо подход рдм. А как думаете так вообще можно делать? Просто если представить что миллион пользователей сделали ставку на какой-то лот. И мы у каждого лота при создании новой ставки выгружаем миллион этих ставок и добавляем к ним еще одну. Этак ведь никакой памяти не хватит.
Юра
Поэтому это тупиковый подход
Юра
Код наверное для примера
Юра
Оно уже.на тысячах энтитей тупит ужасно
Юра
Да и вообще ОРМ и высокая нагрузка несовместимые вещи
Юра
Все это будет дергаться каждый раз на каждый запрос
Сергей
Ага. У меня сейчас просто аналогичная вещь. Но там в отдельном хендлере эта логика реализована. И проверки там всякие есть, но чтобы их осуществить надо в базу лазить.. Так понимаю, что подход Д.Елисеева тут будет плохо применим
Сергей
Рдм больше подходит к небольшим проектам, а не миллион юзеров, не?
Не сильно вчитывался в ваши прошлые холивары. Просто хотелось бы понять когда этот подход стоит использовать и стоит ли вообще
Юра
По идее ты можешь фильтровать коллекции
Anonymous
Не сильно вчитывался в ваши прошлые холивары. Просто хотелось бы понять когда этот подход стоит использовать и стоит ли вообще
Собственно, примерно так и использовать, я думаю. В микросервисах - норм тема. В монолитах, где нужно чтобы энтити было только геттеры сеттеры - анемик
Юра
https://www.doctrine-project.org/projects/doctrine-orm/en/2.7/reference/working-with-associations.html#filtering-collections
Юра
А некоторые методы доступны вообщем без загрузки коллекции. Читай про extra lazy collections
Сергей
По идее ты можешь фильтровать коллекции
Там сначала грузятся все записи из базы. Потом по ним коллекция фильтруется.
Сергей
неправда
Сергей
путаете с методом filter у коллекции
Сергей
через критерию - выполняется имеено запрос
Сергей
ну вот метод matching у ArrayCollection: public function matching(Criteria $criteria) { $expr = $criteria->getWhereExpression(); $filtered = $this->elements; if ($expr) { $visitor = new ClosureExpressionVisitor(); $filter = $visitor->dispatch($expr); $filtered = array_filter($filtered, $filter); } $orderings = $criteria->getOrderings(); if ($orderings) { $next = null; foreach (array_reverse($orderings) as $field => $ordering) { $next = ClosureExpressionVisitor::sortByField($field, $ordering === Criteria::DESC ? -1 : 1, $next); } uasort($filtered, $next); } $offset = $criteria->getFirstResult(); $length = $criteria->getMaxResults(); if ($offset || $length) { $filtered = array_slice($filtered, (int) $offset, $length); } return $this->createFrom($filtered); }
Сергей
ключевое тут - $filtered = array_slice($filtered, (int) $offset, $length);
Сергей
а хотя там наверное $visitor->dispatch($expr); запрос к базе делает
Сергей
хотя нет . ClosureExpressionVisitor условия для фильтрации именно коллекции применяет
Сергей
даже документации не верим?
Сергей
Надо смотреть PersistentCollection
Сергей
спасибо. Точно
Юра
Так что можно написать в модели геттер который вернет отфильтрованную в БД коллекцию
Юра
Я хз можно ли в неё добавить элементы или удалить
Юра
Не проверял
Maxim Kainov
Не сильно вчитывался в ваши прошлые холивары. Просто хотелось бы понять когда этот подход стоит использовать и стоит ли вообще
В технически простых проектах со сложной бизнес логикой это применимо. Но лучше не надо имхо )
Сергей
Так что можно написать в модели геттер который вернет отфильтрованную в БД коллекцию
А толку? в примере он добавляет к коллекции еще одну запись. А потом из-за каскадного персиста всё что нужно сохраняется. Т.е. один фиг надо в общую коллекцию добавлять, а не в отфильтрованную
Юра
Хз говорю
Юра
Может можно добавить в отфильтрованную
Maxim Kainov
https://habr.com/ru/company/jugru/blog/503868/
Юра
Правда тогда коллекция становится неаалидной ибо в ней могут появиться элементы которые не попадают под критерии
Юра
Вообщем надо проверять
Юра
Доктрина трекает ссылки ей пофигу га коллекции
Юра
Главное чтобы овнинг сайд был обновлен
Юра
Хотя мож я несу пургу
Юра
)
Юра
Доктрина короче загадочная
Anonymous
Микросервис это небольшое приложение, смысл туда тащить этот оверхед.
Бля, тут уже объясняли несколько раз почему это вполне себе вариант
Maxim Kainov
Где объясняли
Ilya 🃏
Привет, погружаюсь тут в queryBuilder и нигде не могу найти, можно ли так делать?