Konstantin
а почему так - вопрос риторический, это нужно чтобы можно было импортить неизвестные классы, а потом в рантайме проверять из через чот типа class_exists
Konstantin
даже предупреждений не было
а запилите ишую им, это должно быть багом
Konstantin
я чуть позже проверю так ли это действительно, или у вас инспекция нужная почему-то отключена
Gleb
я чуть позже проверю так ли это действительно, или у вас инспекция нужная почему-то отключена
Вот это может быть. Я пока ещё не сильно постиг шторм. Но скорее не включена, чем выключена. Symfony Support стоит.
Konstantin
симфони саппорт точно не про это
Konstantin
я просто ничего не выключаю кроме спеллчекера, поэтому у меня довольно ванильный набор. я считаю что должно такое подсвечивать
Konstantin
еще у меня разрабы любят русскую букву "с" вмето латинской куда-то вкрячить, а потом героически два дня дебажить полмира чтобы это выловить
Gleb
Вот даже по подсветке. Gedmo ещё не поставил, репозиторий специально сейчас снёс файл. А Orm не ругается.
Gleb
Хотя warning выдал на Mapping namespace. Но вроде в какой-то момент его не было.
Konstantin
прикольно, на мой взгляд это баг
Юра
Сделай invalidate cache and restart
Konstantin
надо понять, регистрозависимый ли автолоадер композера (или это зависит от текущей ФС)
Konstantin
так речь про импорт
Gleb
надо понять, регистрозависимый ли автолоадер композера (или это зависит от текущей ФС)
В данной ситуации ФС ext4 и соответственно регистрозависима.
Denis
Ну с точки зрения ide да, должно бы подсвечиваться. Но периодически сам с таким сталкиваюсь. Аттрибуты прописаны, но не отрабатывают. Потому что не импортированы
Gleb
Потому что атрибуты - дополнительная необязательная информация. Не интерпретировались как надо и фиг с ней
Кстати да, попробовал на аннотациях. Там сразу ошибка импорта Doctrine\Orm\Mapping\Table
Gleb
Хотя вроде как и аннотации тоже не обязательная информация... :-/
Denis
Потому что аннотации тот ещё костыль... По сути да, комментарий, который принудительно парсят и обрабатывают
Gleb
Сделай invalidate cache and restart
Вот кстати и ворнинга по этому поводу нет после сброса кэша. Gedmo уже поставил. Репозиторий специально снёс.
Юра
Ну тогда через ctrl+n вбей название класса и путь пхп шторм его найдет
Юра
Скорее всего он у тебя есть
Gleb
Похоже всё-таки не допилили атрибуты с обеих сторон. Шторм по поводу подсветки ошибки. А по доктрине-симфони, что не валят ошибку как на аннотациях.
Gleb
Спасибо всем большое! разобрался хоть с этой темой немного больше.)
Konstantin
короче, это проблема в пхп. в нем неймспейсы нерегистрозависимы, а вот композер - да
Konstantin
$ cat bar.php <?php declare(strict_types=1); namespace Foo; class Bar {}
Konstantin
$ cat foo.php <?php declare(strict_types=1); include 'bar.php'; $x = new FOO\BAR(); var_dump($x);
Konstantin
$ php foo.php object(Foo\Bar)#1 (0) { }
Konstantin
то есть самому пхп похрену в каком регистре вы пишете неймспейсы, а вот композер генерит классмап уже регистрозависимый: $ cat vendor/composer/autoload_psr4.php <?php // autoload_psr4.php @generated by Composer $vendorDir = dirname(dirname(__FILE__)); $baseDir = dirname($vendorDir); return array( 'phpDocumentor\\Reflection\\' => array($vendorDir . '/phpdocumentor/reflection-common/src', $vendorDir . '/phpdocumentor/reflection-docblock/src', $vendorDir . '/phpdocumentor/type-resolver/src'), 'Webmozart\\Assert\\' => array($vendorDir . '/webmozart/assert/src'), 'Wa72\\HtmlPageDom\\' => array($vendorDir . '/godbout/htmlpagedom/src'), 'Twig\\Extra\\Intl\\' => array($vendorDir . '/twig/intl-extra'), 'Twig\\' => array($vendorDir . '/twig/twig/src'),
Konstantin
короче, на мой вкус, это косяк шторма, что он не имеет более тесной интеграции с композером. но там она вообще до сих пор не идеально сделана (почему до сих пор шторм не может автоматически неймспейс для пср4-рутов выводить?)
Konstantin
согласен. но он совсем недавно научился показывать что класс в файле не соответствует psr4 (ну типа класс лежит в папке, которая отличается от неймспейса). тоже казалось бы что там делать, а однако
Konstantin
или автокомплита по неймспейсу до сих пор нет, что жутко бесит: создал новый файл Foo.php в src/Bar, а неймспейс пишешь руками как дурак, хотя коню понятно, что ну сгенери ты namespace App\Foo;
Юра
А ты создай новый класс
Юра
Тогда неймсейс прописывается
Konstantin
там есть еще случай когда ты файловую иерархию поменял, шторм начинает подсвечивать "у вас тут неймспейс кривой", а поправить сам, сука, не может
Konstantin
А ты создай новый класс
но да, норм совет, попробую переучиться на это
Юра
А ты меняй файловую систему через рефактое
Konstantin
бесит)
Юра
Refactor - Move directory
Aleksander
всем привет! подскажите, в доках, в примерах конфигов на пхп, вот такое встречается, это откуда или что подразумевается?
Aleksander
Ну типа на скрине написано что это провайдер интеграции с твитером
ну AcmeSocialConfig - типа какой то "наш", хотя и тут не понятно где его брать ил икак описывать и почему в таком неймспейсе а про FrameworkConfig - тут уже точно не про "наше" а именно задаётся конфиг для бандла framework(?), с виду, будто должен быть такой класс, а его нет...
Aleksander
ну и в PhpFileLoader хардкодно лишь ContainerConfigurator
Aleksander
дока устаревшая или я чего не понимаю?)
Aleksander
типа вот таких методов было бы полезно
Gleb
всем привет! подскажите, в доках, в примерах конфигов на пхп, вот такое встречается, это откуда или что подразумевается?
Что-то мне кажется что это специальный дефолтный класс для конфигов бандла на php. Для yaml вроде не используется.
Gleb
типа вот таких методов было бы полезно
это же просто аналог yaml framework: messenger: default_bus: 'command.bus' или как-то так. Смысл отдельно в таких методах?
Юра
Так вроде симфа рекоммендует коныигурировать
Юра
Потому что типобезопасно
Александр II
есть 2 докер файла 1 - php 2 - nginx билдил статику в файле nginx (копировал в контейнер с нодой нужные файлы, билдил и потом копировал их уже в контейнер nginx) проблема в том, что падает приложение, потому что в контейнере php ему нужны 2 файла: entrypoints.json manifest.json какие варианты есть, кроме как вынести все в 1 докер файл и там все билдить и раскидывать нашел еще в интернете сделать вариант - сделать эти файлы через nginx доступные и через # config/packages/assets.yaml framework: assets: json_manifest_path ссылаться по ссылке (как по мне, не очень удобно) есть еще варианты?
Dmitry
Ну это получается в 1 докерфайле делать нужно будет
В двух одинаковое начало: nginx/Dockerfile FROM node AS builder ... RUN npm build FROM nginx COPY --from=builder ... php-fpn/Dockerfile FROM node AS builder ... RUN npm build FROM php:fpm COPY --from=builder ...
Gleb
А подскажите, пожалуйста ещё момент, больше архитектурный. Опыта маловато ещё до конца тему постичь. Как всё-таки принято разделять код по Repository и Manager? В manager тот код, который не привязан к базе, а в repository тот, где уже уже запросы с queryBuilder?
Gleb
Когда идёт разбивка, к примеру, User Entity, User Manager, User Repository.
Gleb
Тот код который видел я, там различные варианты CRUD и из него дергается repository местами. Предполагаю что это что-то про слои, но я не сильно давно с этим, в голове каша ещё.
Юра
Это видимо бизнес логика
Gleb
Разделение на слои. Из за которого CRUD в общем виде, и с конкретикой queryBuilder.
Юра
Степень разделения зависиь от размера проекта
Юра
От количества планируемых логических модулей которые бужут между собой общаться
Юра
Наверное тут ты либо как-то сам интуитивно приходишь к этому, либо читаешь DDD и прочие Энтерпрайз практики
Юра
И потом пишешь dto на dto через фабрику абстрактных сервисов )
Gleb
Вот пример В manager лежит public function getUsers(int $page, int $perPage): array { /** @var UserRepository $userRepository */ $userRepository = $this->entityManager->getRepository(User::class); return $userRepository->getUsers($page, $perPage); } в repository public function getUsers(int $page, int $perPage): array { $qb = $this->getEntityManager()->createQueryBuilder(); $qb->select('t') ->from($this->getClassName(), 't') ->orderBy('t.id', 'DESC') ->setFirstResult($perPage * $page) ->setMaxResults($perPage); return $qb->getQuery()->getResult(); } PS: Вон Вернона начинал читать, потом пришлось снова вернутся на cms'ки и пока не прочитал(
Konstantin
ну щас - да, а потом кеширование-логгирование-права сверху накрутятся и норм код будет
Konstantin
в плане понятное разделение где репозиторий, где сервис
Gleb
Но при этом в manager встречается $this->entityManager->persist($user); $this->entityManager->flush(); Сначала думал что понял и это как отдельный слой, что бы не привязываться к доктрине, потом по этим строчкам кода понял что не понимаю. 😄
Юра
Энтити менеджер управляет энтитями, юзер менеджер управляет юзерами
Юра
Что непонятно
Gleb
нет, репозиторий их хранит и дает к ним доступ. Верно?