如何从Symfony应用程序为Angular SPA提供index.html文件?

时间:2017-02-27 22:56:23

标签: php angularjs symfony fosrestbundle

我一直在研究几周前开始的单页应用程序项目。到目前为止,我们一直关注项目的前端部分,使用AngularJS构建,这样可以验证预计最终应用程序的许多方面。

我们现在正在设置网络服务和后端部分。由于我无法控制的原因,Symfony已经被我合同的工作室选中。因此,如果我处于通常的Java + Spring启动设置中,我遇到了我不会遇到的配置和设置问题。

现有应用程序具有以下文件夹结构:

root-client
|--bower_components
|--images
|--libs (dist files of bower_components)
|--scripts
|--styles
|--views
|--index.html

我按照https://jeremycurny.com/2016/03/27/symfony3-rest-api/初始化了Symfony项目并且工作正常,返回我设置的测试JSON响应。文件夹结构:

root-rest-api
|--app
|--bin
|--src
|--tests
|--var
|--vendor
|--web
|--...

这两个部分完全按预期工作。

当试图让两个部分一起运行时出现问题,也就是说,按照我在Symfony文档中读到的建议,即从web提供静态文件时,我将所有内容移到root-client以下{ {1}}下的{1}}。

问题是无法再从网络浏览器访问root-rest-api/web。更清楚的是,index.html用于启动应用程序。移动"静态" http://localhost/下的文件,我现在得到这个JSON响应:

web

错误的原因很容易理解:没有控制器注册到' /'路径。因此,我写了这个:

{"error":{"code":404,"message":"Not Found"}}

此代码定义了' /'的特定路由,这是this answer对类似问题(在Python环境而不是PHP或Symfony中)的指向。

我收到500 HTTP错误代码,可能是由于我namespace AppBundle\Controller; use FOS\RestBundle\Controller\Annotations as Rest; use FOS\RestBundle\Controller\FOSRestController; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; class DefaultController extends FOSRestController { /** * @Rest\Get("/") */ public function indexAction(Request $request) { return $this->render('index.html'); } 的使用不当:我在网上找到的所有示例都引用了Twig模板,例如the documentation about rendering templates。对我来说更不受欢迎,示例将模板放在render

有没有办法从app/Resources/views文件夹中返回现有的index.html文件?我试图避免将所有HTML片段转换为Twig模板从而重新定义了Angular分隔符。也许这是一个明显的答案,但这是我使用Symfony的第一个项目。

如果不可能,我会将客户端和服务器部分视为不同的项目,并将它们作为架构的不同层提供,而不是像Java和Spring引导那样将它们混合在一起项目或经典的Symfony项目。

1 个答案:

答案 0 :(得分:0)

在您的情况下,您始终可以使用旧的file_get_contents($index_html_path),并发送简单的字符串响应(Symfony 4):

    /**
     * @Route("/", name="index_page")
     */
    public function indexAction(Request $request)
    {
        return new Response(file_get_contents($index_html_path));
    }

如何获取索引html的路径?在控制器中很简单:

    $index_html_path = $this->getParameter('kernel.project_dir') . '/public/index.html';

即使如此,如果您的index.html很简单并且很少更改(只需将过去的内容复制到您的控制器中):

    /**
     * @Route("/", name="index_page")
     */
    public function index() {
        ?>
        <!doctype html>
        <html lang="en">
        <head>
            <title></title>
            <meta charset="utf-8">
            <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
        </head>
        <body>
        <div id="root"></div>
        </body>
        </html>
        <?php
        return new Response("");
    }