Konstantin
а почему так - вопрос риторический, это нужно чтобы можно было импортить неизвестные классы, а потом в рантайме проверять из через чот типа class_exists
Konstantin
я чуть позже проверю так ли это действительно, или у вас инспекция нужная почему-то отключена
Konstantin
симфони саппорт точно не про это
Konstantin
я просто ничего не выключаю кроме спеллчекера, поэтому у меня довольно ванильный набор. я считаю что должно такое подсвечивать
Konstantin
еще у меня разрабы любят русскую букву "с" вмето латинской куда-то вкрячить, а потом героически два дня дебажить полмира чтобы это выловить
Gleb
Вот даже по подсветке. Gedmo ещё не поставил, репозиторий специально сейчас снёс файл.
А Orm не ругается.
Gleb
Хотя warning выдал на Mapping namespace. Но вроде в какой-то момент его не было.
Konstantin
прикольно, на мой взгляд это баг
Юра
Сделай invalidate cache and restart
Konstantin
надо понять, регистрозависимый ли автолоадер композера (или это зависит от текущей ФС)
Denis
Denis
Konstantin
так речь про импорт
Gleb
Denis
Ну с точки зрения ide да, должно бы подсвечиваться. Но периодически сам с таким сталкиваюсь. Аттрибуты прописаны, но не отрабатывают. Потому что не импортированы
Gleb
Gleb
Хотя вроде как и аннотации тоже не обязательная информация... :-/
Denis
Потому что аннотации тот ещё костыль... По сути да, комментарий, который принудительно парсят и обрабатывают
Юра
Ну тогда через ctrl+n вбей название класса и путь пхп шторм его найдет
Юра
Скорее всего он у тебя есть
Gleb
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-рутов выводить?)
Anton
Konstantin
согласен. но он совсем недавно научился показывать что класс в файле не соответствует psr4 (ну типа класс лежит в папке, которая отличается от неймспейса). тоже казалось бы что там делать, а однако
Konstantin
или автокомплита по неймспейсу до сих пор нет, что жутко бесит: создал новый файл Foo.php в src/Bar, а неймспейс пишешь руками как дурак, хотя коню понятно, что ну сгенери ты namespace App\Foo;
Юра
А ты создай новый класс
Юра
Тогда неймсейс прописывается
Konstantin
там есть еще случай когда ты файловую иерархию поменял, шторм начинает подсвечивать "у вас тут неймспейс кривой", а поправить сам, сука, не может
Юра
А ты меняй файловую систему через рефактое
Konstantin
бесит)
Юра
Refactor - Move directory
Aleksander
всем привет!
подскажите, в доках, в примерах конфигов на пхп, вот такое встречается, это откуда или что подразумевается?
Eldar
Aleksander
Ну типа на скрине написано что это провайдер интеграции с твитером
ну AcmeSocialConfig - типа какой то "наш", хотя и тут не понятно где его брать ил икак описывать и почему в таком неймспейсе
а про FrameworkConfig - тут уже точно не про "наше" а именно задаётся конфиг для бандла framework(?), с виду, будто должен быть такой класс, а его нет...
Aleksander
ну и в PhpFileLoader хардкодно лишь ContainerConfigurator
Aleksander
дока устаревшая или я чего не понимаю?)
Aleksander
типа вот таких методов было бы полезно
Gleb
Юра
Так вроде симфа рекоммендует коныигурировать
Юра
Потому что типобезопасно
Александр 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
Александр II
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 ...
Александр II
Gleb
А подскажите, пожалуйста ещё момент, больше архитектурный. Опыта маловато ещё до конца тему постичь.
Как всё-таки принято разделять код по Repository и Manager?
В manager тот код, который не привязан к базе, а в repository тот, где уже уже запросы с queryBuilder?
Nikolay
Gleb
Когда идёт разбивка, к примеру, User Entity, User Manager, User Repository.
Nikolay
Gleb
Тот код который видел я, там различные варианты CRUD и из него дергается repository местами. Предполагаю что это что-то про слои, но я не сильно давно с этим, в голове каша ещё.
Nikolay
Юра
Это видимо бизнес логика
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'ки и пока не прочитал(
Nikolay
Konstantin
ну щас - да, а потом кеширование-логгирование-права сверху накрутятся и норм код будет
Konstantin
в плане понятное разделение где репозиторий, где сервис
Gleb
Но при этом в manager встречается
$this->entityManager->persist($user);
$this->entityManager->flush();
Сначала думал что понял и это как отдельный слой, что бы не привязываться к доктрине, потом по этим строчкам кода понял что не понимаю. 😄
Юра
Энтити менеджер управляет энтитями, юзер менеджер управляет юзерами
Юра
Что непонятно
Nikolay
Nikolay
Gleb
Gleb
нет, репозиторий их хранит и дает к ним доступ. Верно?