【问题标题】:Unable to find template when returning response with FOSRestBundle使用 FOSRestBundle 返回响应时找不到模板
【发布时间】:2014-02-26 22:17:16
【问题描述】:

我正在使用 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

如果有任何帮助,我将不胜感激!

警察局:

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"
        }
    }
}

【问题讨论】:

标签: symfony fosrestbundle


【解决方案1】:

发生这种情况是因为您可能正在使用浏览器来测试您的 API。如果您打开控制台检查器,您将看到浏览器向您的 API 发送的请求是什么。如您所见,Accept 标头类似于:

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

有了这样的配置,你说你支持的唯一格式是 jsonxml,如果没有指定,使用 json . 现在再次打开浏览器,您将获得 XML 格式的资源。那是因为 Accept 标头仍然是 Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8。您的浏览器不知道您正在调用 Rest API 以及您的首选格式:-)

为了测试您的 API,我建议您使用合适的客户端。如果您使用的是 Chrome,请查看 Advanced REST client 扩展程序。

【讨论】:

    【解决方案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,因为如果我查看您的代码,很明显您没有阅读。

    【讨论】:

    • 嗨,我尝试将父控制器类更改为 FOSRestController,但是错误仍然存​​在,然后我意识到您的答案与我写的答案不同,“postUserAction”而不是“postAction” ”。如果我更改此设置,我会收到“URI 的控制器 \"\/user\" 不可调用”错误
    • 我改变了答案...再次请确保您阅读documentation
    • 实际上我确实阅读了文档,但没有一个对我有用,自动生成的路线无论如何都找不到......我已经完成了,只是浪费时间,我结束了起来使用简单的交响乐。此外,如果我坚持使用文档,则没有提到 FOSRestController,而是提到了 FosRestController 和儿子……谢谢你的语气;)但是不要投票;)
    【解决方案3】:

    我知道你在评论中说你放弃了,但如果你仍然想构建一个 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/

    【讨论】:

      猜你喜欢
      • 2015-05-30
      • 2017-08-10
      • 1970-01-01
      • 2015-07-28
      • 2020-11-03
      • 1970-01-01
      • 2015-07-18
      • 1970-01-01
      • 2014-01-08
      相关资源
      最近更新 更多