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

Я использую easyAdminBundle, я хотел бы знать, можно ли использовать static function или const (определить где-нибудь в моем приложении), чтобы установить параметр choices типа choice как таковой:

- { property: tag, type: choice, type_options: { choices: 'App\Entity\News::getTags' }

С функцией getTags, например:

class News 
{
    const TAGS = ['toto','tutu'];

    static public function getTags()
    {
        return $this::TAGS;
    }
}

Это уже можно сделать с помощью query_builder, но я не нашел никаких следов этого в документации.

На самом деле я получаю следующую ошибку, которая заставляет меня думать, что это невозможно (но, возможно, кто-то здесь делает):

Произошла ошибка при разрешении опций вида "Symfony\Component\Form\Extension\Core\Type\ChoiceType": ожидается, что опция "choices" со значением "App\Entity\News::getTags" будет иметь тип " null», или «массив», или «\Traversable», но имеет тип «строка».


person Pierrick Rambaud    schedule 22.02.2020    source источник


Ответы (2)


Да, установите const TAGS на static и внутри getTags() замените $this на self.

И

{ choices: App\Entity\News::getTags() }

Удалите апострофы и добавьте (), чтобы фактически вызвать функцию

person David Alvarez    schedule 22.02.2020
comment
согласно этому (и моему компилятору) вы не можете установить static const в php . в любом случае это причина static function. Я заменил $this на self, как было предложено, и () на вызов в файле yaml. У меня все еще есть та же ошибка. Как бы это не интерпретировалось как функция.... - person Pierrick Rambaud; 23.02.2020
comment
Я не на 100% уверен в этом, но если вы используете атрибут, который не является статическим, вам нужно создать экземпляр News для доступа к нему. Но здесь вы получаете доступ к новостям статически - person David Alvarez; 23.02.2020
comment
constдоступны статически. но просто чтобы убедиться, что я пробовал с static private $TAGS и все равно получаю ту же ошибку - person Pierrick Rambaud; 23.02.2020
comment
Попробуйте получить прямой доступ к константе вместо использования функции: stackoverflow.com/questions/1685922/ - person David Alvarez; 23.02.2020
comment
Я почти уверен, что ошибка говорит вам, что вы даете строку, потому что вы ставите апострофы, что является строкой. Какая ошибка у вас возникает при удалении апострофов? - person David Alvarez; 23.02.2020
comment
то же самое, но по вашему совету я был на веб-сайт symfony и найти способ прямого доступа к константам из yaml. работает как шарм. я публикую ответ - person Pierrick Rambaud; 23.02.2020

Следуя совету @David Alvarez, я попытался получить доступ к свойству const непосредственно из файла yaml. Это возможно благодаря этому обновлению symfony. доступен, начиная с версии 3.2.

поэтому для доступа к свойству const как:

class News 
{
    const TAGS = ['toto' => 'toto','tutu' => 'tutu'];
}

Я напишу :

{ choices: !php/const App\Entity\News::TAGS }

и это работает как шарм

person Pierrick Rambaud    schedule 23.02.2020