将自定义模板用于 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
选项不受此错误的影响。
在 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
选项不受此错误的影响。