Все сервисы Хабра

Сообщество IT-специалистов

Ответы на любые вопросы об IT

Профессиональное развитие в IT

Удаленная работа для IT-специалистов

Войти на сайт
  • Все вопросы
  • Все теги
  • Пользователи

Хабр Q&A — вопросы и ответы для IT-специалистов

Получайте ответы на вопросы по любой теме из области IT от специалистов в этой теме.

Узнать больше
другие проекты хабра
  • Хабр
  • Карьера
  • Фриланс
Задать вопрос
prototype_denis

Денис

Symfony
  • 258
    вклад
  • 4
    вопроса
  • 377
    ответов
  • 40%
    решений
Ответы
  • Информация
  • Ответы
  • Вопросы
  • Комментарии
  • Подписки
  • Нравится
  • Достижения
  • Куда утрачивается ссылка на параметр в методе?

    prototype_denis
    Денис @prototype_denis
    Symfony
    <?php
    
    declare(strict_types=1);
    
    class A {
        public $property = 'foo';
    }
    class B {
        public $property = 'foo';
    }
    
    $a = new A();
    $b = new B();
    
    function byIdentifier($object) {
        $object->property = 'bar';
        $object = null;
    }
    
    function byReference(&$object) {
        $object->property = 'bar';
        $object = null;
    }
    
    byIdentifier($a); 
    byReference($b);
    
    var_dump($a); // class A#2 { public $property => string(3) "bar" }
    var_dump($b); // NULL


    Это ни разу не аномалия...

    Вас сбивает с толку слово объект и фраза что они всегда передаются по ссылке.

    И да и нет. Объекты действительно всегда передаются по ссылке, но в метод летит не объект, а "алиас" на значение. С амперсандом кол-во "алиасов" на данные не измениться и в методе вы можете переопределить, как значение, так и этот "алиас"

    Другой пример

    <?php
    
    declare(strict_types=1);
    
    $array = ['foo'];
    
    foreach ($array as &$item) {
        $item = $array;
    }
    $item = 'string';
    
    \var_dump($array);


    $array останется массивом, но если написать `$item = &$array;` то станет строкой.

    Тут дело в том, что в первом случае у нас две копии "алиасов" на данные, а во втором один. И изменяя после foreach $item - мы изменяем копию. Ну а если прировнять по ссылке, то изменим данные и массив станет строкой.

    Я попробовал работать без ссылки и возвращать $storage, проблема уходит, но это не вариант.


    ...и далее сами себе противоречите

    В вашем случае амперсанд не нужен - ну вот вообще не нужен, потому что вы работаете с объектом и меняете объект. У вас не массив или скаляр, где он, возможно был бы необходим. Поймите, передавая что-то с амперсандом вы влияете не только на значение, но и на количество ссылок на данные в PHP позволяя налету менять не данные, а сам "алиас"

    Алиас - более верное название для указателя в PHP

    Всё это описано тут https://www.php.net/manual/ru/language.references.php - просто нужно немного разобраться самому )))
    Ответ написан более трёх лет назад
    Комментировать
    Комментировать
  • Как передать объект с параметром в Service Container?

    prototype_denis
    Денис @prototype_denis
    Symfony
    Если не используете trikoder/oauth2-bundle

    parameters:
        date_interval: 'PT3600S'
    
    services:
        date_interval:
            class: DateInterval
            arguments:
                - '%date_interval%'
    
        League\OAuth2\Server\AuthorizationServer:
            calls:
                - method: enableGrantType
            arguments:
                - '@League\OAuth2\Server\Grant\PasswordGrant'
                - '@date_interval'


    Если используете, то данное значение настраивается в конфигурации пакета https://github.com/trikoder/oauth2-bundle/blob/v2....
    Ответ написан более трёх лет назад
    3 комментария
    3 комментария
  • Как в symfony 3.4 вывести и отправить форму для сущности в списке сущностей?

    prototype_denis
    Денис @prototype_denis
    Symfony

    Здравствуйте, не так долго изучаю symfony


    Не буду нарушать процесс обучения готовым решением, а всего лишь подскажу.

    Гуглить по доке symfony коллекции форм (CollectionType) и темы форм (form_theme).
    Ответ написан более трёх лет назад
    1 комментарий
    1 комментарий
  • Ошибка в Symfony. Почему Vich uploader падает на production после очистки кэша?

    prototype_denis
    Денис @prototype_denis
    Symfony
    Ваш постскриптум является ответом на вопрос.

    Директория кэша и логов должна быть доступна на запись для пользователя/группы от которой работает fpm. Раз нельзя изменить юзверя, который чистит кэш - изменяйте права на директории, чтобы файлы создавались от имени группы/пользователя.
    Ответ написан более трёх лет назад
    Комментировать
    Комментировать
  • Как динамически добавить поле в форму?

    prototype_denis
    Денис @prototype_denis
    Symfony
    Поля нужно добавлять до маппинга данных, а не перед отправкой формы.

    Замените событие на PRE_SET_DATA
    Ответ написан более трёх лет назад
    1 комментарий
    1 комментарий
  • Sonata Page передать параметры в блок через контейнер?

    prototype_denis
    Денис @prototype_denis
    Symfony
    Опции пробрасываются в BlockService, соответственно необходимо в соответствующем блоке сконфигугировать кастомные опции реализовав метод configureOptions.

    https://github.com/sonata-project/SonataPageBundle...

    Выше видно, что контейнер (первый аргумент твиговой функции) и есть блок. Переопределяйте сервис блока или изменяйте уже переопределённый.
    Ответ написан более трёх лет назад
    Комментировать
    Комментировать
  • Как обновить сессию пользователя при смене роли в Symfony?

    prototype_denis
    Денис @prototype_denis
    Symfony
    Всё немного проще

    В secutiry.yaml установите значение ключа always-authenticate-before-granting в true

    https://symfony.com/doc/4.2/reference/configuratio...
    Ответ написан более трёх лет назад
    3 комментария
    3 комментария
  • Как правильно будет?

    prototype_denis
    Денис @prototype_denis
    Symfony
    1. Где вам удобнее. Аннотации это всего лишь один из способов хранения конфигурации.

    2. От ситуации. Формам нужна не сущность, а какой-нибудь клас (и то, необязательно), чтобы заммапить данные. И здесь также, как вам удобнее. Например форму для удаления, смело в контроллер, для редактирования в отдельный класс, которую можно переиспользовать.

    3. Холивара вопрос. Видел людей с пеной у рта доказывающих, что всё нужно прописывать в типах, и других, у которых формы с суммарным количеством полей переваливало за 300, где прописаны только поля... Тут также всё от ситуации. Если эта форма будет переиспользоваться, будут разные группы валидации, обработчики будет разные, то имеет смысл оставлять их минимально нагруженными и выносить всё, и наоборот, если форма крайне специфичная, то лучше не размазывать по приложению работу с онной.
    Ответ написан более трёх лет назад
    2 комментария
    2 комментария
  • Как в Symfony работать с Rest?

    prototype_denis
    Денис @prototype_denis
    Symfony
    Хотите с API работать через докрину?

    Взгляните на https://github.com/doctrine/skeleton-mapper и на пример реализации https://github.com/Coffreo/ceph-odm

    Да, придётся реализовать некоторые вещи, но вы не будете зависить от прибытых гвоздями форматов предлагаемые DoctrineRestDriver

    А только имеет ли это смысл?

    Если вам необходимо реализовать "смешанные" сущности, например у вас есть Product, а данные этого Product лежат в API - идеальным решением реализовать подгрузку данных на postLoad доктриновского события.

    Нужны объекты, а не raw данные из API? Посмотрите в сторону того же JMS или симфониевского сериалайзера, которого с головой хватает в большинстве случаев.

    Но всё это оправдано в том случае, если вам действительно нужно воткнуть работу с API под доктриновскую абстракцию...

    > Что если вообще сделать маленькую прослойку с использованием условного gazzle и в репозиториях сделать вызовы?

    Встречавшиеся мне реализации в реальных проектах - в 99% случаев именно так и поступают. (В некоторых - к сожалению, а в некоторых к счастью, потому что крайне просто поддерживать)
    Ответ написан более трёх лет назад
    1 комментарий
    1 комментарий
  • Как получить доступ к значению дополнительного поля entity в форме?

    prototype_denis
    Денис @prototype_denis
    Symfony
    https://symfony.com/doc/current/reference/forms/ty...

    ->add('color', EntityType::class, array(
        ...
        'choice_attr' => function($choiceValue, $key, $value) {
            return ['style' => ...];
        },
    ))
    Ответ написан более трёх лет назад
    3 комментария
    3 комментария
  • Как задать приоритет маршрутов (маршрутизации)?

    prototype_denis
    Денис @prototype_denis
    Symfony
    Вам нужен свой загрузчик

    https://symfony.com/doc/current/routing/custom_rou...

    Хреновым вариантом, но рабочим - ExceptionListener, который будет реагировать на 404-ые и пытаться выдернуть из базы по uri ваши пути
    Ответ написан более трёх лет назад
    1 комментарий
    1 комментарий
  • Как в symfony 4 протестировать сервис?

    prototype_denis
    Денис @prototype_denis
    Symfony
    У вас ядро не в "test" окружении.

    Либо не подхватываются переменные окружения, либо где-то перезаписывается данное значение.

    sf >= 4.1 должно быть, если память не изменяет
    Ответ написан более трёх лет назад
    Комментировать
    Комментировать
  • Как получить сервис контенер doctrine в symfony 4?

    prototype_denis
    Денис @prototype_denis
    Symfony
    Возможно помогут здесь https://github.com/krakjoe/pthreads/issues/369
    Ответ написан более трёх лет назад
    1 комментарий
    1 комментарий
  • Как вложить тег в поле формы symfony form?

    prototype_denis
    Денис @prototype_denis
    Symfony
    Переопределить тему формы для виджета _{form_name}_save_widget

    https://symfony.com/doc/current/form/form_customiz...
    Ответ написан более трёх лет назад
    2 комментария
    2 комментария
  • Почему не работает сервис в Symfony 4.2?

    prototype_denis
    Денис @prototype_denis
    Symfony
    services:
        App\Service\FileUploader:
            bind:
                $directory: 'uploads/posts'


    не arguments, а bind
    Ответ написан более трёх лет назад
    7 комментариев
    7 комментариев
  • Не могу понять для чего нужны Entities в ООП PHP, Yii?

    prototype_denis
    Денис @prototype_denis
    Symfony
    Entity - сущность. Это в первую очередь то, что реально существует. То есть это такой объект данных, у которого есть идентификатор.

    Проводя аналогию... Представьте улицу домов, у которых ещё официально нет адреса. Это набор объектов. Для вас самый левый с востока - это первый, другой с запада считает, у него первый для вас последний. То есть у объекта нет идентификатора. А вот, когда им далут адреса, то любой может определить третий дом слева, потому что есть идентификатор - это уже сущность объекта.

    И совершенно неважно как обзовут сущность в определенном фреймворке лбого языка, понятие не меняется.

    Возьмём табличку с уникальным name и неуникальным value, в которой будем хранить некий набор настроек для приложения. Каждая строка - сущность. Но вскупе, когда у нас на руках все записи - это объект, который можно представить в виде ассоциативного массива и он уже не будет являться сущностью. Это будет объект, состоящий из сущностей.

    В общем, сущность - это такой объект, у которого есть уникальный идентификатор.
    Ответ написан более трёх лет назад
    Комментировать
    Комментировать
  • Почему не работает отношение one-to-many?

    prototype_denis
    Денис @prototype_denis
    Symfony
    Доктрина "лениво" грузит коллекции. Это значит, что результаты будут только при явном обращении, то есть при итеририровании и обращении к свойствам.

    Для "жадной" загрузки в кофиге (в вашем случае аннотации) нужно прописать eager="fetch", тогда коллекция будет проинициализирована сразу же
    Ответ написан более трёх лет назад
    1 комментарий
    1 комментарий
  • Как разрабатывать модуль opencart, зависящий от сторонних пакетов, подключаемых через composer?

    prototype_denis
    Денис @prototype_denis
    Symfony
    Нет, это не плохой тон держать вендров в своём пакете, даже если и ваш пакет подключается через composer.

    Всё зависит от проблемы, котрую необходимо решить.
    В качестве примера symfony/phpunit-bridge где данный пакет, при запуске в зависимости от версии php и других параметров уставнавливает в свою директорию определённую совместимую версию phpunit и запускается...

    А так же куча других пакетов, которые хранят вендоров.

    хочется, чтобы модуль можно было устанавливать через адмику


    Я так понимаю, что загружается некий архив в админке? Если да, то смедло используйте composer archive и распространяйте данный пакет таким образом.

    Единственное, что нужно будет учесть - использовать ли автозагрузчик composer или свою обёртку, так как не только ваш пакет может работать с composer.
    Ответ написан более трёх лет назад
    Комментировать
    Комментировать
  • Как получить список всех базовых Ролей и их дочерних в Symfony 4?

    prototype_denis
    Денис @prototype_denis
    Symfony
    Иерархия ролей компонента security хранится в параметре security.role_hierarchy.roles

    $container->getParameter('security.role_hierarchy.roles');

    Но лучше использовать не роли, а группы ролей.
    Ответ написан более трёх лет назад
    Комментировать
    Комментировать
  • Как исправить ошибку "Maybe you forget to persist it in the entity manager?" во время работы формы entityType?

    prototype_denis
    Денис @prototype_denis
    Symfony
    Вам необходимо использовать CollectionType с entry_type EntityType
    Ответ написан более трёх лет назад
    1 комментарий
    1 комментарий
Оценили как «Нравится»
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • Следующие →
Самые активные сегодня
  • Isafu
    Isafu-
    • 5 ответов
    • 0 вопросов
  • Mike_Ro
    Михаил Р.
    • 4 ответа
    • 0 вопросов
  • rPman
    • 3 ответа
    • 0 вопросов
  • Everything_is_bad
    • 3 ответа
    • 0 вопросов
  • Drno
    • 3 ответа
    • 0 вопросов
  • Refguser
    • 3 ответа
    • 0 вопросов
  • © Habr
  • О сервисе
  • Правила
  • Обратная связь
  • Блог

Войдите на сайт

Чтобы задать вопрос и получить на него квалифицированный ответ.
Войти через центр авторизации