从其他包中嵌入Symfony控制器

时间:2014-10-22 19:16:21

标签: php symfony twig

这似乎是一个有趣的问题,我不确定我是否遗漏了一些东西,因为它应该很简单,但不是。

方案

  1. 我有一个名为AcmePageBundle
  2. 的包
  3. 另一个名为AcmeGalleryBundle
  4. 的包
  5. 我希望load an embedded view from the controller使用AcmeGalleryBundle捆绑包到AcmePageBundle上的模板文件
  6. 代码

    AcmeGalleryBundle \控制器\ DisplayController.php

    class DisplayController extends Controller
    {
        public function embedAction($galleryId)
        {
            $gallery = $this->getDoctrine()->getRepository('AcmeGalleryBundle')->find($galleryId);
            if (!$gallery) {
                throw $this->createNotFoundException('Gallery could not be found');
            }
    
            return $this->render('AcmeGalleryBundle:Display:embed.html.twig', array(
                'gallery' => $gallery,
            ));
        }
    }
    

    AcmeGalleryBundle \资源\视图\显示\ embed.html.twig

      <div class="gallery">
      {% for photo in gallery.photos %}
        <a href="{{ photo.webPath }}" rel="shadowbox[gallery];">
          <img src="{{ photo.webPath }}" height="100" width="100">
        </a>
      {% endfor %}
      </div>
    

    AcmePageBundle \资源\视图\默认\ index.html.twig

    {# ... extra HTML content #}
      <h2>Gallery</h2>
      {{ render(controller('AcmeGalleryBundle:Display:embed', {
          'galleryId': 123
      })) }}
    {# rest of the HTML content #}
    

    错误

    尝试渲染使用AcmePageBundle:Default:index.html.twig的网页时,我得到了

      

    在AcmePageBundle中呈现模板(&#34; Class&#39; AcmeGalleryBundle&#39;不存在&#34;)期间抛出异常:默认:第18行的index.html.twig。 / p>

    但当然,AcmeGalleryBundle确实存在。我怀疑我在某个地方错过了一个范围问题。

    故障排除

    1. 确保AcmeGalleryBundle文件中载有AppKernel.php
    2. 尝试将use Acme\GalleryBundle添加到AcmePageBundle.php捆绑文件的顶部。
    3. Found an issue on GitHub relating to the problem with no response from the devs yet.我已经添加了自己的评论 - 这实际上可能是一个错误。
    4. 我错过了什么明显的东西吗?

1 个答案:

答案 0 :(得分:0)

我的错误在于这一行:

$gallery = $this->getDoctrine()->getRepository('AcmeGalleryBundle')->find($galleryId);

命令getRepository('AcmeGalleryBundle')需要包含我正在尝试加载存储库的实体。正确的代码是:

$gallery = $this->getDoctrine()->getRepository('AcmeGalleryBundle:Gallery')->find($galleryId);

我错误地认为这是render(controller(...))功能的问题。在修复之后,一切都按预期工作。下次我应该仔细查看堆栈跟踪!