我正在使用FOS Rest Bundle来构建Api,问题是每次我尝试返回任何内容时都会收到错误消息:“无法找到模板”我真的不想渲染模板,但是序列化我拥有的实体。
这是我的代码:
的routing.yml:
acme_api_register:
pattern: /user
defaults: { _controller: AcmeApiBundle:User:post, _format: json }
requirements:
_method: POST
Controller.php这样:
<?php
namespace Acme\ApiBundle\Controller;
use Acme\ApiBundle\Entity\Patient;
use Acme\ApiBundle\Entity\User;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use FOS\RestBundle\Controller\Annotations\View;
//use FOS\RestBundle\View\View;
class UserController extends Controller
{
/**
* @View()
*/
public function postAction()
{
$user = new Patient();
$user->setName("Daniel");
$user->setLastName("My lastName");
$user->setEmail("pleasework@gmail.com");
return $user;
}
}
和我的 app / config.yml
sensio_framework_extra:
view: { annotations: false}
router: { annotations: true }
fos_rest:
format_listener:
rules:
- prefer_extension: false
routing_loader:
default_format: json
view:
view_response_listener: force
我非常感谢任何帮助!
PD:
composer.json:
{
"name": "symfony/framework-standard-edition",
"license": "MIT",
"type": "project",
"description": "The \"Symfony Standard Edition\" distribution",
"autoload": {
"psr-0": { "": "src/" }
},
"require": {
"php": ">=5.3.3",
"symfony/symfony": "~2.4",
"doctrine/orm": "~2.2,>=2.2.3",
"doctrine/doctrine-bundle": "~1.2",
"twig/extensions": "~1.0",
"symfony/assetic-bundle": "~2.3",
"symfony/swiftmailer-bundle": "~2.3",
"symfony/monolog-bundle": "~2.4",
"sensio/distribution-bundle": "~2.3",
"sensio/framework-extra-bundle": "~3.0",
"sensio/generator-bundle": "~2.3",
"incenteev/composer-parameter-handler": "~2.0",
"friendsofsymfony/rest-bundle": "1.1.*",
"jms/serializer-bundle": "0.13.*"
},
"scripts": {
"post-install-cmd": [
"Incenteev\\ParameterHandler\\ScriptHandler::buildParameters",
"Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::buildBootstrap",
"Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::clearCache",
"Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::installAssets",
"Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::installRequirementsFile"
],
"post-update-cmd": [
"Incenteev\\ParameterHandler\\ScriptHandler::buildParameters",
"Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::buildBootstrap",
"Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::clearCache",
"Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::installAssets",
"Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::installRequirementsFile"
]
},
"config": {
"bin-dir": "bin"
},
"extra": {
"symfony-app-dir": "app",
"symfony-web-dir": "web",
"symfony-assets-install": "symlink",
"incenteev-parameters": {
"file": "app/config/parameters.yml"
},
"branch-alias": {
"dev-master": "2.4-dev"
}
}
}
答案 0 :(得分:4)
这是因为您可能正在使用浏览器来测试您的API。如果您打开控制台检查器,则会看到您的浏览器向API发送的请求的内容。如您所见,接受标题类似于:
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
正如您所看到的,第一个接受的格式是 text / html 。这就是为什么我猜你的应用程序试图返回HTML响应,但它无法找到模板!
因此,如果您不需要,请建议您停用 html 格式,并将 json 设置为默认格式。
fos_rest:
param_fetcher_listener: true
format_listener:
rules:
fallback_format: json
prefer_extension: false
priorities: [json, xml]
view:
view_response_listener: force
formats:
json: true
xml: true
jsonp: false
rss: false
html: false
failed_validation: HTTP_BAD_REQUEST
使用这样的配置,你说你支持的唯一格式是 json 和 xml ,如果没有指定,请使用 json 。
现在再次打开浏览器,您将获得XML资源。这是因为接受标头仍为Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
。您的浏览器并不知道您正在调用Rest API以及您首选的格式: - )
要测试您的API,我建议您使用合适的客户端。如果您正在使用Chrome,请查看Advanced REST client扩展程序。
答案 1 :(得分:2)
我认为您使用的是错误的控制器,请尝试使用 FOSRestController 。您的控制器代码应该是这样的。
<?php
namespace Acme\ApiBundle\Controller;
use Acme\ApiBundle\Entity\Patient;
use Acme\ApiBundle\Entity\User;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use FOS\RestBundle\Controller\Annotations\View;
use FOS\RestBundle\Controller\FOSRestController;
class UserController extends FOSRestController
{
/**
* @View()
*/
public function postUserAction()
{
$user = new Patient();
$user->setName("Daniel");
$user->setLastName("My lastName");
$user->setEmail("pleasework@gmail.com");
return $user;
}
}
有关详细信息,请查看here
此外,您的路由应该像这样定义。
<强>的routing.yml 强>
users:
type: rest
resource: Acme\ApiBundle\Controller\UsersController
如果您遵守documentation中所述的规则,FOSRest可以自动为您生成路线。
请花点时间阅读documentation,因为看起来你的代码看起来很明显。
答案 2 :(得分:1)
我知道你在评论中说你放弃了,但如果你还想建立一个REST api,你应该试试这个。
我认为你的config.yml
是错误的。您必须指定页面格式的优先级,以确保首先选择的是json
(即使您在路线中写了它,它还不够)。
尝试将配置文件更改为:
#...
fos_rest:
view:
view_response_listener: force
format_listener:
default_priorities: ['json', 'html', '*/*']
fallback_format: json
prefer_extension: true
#...
这是一篇关于如何构建正确的REST Api的非常好的文章:
http://williamdurand.fr/2012/08/02/rest-apis-with-symfony2-the-right-way/