使用自定义模板为Sylius中的新实体及其ResourceBundle

时间:2016-04-14 21:57:56

标签: php symfony twig sylius

Documentation for Resource-Bundle之后,我在为新实体的后端设置模板时迷路了。 简短版本:我最终得到一个错误“无法找到模板”AppBundle:Book:Backend:index.twig“。

我创建了一个新的实体“Book”并以正确的方式配置它,实体也存在于数据库中,并且Sylius自动为GET / POST / DELETE准备了路由。

现在我想在后端部分创建一个模板,用于显示所有书籍,还提供编辑和删除功能。

路由工作正常。但是找不到模板。我有什么不对吗?

我做了什么:

1。添加实体

我在App-Bundle中添加了一个名为“Book”的新实体,如文档中所示。

<?php

namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

use Sylius\Component\Resource\Model\ResourceInterface;

/**
 * Class Book
 * @ORM\Entity
 * @ORM\Table(name="book")
 */
class Book implements ResourceInterface
{
    /**
     * @var int
     * @ORM\Column(name="id", type="bigint")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    protected $id;

    /**
     * @var string
     *
     * @ORM\Column(name="title", type="string", length=100, nullable=false)
     */
    protected $title;

    /**
     * @return int
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * @return string
     */
    public function getTitle()
    {
        return $this->title;
    }

    /**
     * @param string $title
     * @return Book
     */
    public function setTitle($title)
    {
        $this->title = $title;

        return $this;
    }
}

2。配置新资源

然后我将“book”配置为app / config / config.yml中的新资源:

sylius_resource:
    resources:
        app.book:
            templates: AppBundle:Book:Backend
            classes:
                model: AppBundle\Entity\Book
                controller: Sylius\Bundle\ResourceBundle\Controller\ResourceController
                repository: Sylius\Bundle\ResourceBundle\Doctrine\ORM\EntityRepository

我发现我必须配置控制器和存储库。否则,sylius将无法使用自定义模板,因为不会为这些路由分配控制器。

第3。路由到此新资源(仅限后端)

然后我将以下行添加到app / config / routing.yml:

app_book:
   resource: |
       alias: app.book
       section: admin
   type: sylius.resource
   prefix: /administration
   defaults:
        _sylius:
            permission: false

我将“权限”切换为false,因为Sylius将抛出一个拒绝访问的异常,除非进一步进行RBAC配置(我不知道该怎么做以及哪些情况记录不清楚新模型/实体)。这就是为什么我暂时绕过任何权限检查。

运行php app/console debug:router将列出我的新实体Book的新路线:

app_book_index                                        GET              ANY      ANY    /administration/books/                                                                   
app_book_create                                       GET|POST         ANY      ANY    /administration/books/new                                                                
app_book_update                                       GET|PUT|PATCH    ANY      ANY    /administration/books/{id}/edit                                                          
app_book_show                                         GET              ANY      ANY    /administration/books/{id}                                                               
app_book_delete                                       DELETE           ANY      ANY    /administration/books/{id}                                                               

4。调用页面

但是当我登录后端(虽然一切正常),并明确调用URL“/ administration / books”时,会发生以下错误:

  

无法找到模板“AppBundle:Book:Backend:index.twig”。

     

CRITICAL - 未捕获的PHP异常InvalidArgumentException:“无法执行   找到模板“AppBundle:Book / Backend:index.twig”。“at   sylius / ACME /供应商/ symfony的/ symfony的/ SRC / Symfony的/网桥/枝条/ TwigEngine.php   第128行

模板文件位于“AppBundle \ Resources \ Views \ Book \ Backend \ index.html.twig”下,如下面的树形结构所示:

enter image description here

我在这里错了什么?

更新

感谢@gvf,我更新了config.dev并提供了这样的模板属性:

sylius_resource:
    resources:
        app.book:
            templates: AppBundle:Book/Backend
            classes:
                model: AppBundle\Entity\Book
                controller: Sylius\Bundle\ResourceBundle\Controller\ResourceController
                repository: Sylius\Bundle\ResourceBundle\Doctrine\ORM\EntityRepository

文件树现在看起来像这样:

enter image description here

但这仅适用于更新操作。 Index-Action和show-Action以“找不到模板index.twig / show.twig”结束。将文件名重命名为上述文件名不是有效的解决方案。

更新II

如果感兴趣的话,我在github上发布了包含实体和配置文件的测试安装:https://github.com/itinance/sylius_new_entity

Udpate 3

我在github上打开了issue。也许有人会澄清。

3 个答案:

答案 0 :(得分:2)

修复Sylius的公关正在进行中:https://github.com/Sylius/Sylius/pull/5061 如果有人在寻找答案,请留下一张便条。

或者,您可以为每个操作使用单独的路由:

app_admin_book_index:
    path: /administration/books/
    methods: [GET]
    defaults:
        _controller: app.controller.book:indexAction
        _sylius:
            permission: false
            template: book/Backend/index.html.twig

将模板传递到_sylius template选项不会受到错误的影响。

答案 1 :(得分:0)

似乎控制器中$ this-&gt; render()的第一个参数正在寻找index.twig模板和名为index.html.twig的模板。

这里有一种形式的客户模板: http://docs.sylius.org/en/latest/bundles/SyliusResourceBundle/show_resource.html

答案 2 :(得分:0)

尝试:

templates: AppBundle:Book/Backend