Михаил
Ещё я храню по такому принципу автодополнения Сами items для автодополнения хранятся на сервере в бд, и они периодически меняются. каждый раз запрашивать их с сервера (около 10 тысяч строк) или во время ввода делать запросы - не комильфо. А раз в несколько минут в пределах активности или при старте работы получить обновления - это дёшево
Vlad
А лучше по ивентам получать изменения и лишний раз не делать запрос, если ты уже окунулся в это все
Vlad
Один фиг тебе нужны риалтайм события на изменения для актуализации кэша + при каждой инициализации запрос новых данных или вообще данных.
Vlad
Главное не забывай подчищать хрнилище
Михаил
Колесо сансары провернулось
Михаил
Забейте, спасибо за советы
Юра
Есть вообще специальные библиотеки для джс в которых есть реализация offline first
Юра
Они хранят на клиенте данные
Юра
В твоём случае ощущение не понятно все равно в чем проблема. У тебя что глобальный один updated_at с которым ты сравниваешь?
Михаил
Виктор
Всем привет! Продолжаю изучать Symfony)) У меня есть сущность фотоальбома (Album) и фотографии (Photo). Есть контроллер AlbumController. В нём есть методы для корневого альбома (маршрут /album), произвольного (/album/{slug}), а также для последних (/album/recent) и случайных (/album/random) фотографий. Вопрос же касаются того, как правильно реализовать последние два. Возьмём, для примера, последние добавленные фотографии (/album/recent). У меня на данный момент следующая идея (код ниже). Нормально ли вообще так делать - динамически создавать сущность для такой задачи? Или есть способы получше? Такой подход аргументирую тем, что можно использовать уже имеющийся код и работать как с обычным альбомом, чем оно по сути и является. С другой стороны, боюсь, что потом вылезут подводные камни (например, пока не касался пагинации вообще, поэтому не могу быть уверен, а не возникнет ли там проблем). В общем, есть какие-то общепринятые практики для таких вещей? Везде же есть "последние комментарии", всякие ленты новостей и т.п. #[Route('/album/recent', name: 'recent_album')] public function recent(AlbumRepository $albumRepository): Response { $album = new Album(); $album->setTitle('Последние обновления'); $album->setDescription('Последние добавленные фотографии и фотоальбомы.'); $album->setParent($albumRepository->findRoot()); $album->setPublishedAt(new \DateTimeImmutable()); $album->setModifiedAt(new \DateTimeImmutable()); $album->setSlug('recent'); $recentAlbums = $albumRepository->findRecent(24); foreach ($recentAlbums as $recentAlbum) { $album->addChildAlbum($recentAlbum); } return $this->render('album/index.html.twig', [ 'controller_name' => 'RecentAlbumController', 'album' => $album, 'breadcrumbs' => [] ]); }
Vlad
Всем привет! Продолжаю изучать Symfony)) У меня есть сущность фотоальбома (Album) и фотографии (Photo). Есть контроллер AlbumController. В нём есть методы для корневого альбома (маршрут /album), произвольного (/album/{slug}), а также для последних (/album/recent) и случайных (/album/random) фотографий. Вопрос же касаются того, как правильно реализовать последние два. Возьмём, для примера, последние добавленные фотографии (/album/recent). У меня на данный момент следующая идея (код ниже). Нормально ли вообще так делать - динамически создавать сущность для такой задачи? Или есть способы получше? Такой подход аргументирую тем, что можно использовать уже имеющийся код и работать как с обычным альбомом, чем оно по сути и является. С другой стороны, боюсь, что потом вылезут подводные камни (например, пока не касался пагинации вообще, поэтому не могу быть уверен, а не возникнет ли там проблем). В общем, есть какие-то общепринятые практики для таких вещей? Везде же есть "последние комментарии", всякие ленты новостей и т.п. #[Route('/album/recent', name: 'recent_album')] public function recent(AlbumRepository $albumRepository): Response { $album = new Album(); $album->setTitle('Последние обновления'); $album->setDescription('Последние добавленные фотографии и фотоальбомы.'); $album->setParent($albumRepository->findRoot()); $album->setPublishedAt(new \DateTimeImmutable()); $album->setModifiedAt(new \DateTimeImmutable()); $album->setSlug('recent'); $recentAlbums = $albumRepository->findRecent(24); foreach ($recentAlbums as $recentAlbum) { $album->addChildAlbum($recentAlbum); } return $this->render('album/index.html.twig', [ 'controller_name' => 'RecentAlbumController', 'album' => $album, 'breadcrumbs' => [] ]); }
такое делают просто сортировкой по дате создания или изменения
Михаил
Всем привет! Продолжаю изучать Symfony)) У меня есть сущность фотоальбома (Album) и фотографии (Photo). Есть контроллер AlbumController. В нём есть методы для корневого альбома (маршрут /album), произвольного (/album/{slug}), а также для последних (/album/recent) и случайных (/album/random) фотографий. Вопрос же касаются того, как правильно реализовать последние два. Возьмём, для примера, последние добавленные фотографии (/album/recent). У меня на данный момент следующая идея (код ниже). Нормально ли вообще так делать - динамически создавать сущность для такой задачи? Или есть способы получше? Такой подход аргументирую тем, что можно использовать уже имеющийся код и работать как с обычным альбомом, чем оно по сути и является. С другой стороны, боюсь, что потом вылезут подводные камни (например, пока не касался пагинации вообще, поэтому не могу быть уверен, а не возникнет ли там проблем). В общем, есть какие-то общепринятые практики для таких вещей? Везде же есть "последние комментарии", всякие ленты новостей и т.п. #[Route('/album/recent', name: 'recent_album')] public function recent(AlbumRepository $albumRepository): Response { $album = new Album(); $album->setTitle('Последние обновления'); $album->setDescription('Последние добавленные фотографии и фотоальбомы.'); $album->setParent($albumRepository->findRoot()); $album->setPublishedAt(new \DateTimeImmutable()); $album->setModifiedAt(new \DateTimeImmutable()); $album->setSlug('recent'); $recentAlbums = $albumRepository->findRecent(24); foreach ($recentAlbums as $recentAlbum) { $album->addChildAlbum($recentAlbum); } return $this->render('album/index.html.twig', [ 'controller_name' => 'RecentAlbumController', 'album' => $album, 'breadcrumbs' => [] ]); }
Я бы сделал какой нибудь AlbumViewContext и 2 статических метода AlbumViewContext::createFromAlbum($album); и AlbumViewContext::createRecent(…whatever…); А уже эти контексты передавать на рендер. Как плюс - ты явно разделяешь слои модели и представления.
Михаил
Или сделать какой/нибудь AlbumPresenter и тоже самое. Короче у тебя будет какой нибудь слой который будет заниматься производством представлений доменных или любых других сущностей.
Виктор
такое делают просто сортировкой по дате создания или изменения
Я упустил деталь в прошлом сообщении. У меня древовидная структура галереи, а не один альбом. Впрочем, метод репозитория findRecent как раз и сортирует по дате.
Михаил
Спасибо за рекомендацию, звучит логично. Попробую реализовать.
Просто фактически у тебя проблема с первым слоем альбомов, ну так пусть это будет какой-то дао Если боишься потерять поля или забыть поменять поля, то можешь и альбом и эту dao положить под один интерфейс
Dmitry
Ребят, привет, кто занимался созданием своего корпоративного мессенджера? использовали готовое решение или писали свое ?
Владимир
Ребят, привет, кто занимался созданием своего корпоративного мессенджера? использовали готовое решение или писали свое ?
Rocket.chat как-то использовали в одном проекте. Он хостится отдельно, а мы на него по rest/websocket стучались из приложения, свой "фасад" написали, чтобы фильтровать кастомно и т.д.
Dmitry
Готовый
закинь че юзали чтоле
Владимир
а скок платите ?
Я хз, это была года 2 назад, я уже в другой компании 😅 Но, вроде как, там есть open source дистрибуция, поставил на машину у себя и все Платно это облако
Владимир
Но это не точно. Мб правила изменились и т.д. Надо углубляться и посмотреть
Михаил
закинь че юзали чтоле
Ну поищи селфхостед решения Уже предложили рокет чат, есть ещё Mattermost
Михаил
закинь че юзали чтоле
а вообще фришная система, где можно созваниваться, писать сообщения втч и в тредах, чисто голосом поговорить это discord
Михаил
закинь че юзали чтоле
Есть от тинькова альтернатива слаку - TiMe, но вцелом ничем особо не отличается
Vlad
закинь че юзали чтоле
я попробую вспомнить, там что то слекоподобное было
Михаил
Да даже вспоминать не нужно, вот ссылка на 25 альтернатив https://alternativeto.net/software/slack/?platform=self-hosted
Dmitry
а вообще фришная система, где можно созваниваться, писать сообщения втч и в тредах, чисто голосом поговорить это discord
это заебись да, но я ща по требования пытаюсь подогнать это все, чаты должны создаваться с предопределенными пользователями, в зависимости от бизнес логики на бэке... типо создается контракт по заказу - сразу создается чат с ответсвенными по этому контракту и туда еще 100 проц нужен бух + дирик и тд
Vlad
У меня одного такой прикол или доктрина 3 не считывает precision для TIMESTAMP когда миграции генерит для постгрес?
Dmitry
А, ну так это не корпоротивный чат, ищи что-то из этой именно области
но все это называют это чатом, просто сильно наворочен и приложуха у него должна быть и меж сервисами должен синкать инфу... немного не понял, про "ищи что-то этой именно области"
Vlad
как объявлял?
та пакет карбона стоит и его кастомный тип, там указываетя тип TIMESTAMP(6) WITH TIME ZONE и вот на днях обновил проект до 7 симфы и 3 доктрины и теперь при генерации миграций каждый раз пытается сменить на TIMESTAMP(6) WITH TIME ZONE, так как определеняет как TIMESTAMP(0) WITH TIME ZONE
Vlad
у нас так же и всё работатет
какая версия орм и dbal?
Михаил
какая версия орм и dbal?
да какая то там не шибко новая
Vlad
да какая то там не шибко новая
ну вот у меня в последней так стало dbal 4.0.1 orm 3.1.1
Михаил
Мы как то так объявляли class DateTimeWithMicroseconds extends VarDateTimeImmutableType { private const TYPE_NAME = 'datetime_with_ms'; public function getSQLDeclaration(array $column, $platform): string { // если мускул или погрез return 'TIMESTAMP(6) WITHOUT TIME ZONE'; // иначе } public function convertToDatabaseValue($value, $platform): mixed { if ($value === null || $plaform instanceof [PostgeSqlPlatform, MySQLPlatform]) { return $value->format(sprintf('%s.u', $platform->getDateTimeFormatString())); } return $parent::convertToPHPValue(...); } public function getName(): string { return self::TYPE_NAME; } public function requiresSQLCommentHint(AbstractPlatform $platform): bool { return true; } }
Михаил
ну во, потом регистрируем в дактрине и всё работает как шанель
Denis
Всем привет Ректором перевел Аннотации на аттрибуты, теперь ошибка не понятная, кто сталкивался с таким? Symfony 5.4, "doctrine/orm": "^2.11"
Vlad
ну во, потом регистрируем в дактрине и всё работает как шанель
А там проблема именно в том как определяет доктрина, она запрашивает тип из бд и возвращает всегда с 0
Михаил
Там у каждого мапа должен быть тип attribute. Или должен быть включён auto_mapping в doctrine.orm
Denis
Посмотри что у тебя в doctrine.orm.mappings
php bin/console doctrine:cache:clear-metadata - это тоже делал
Михаил
php bin/console doctrine:cache:clear-metadata - это тоже делал
Убери автомаппинг посмотри что будет?
Михаил
Тоесть сторонних бандлов нет, хорошо
Михаил
Снеси полностью папку var
Михаил
(Внутри проекта)
Михаил
ничего не изменилось
А, стоп, убери значит на false переведи. Ну и посмотри как у тебя другие бандлы регестрируются
Михаил
Я просто не знаю какие у тебя бандлы есть, но я знаю что бандлы могу сами себя в доктрине конфигурировать.
Doctor
<offtop> Бандлы не по алфавиту? Грешновато... </offtop>
Михаил
Просто непонятно что именно ректор сделал. Вообще ошибка странная. При неправильной конфигурации будет ошибка что «не нашёл entity manager»
Михаил
Ты под гитом же выполнял миграцию? Может он где-то наговнокодил
Denis
Ты под гитом же выполнял миграцию? Может он где-то наговнокодил
да под гитом, ну ректор в общем там перевел все аннотации типа /** * @Assert\Email(message="Invalid email.") * @Assert\NotBlank(message="Email is required.") */ в #[Assert\Email(message: 'Invalid email.')] #[Assert\NotBlank(message: 'Email is required.')] файлов штук 30 entities
Михаил
Посмотри по изменениям, если ректор менял комментарии то он мог что-то сломать
Михаил
Вот, а ошибка у тебя «неизвестная константа» Это может произойти если ректор сделал к примеру вот так #[ORM\Entity(doctrine)]
Михаил
git diff | grep doctrine
Михаил
Вообще эти аттрибуты сосут жопу. Когда они появились я несколько раз сталкивался с segmentation fault. Искать их причину - то ещё удовольствие. Особенно когда они в аттрибутах. Написал вместо false - flase, и понеслось. Пару часов увлекательного дебага и составления репорта.
Михаил
Ещё увлекательней когда ты ловишь сегмы из-за рефлексии
Denis
git diff | grep doctrine
спасибо ! это реально помогло ректор перевел такое * @ORM\CustomIdGenerator(class="doctrine.ulid_generator") в #[ORM\CustomIdGenerator(class: \doctrine.ulid_generator::class)] и изза этого была ошибка!
Михаил
Doctor
😢
Михаил
😢
Phpstan только года 2 назад начал нормально что-то находить. Php cs у меня может максимум выругаться на отсутстие \n в конце файла, но это может моя вина, его настраивать - боль
Михаил
А ты не юзаешь какой-нибудь CSFixer или PHPStan?
А, и я юзаю их оба. Не заметил «не» в предложении
Dmitry
Вот именно в таком юзкейсе и юзали рокетчат Норм было, правда с огрехами на отказоустойчивость и т.д.нужно продумывать
короче откинули это решение,так как дорого выйдет 100 пользователей и нет возможности треда в треде создать и в нем чтобы еще тред был
Spider
Коллеги подскажите как правильно использовать окружение симфы они для докера которое приведено на сайте симфы(https://symfony.com/doc/current/setup/docker.html) Не очень ясна логика - надо ли и как пробрасывать файлы проекта которые будешь редактировать? Или тут логика такая что написал проект собрал образ и тестируешь?
Spider
вот это - линк взят из документации симфы https://github.com/dunglas/symfony-docker
Михаил
Ну судя по проекту - сам симфони проект должен быть внутри, то есть это просто каркас. Добавляешь папку app и внутри неё проект
Михаил
А не, вру
Михаил