如何覆盖微内核 Symfony 中的包资源?
How to override bundle resources in micro-kernel Symfony?
我有自定义目录结构的微内核 Symfony 项目。
我用过这个:https://github.com/ikoene/symfony-micro
我如何覆盖例如Twig 资源(异常视图)?
Cookbook 说我应该在我的资源目录中创建一个名为 TwigBundle 的目录。
我创建了 \AppBundle\Resources\TwigBundle\views\Exception
目录。覆盖视图似乎不起作用。
感谢您使用微内核设置。以下是覆盖异常视图的方法。
1.创建自定义 ExceptionController
首先,我们将创建自己的 ExceptionController,它扩展了基本的 ExceptionController。这将允许我们覆盖模板路径。
<?php
namespace AppBundle\Controller\Exception;
use Symfony\Bundle\TwigBundle\Controller\ExceptionController as BaseExceptionController;
use Symfony\Component\HttpFoundation\Request;
class ExceptionController extends BaseExceptionController
{
/**
* @param Request $request
* @param string $format
* @param int $code
* @param bool $showException
*
* @return string
*/
protected function findTemplate(Request $request, $format, $code, $showException)
{
$name = $showException ? 'exception' : 'error';
if ($showException && 'html' == $format) {
$name = 'exception_full';
}
// For error pages, try to find a template for the specific HTTP status code and format
if (!$showException) {
$template = sprintf('AppBundle:Exception:%s%s.%s.twig', $name, $code, $format);
if ($this->templateExists($template)) {
return $template;
}
}
// try to find a template for the given format
$template = sprintf('@Twig/Exception/%s.%s.twig', $name, $format);
if ($this->templateExists($template)) {
return $template;
}
// default to a generic HTML exception
$request->setRequestFormat('html');
return sprintf('@Twig/Exception/%s.html.twig', $showException ? 'exception_full' : $name);
}
}
2。创建错误模板
为不同的错误代码创建模板:
- error.html.twig
- error403.html.twig
- error404.html.twig
在此示例中,异常模板将放置在 AppBundle/Resources/views/Exception/
3。覆盖默认的 ExceptionController
现在让我们指向配置中的新异常控制器。
twig:
exception_controller: app.exception_controller:showAction
我真的很喜欢你的解决方案,但我找到了另一种无需自定义异常控制器的方法。
我意识到当你存储你的内核 class.
因此,对于您的存储库中的结构,它是:
/Resources/TwigBundle/views/Exception/
最后,我稍微更改了目录结构,使 'app' 目录中包含内核文件。就像在默认的 Symfony 项目中一样。
我有自定义目录结构的微内核 Symfony 项目。
我用过这个:https://github.com/ikoene/symfony-micro
我如何覆盖例如Twig 资源(异常视图)?
Cookbook 说我应该在我的资源目录中创建一个名为 TwigBundle 的目录。
我创建了 \AppBundle\Resources\TwigBundle\views\Exception
目录。覆盖视图似乎不起作用。
感谢您使用微内核设置。以下是覆盖异常视图的方法。
1.创建自定义 ExceptionController
首先,我们将创建自己的 ExceptionController,它扩展了基本的 ExceptionController。这将允许我们覆盖模板路径。
<?php
namespace AppBundle\Controller\Exception;
use Symfony\Bundle\TwigBundle\Controller\ExceptionController as BaseExceptionController;
use Symfony\Component\HttpFoundation\Request;
class ExceptionController extends BaseExceptionController
{
/**
* @param Request $request
* @param string $format
* @param int $code
* @param bool $showException
*
* @return string
*/
protected function findTemplate(Request $request, $format, $code, $showException)
{
$name = $showException ? 'exception' : 'error';
if ($showException && 'html' == $format) {
$name = 'exception_full';
}
// For error pages, try to find a template for the specific HTTP status code and format
if (!$showException) {
$template = sprintf('AppBundle:Exception:%s%s.%s.twig', $name, $code, $format);
if ($this->templateExists($template)) {
return $template;
}
}
// try to find a template for the given format
$template = sprintf('@Twig/Exception/%s.%s.twig', $name, $format);
if ($this->templateExists($template)) {
return $template;
}
// default to a generic HTML exception
$request->setRequestFormat('html');
return sprintf('@Twig/Exception/%s.html.twig', $showException ? 'exception_full' : $name);
}
}
2。创建错误模板
为不同的错误代码创建模板:
- error.html.twig
- error403.html.twig
- error404.html.twig
在此示例中,异常模板将放置在 AppBundle/Resources/views/Exception/
3。覆盖默认的 ExceptionController
现在让我们指向配置中的新异常控制器。
twig:
exception_controller: app.exception_controller:showAction
我真的很喜欢你的解决方案,但我找到了另一种无需自定义异常控制器的方法。
我意识到当你存储你的内核 class.
因此,对于您的存储库中的结构,它是:
/Resources/TwigBundle/views/Exception/
最后,我稍微更改了目录结构,使 'app' 目录中包含内核文件。就像在默认的 Symfony 项目中一样。