"Опции"title", "url"не существуют. Определенные опции: ""

Я следую этому уроку:

https://sonata-project.org/bundles/block/master/doc/reference/your_first_block.html

Я могу сохранить новый блок, но когда я пытаюсь использовать remove Кнопка, чтобы удалить блок, мои журналы показывают эту ошибку:

request.CRITICAL: Uncaught PHP Exception Symfony \ Component \ OptionsResolver \ Exception \ UndefinedOptionsException: "Параметры"title", "url"не существуют. Определенные параметры: ""." по адресу /usr/src/app/vendor/symfony/symfony/src/Symfony/Component/OptionsResolver/OptionsResolver.php строка 685

Где мне нужно определить свои поля, чтобы решить эту проблему? И как бы выглядело это определение, если придерживаться рассматриваемого учебника?

====

Редактировать 1: Вот содержание моего блочного сервиса:

<?php

namespace AppBundle\Block;

use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
use Sonata\BlockBundle\Model\BlockInterface;
use Sonata\BlockBundle\Block\BlockContextInterface;
use Sonata\AdminBundle\Form\FormMapper;
use Sonata\CoreBundle\Validator\ErrorElement;
use Sonata\BlockBundle\Block\Service\AbstractBlockService;
use Sonata\BlockBundle\Block\Service\AbstractAdminBlockService;

class PatrickBlockService extends AbstractAdminBlockService
{
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'url'      => false,
            'title'    => 'Insert the rss title',
            'template' => '@SonataBlock/Block/block_core_rss.html.twig',
        ));
    }

    public function buildEditForm(FormMapper $formMapper, BlockInterface $block)
    {
        $formMapper
            ->add('settings', 'sonata_type_immutable_array', array(
                'keys' => array(
                    array('url', 'url', array('required' => false)),
                    array('title', 'text', array('required' => false)),
                )
            ))
        ;
    }

    public function validateBlock(ErrorElement $errorElement, BlockInterface $block)
    {
        $errorElement
            ->with('settings.url')
            ->assertNotNull(array())
            ->assertNotBlank()
            ->end()
            ->with('settings.title')
            ->assertNotNull(array())
            ->assertNotBlank()
            ->assertMaxLength(array('limit' => 50))
            ->end()
        ;
    }

    public function execute(BlockContextInterface $blockContext, Response $response = null)
    {
        // merge settings
        $settings = $blockContext->getSettings();
        $feeds = false;

        if ($settings['url']) {
            $options = array(
                'http' => array(
                    'user_agent' => 'Sonata/RSS Reader',
                    'timeout' => 2,
                )
            );

            // retrieve contents with a specific stream context to avoid php errors
            $content = @file_get_contents($settings['url'], false, stream_context_create($options));

            if ($content) {
                // generate a simple xml element
                try {
                    $feeds = new \SimpleXMLElement($content);
                    $feeds = $feeds->channel->item;
                } catch (\Exception $e) {
                    // silently fail error
                }
            }
        }

        return $this->renderResponse($blockContext->getTemplate(), array(
            'feeds'     => $feeds,
            'block'     => $blockContext->getBlock(),
            'settings'  => $settings
        ), $response);
    }
}

... а вот соответствующий контент из admin.yml:

app.block.service.patrick:
    class: AppBundle\Block\PatrickBlockService
    arguments:
        - "Patrick Block"
        - "@templating"

До сих пор я пытался удалить два поля, задействованные в методе configureOptions(), и это, похоже, не имеет значения.

====

Изменить 2:

Когда я говорю "Я не могу сохранить новый блок", я имею в виду, что информация сохраняется в базе данных и доступна для последующего поиска. Тем не менее, я вижу ту же ошибку на этом этапе.

2 ответа

Сообщение об ошибке сбивает с толку в этом случае.

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

use Sonata\BlockBundle\Block\Service\AbstractBlockService;
use Symfony\Component\OptionsResolver\OptionsResolver;

class MyBlockService extends AbstractBlockService
{
    public function configureSettings(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'url'      => false,
            'title'    => 'Insert the rss title',
            'template' => '@SonataBlock/Block/block_core_rss.html.twig',
        ));
    }
}
  • Мой пример использует AbstractBlockService, из которого расширяется AbstractAdminBlockService.

Для тех, кто гуглится годами позже: в итоге я разочаровался в учебнике и пошел в противоположном направлении, по сути, отказавшись от существующей логики, которую предоставляет Sonata. Вот расплывчатая версия того, что я помню, делал:

  • Клонировал файл в vendor/sonata-project/block-bundle/Block/Service/RssBlockService.php в src/AppBundle/Block/RssBlockService.php

  • обновленный admin.yml а также sonata_block.yml соответственно.

  • Ран tail -f var/logs/dev.log и поправил мой use заявления, чтобы исправить все оставшиеся грубые пятна.

  • Создал новый шаблон Twig и настроил мой код для использования этого шаблона.

Другие вопросы по тегам