Sonata:如何在Symfony 3.3中以编程方式创建并填充区块?
在Symfony 3.3中用Sonata Block Bundle编程创建并填充区块(用于测试)
看起来你已经完成了测试页面的创建部分,接下来咱们把区块的创建和关联逻辑补上,这样就能生成可用于测试的完整页面+区块数据了。以下是补全后的Fixture代码:
public function load(ObjectManager $manager) { // 获取预设的默认站点 $siteRepository = $manager->getRepository('ApplicationSonataPageBundle:Site'); $defaultSite = $siteRepository->findOneBy(['name'=>'vagrant.dev']); // 创建测试页面 $page = new Page(); $page->setName('An empty test page'); $page->setSite($defaultSite); $page->setSlug('test-empty-page'); $page->setEnabled(true); $manager->persist($page); // --- 核心:创建并配置区块 --- // 1. 实例化区块对象(这里以Sonata自带的文本区块为例,替换成你的自定义区块即可) $block = new \Sonata\BlockBundle\Model\Block(); // 设置区块类型,对应区块服务的ID,比如文本区块是 'sonata.block.service.text' $block->setType('sonata.block.service.text'); // 把区块关联到刚才创建的测试页面 $block->setPage($page); // 指定区块在页面中的位置(比如页面的content区域,根据你的页面模板定义来) $block->setPosition('content'); // 设置排序权重,数字越小越靠前 $block->setPositionOrder(1); // 2. 配置区块的参数(不同类型的区块配置项不一样) $block->setSettings([ 'content' => '<p>这是用于测试的区块内容</p>', 'title' => '测试区块标题', 'template' => '@SonataBlock/Block/block_text.html.twig' // 指定渲染用的模板 ]); // 3. 持久化区块 $manager->persist($block); // 提交所有数据库变更 $manager->flush(); }
如果你的目标是测试自定义区块服务,还有几个关键点要注意:
- 确保你的自定义区块服务已经在
services.yml中正确注册,并且添加了sonata.block标签 - 创建Block时,
setType()的值要完全匹配你自定义服务的ID,比如你的服务ID是app.block.my_custom_service,就填这个值 - 区块的
settings数组要和你自定义区块的配置选项对应,不然会渲染出错
另外,如果是在功能测试中直接调用区块服务(不是用Fixture生成数据),可以通过容器获取区块管理器来操作:
// 在WebTestCase的测试方法中 $client = static::createClient(); $container = $client->getContainer(); // 获取区块管理器 $blockManager = $container->get('sonata.block.manager'); // 创建新的区块 $block = $blockManager->createNewBlock('sonata.block.service.text'); $block->setSettings([ 'title' => '测试标题', 'content' => '直接测试的区块内容' ]); // 如果需要渲染区块,可以调用对应的区块服务 $blockService = $container->get($block->getType()); $renderedContent = $blockService->render($block)->getContent(); // 接下来就可以断言渲染后的内容是否符合预期了 $this->assertContains('测试标题', $renderedContent);
这样不管是生成测试数据还是直接测试区块服务,都能满足你的需求啦。
内容的提问来源于stack exchange,提问作者Mayor of the Plattenbaus
相关产品推荐
相关产品推荐

