使用Annotations访问子文件夹中的模板

时间:2017-10-10 09:14:01

标签: symfony routing annotations

我有一个文件夹ProjectFolder,其中包含子文件夹Mobile和模板indexMobile.html.twig

AppBundle
  | Resources
    | views
      | ProjectFolder
        | Mobile
          - indexMobile.html.twig
        | someView.html.twig
        | someView.html.twig
        | someView.html.twig

在我的控制器中,我尝试使用@Template doc@route doc

进行各种推荐访问

但是我的不同方法找不到我已创建的模板,它一直要求我直接在views创建模板而不是Mobile子文件夹。

class ProjectFolderController extends Controller
    /**
         * @Route("@Mobile/indexMobile")
         * @Method({"GET", "POST"})
         * @Template
         */
        public function indexMobileAction()
        {
            return[];
        }

-

class ProjectFolderController extends Controller
    /**
         * @Route("/Mobile/indexMobile")
         * @Method({"GET", "POST"})
         * @Template
         */
        public function indexMobileAction()
        {
            return[];
        }

-

class ProjectFolderController extends Controller
    /**
         * @Route("Mobile", name="indexMobile")
         * @Method({"GET", "POST"})
         * @Template
         */
        public function indexMobileAction()
        {
           return[];
        }

实际上这有效,但这不是我应该使用的方式:

class ProjectFolderController extends Controller
    /**
         * @Route("/mobile/index")
         * @Method({"GET", "POST"})
         * @Template("@ProjectFolder/Mobile/index.html.twig")
         */
        public function indexMobileAction()
        {
            return[];
        }

修改

经过一些尝试,我发现了这个:

class ProjectFolderController extends Controller
/**
     * @Route("@ProjectFolder/Mobile", name="/mobile/index")
     * @Method({"GET", "POST"})
     * @Template
     */
    public function indexMobileAction()
    {
        return[];
    }

但是我收到了这个错误:No route found for "GET/mobile/index"

2 个答案:

答案 0 :(得分:2)

您在此示例中提供了正确的解决方案:

class ProjectFolderController extends Controller
{
    /**
     * @Route("/mobile/index")
     * @Method({"GET", "POST"})
     * @Template("@ProjectFolder/Mobile/index.html.twig")
     */
    public function indexMobileAction()
    {
        return[];
    }
}

默认情况下@Template用于查找模板的逻辑不支持子目录。这就是您必须将模板路径作为@Template的参数传递的原因。

使用Twig命名空间应该很容易。示例:@Template("@App/Mobile/index.html.twig")发现src/AppBundle/Resources/views/index.html.twig@Template("mobile/index.html.twig")会在Symfony 4中找到app/Resources/views/mobile/index.html.twig(以及templates/mobile/index.html.twig。)

答案 1 :(得分:0)

你在这里缺少的是,像这样使用@Template默认使用它来搜索它:

“AppBundle:NAME(Controller):indexMobile.html.twig”

因此,此文件夹层次结构将起作用:

AppBundle
 | Resources
   | views
       | Mobile
         - indexMobile.html.twig

像这样使用MobileController:

class MobileController extends Controller
{
    /**
     * @Route("Mobile/indexMobile")
     * @Template
     */
    public function indexMobileAction()
    {
        return [];
    }
}