我一直在研究几周前开始的单页应用程序项目。到目前为止,我们一直关注项目的前端部分,使用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项目。
答案 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("");
}