将自定义模板用于 Sylius 中的新实体及其 ResourceBundle

Using a custom template for a new entity in Sylius with its ResourceBundle

Documentation for Resource-Bundle 之后,我在为新实体的后端设置模板时迷路了。 简短版本:我最终遇到错误 "Unable to find template "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

我将 "permission" 切换为 false,因为 Sylius 将抛出拒绝访问异常,除非进一步的 RBAC 配置将完成(我不知道该怎么做以及哪个对于 new models/entities 的情况,记录很少)。这就是为什么我现在绕过这里的任何权限检查。

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

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”时,出现此错误:

Unable to find template "AppBundle:Book:Backend:index.twig".

CRITICAL - Uncaught PHP Exception InvalidArgumentException: "Unable to find template "AppBundle:Book/Backend:index.twig"." at sylius/acme/vendor/symfony/symfony/src/Symfony/Bridge/Twig/TwigEngine.php line 128

模板文件放在"AppBundle \ Resources \ Views \ Book \ Backend \ index.html.twig"下,如下图树结构所示:

我哪里错了?

更新

感谢@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

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

但这仅适用于更新操作。 Index-Action 和 show-Action 以 "template not found index.twig / show.twig" 结尾。将文件名重命名为上述文件名在这里不是有效的解决方案。

更新二

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

更新 3

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

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

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

尝试:

templates: AppBundle:Book/Backend

修复 Sylius 的 PR 正在进行中: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 选项不受此错误的影响。