«phpClub» — архив тем ("тредов"), посвящённых изучению PHP и веб-технологий.
Аноним 2018/01/10 07:43:03  №1118055 1
15155593839730.png (176, 1355x687)
687x1355
Переношу роуты из аннотаций в yaml. Почему-то для классов Request и Tag ничего не требуется, но вот PaginatorInterface нужно описать в роутере (наверное, потому что интерфейс). В документации подобных проимеров не нашел, пытался всунуть с помощью requirements и defaults, но не вышло. Как в роутере прописать, что требуется объект такого-то класса?
Ответы: >>1118135 >>1118551
Аноним 2018/01/10 08:03:52  №1118056 2
Это снова я, почему меня не выводится случайного слова из первого подмассива?
https://ideone.com/SQwBre
Ответы: >>1118057
Аноним 2018/01/10 08:04:28  №1118057 3
>>1118056
Ой бля, в глаза ебусь.
Ответы: >>1118058
Аноним 2018/01/10 08:05:15  №1118058 4
Ответы: >>1118551
Аноним 2018/01/11 04:39:01  №1118551 5
>>1118058

> $rand_keys = array_rand($words['word1'], 1);
Читай мануал http://php.net/manual/ru/function.array-rand.php

Если ты указал, что тебе нужен 1 ключ, то array_rand вернет не массив с 1 элементом, а сам ключ.

Это, кстати, пример неудачного проектирования функции. Лучше, когда функция всегда возвращает результат одного типа, если массив - то всегда массив. Как видишь, выбранный разработчиками PHP подход приводит к ошибкам. Не бери с них пример.

>>1118055

Увы, тут наверно надо лезть в код Симфони (может быть HttpKernel?), чтобы понять, почему. За создание и вызов контроллера отвечает HttpKernel в компоненте http-kernel. Напомню, что компонент - это независимая от Симфони библиотека, и в Симфони настройки для этого компонента (в том числе аргументы для сервисов) задаются в бандле https://github.com/symfony/framework-bundle

- https://symfony.com/doc/current/components/http_kernel.html
- https://github.com/symfony/http-kernel/blob/master/HttpKernel.php#L132
- https://github.com/symfony/http-kernel/blob/master/Controller/ControllerResolver.php#L33
- https://github.com/symfony/http-kernel/blob/master/Controller/ArgumentResolver.php

Мы видим, что поведение HttpKernel и резолверов определяется тем, с какими аргументами они были созданы. Потому мы должны открыть исходники FrameworkBundle и найти место, где создаются объекты этих классов. В данном случае они опсианы в конфиге DI контейнера как сервисы (если ты не знаком с DI контейнером в Симфони, то познакомься):

- https://github.com/symfony/framework-bundle/blob/master/Resources/config/services.xml#L21

Здесь мы видим отсылку к сервису argument_resolver. Поищем его определение и код:

- https://github.com/symfony/framework-bundle/search?utf8=%E2%9C%93&q=argument_resolver&type=
- https://github.com/symfony/framework-bundle/blob/8089ce7d84e6fd96531b0b2fab20977b7b7b968e/Resources/config/web.xml#L24
- https://github.com/symfony/http-kernel/blob/master/Controller/ArgumentResolver.php

Вторым аргументом в конструкторе указано

> iterable $argumentValueResolvers = array()

Но в описании сервиса там нет значений, лишь строка

> <argument /> <!-- argument value resolvers -->

А ниже мы видим странные сервисы:

> <service id="argument_resolver.request_attribute
> <service id="argument_resolver.request"
....

Это неспроста. Используя опыт и интуицию, я открыл главный класс бандла, чтобы посмотреть, что именно бандла делает, на какие события подписывается, как вмешивается в процесс конфигурации, и не прогадал:

https://github.com/symfony/framework-bundle/blob/8089ce7d84e6fd96531b0b2fab20977b7b7b968e/FrameworkBundle.php

> $container->addCompilerPass(new RegisterControllerArgumentLocatorsPass());
> $container->addCompilerPass(new ControllerArgumentValueResolverPass());

Бандл добавляет свои этапы в процесс компиляции контейнера на основе конфигов бандлов и конфигов пользователя (прочитай про это, если не знаешь). Если мы посмотрим эти классы, то увидим:

https://github.com/symfony/http-kernel/blob/master/DependencyInjection/ControllerArgumentValueResolverPass.php

Этот класс при сборке контейнера находит сервисы, помеченные определенным тегом, и добавляет массив их как аргумент для arguments_resolver.

Второй класс, влияющий на ход сборки контейнера - это https://github.com/symfony/http-kernel/blob/master/DependencyInjection/RegisterControllerArgumentLocatorsPass.php

Предлагаю тебе самому изучить все перечисленные ссылки и попробовать найти причину проблемы. Если не найдешь - пиши.

Это тяжело поначалу, но поможет тебе всерьез разобраться в Симфони.