Symfony FosRestBundle - 形成没有格式的路线

时间:2014-05-29 08:13:42

标签: php symfony fosrestbundle

我正在尝试使用最新的Symfony(2.4.5)和FOSRestBundle(dev-master 6b384c1)来引导简单的REST应用程序。

我的配置:

fos_rest:
    format_listener: true
    view:
        view_response_listener: true

sensio_framework_extra:
    view:    { annotations: false }
    router:  { annotations: true }

我的路线:

products:
    type:     rest
    resource: Telemetrik\Bundle\ProductBundle\Controller\ProductsController

控制器:

<?php

// namespace & imports

class ProductsController extends Controller
{
    /**
     * @return Form
     * @View("TelemetrikProductBundle::form.html.twig")
     */
    public function newProductAction()
    {
        return $this->getForm();
    }

    /**
     * @param Request $request
     * @return View|Form
     * @View
     */
    public function postProductsAction(Request $request)
    {
        $form = $this->getForm();

        $form->handleRequest($request);

        if ($form->isValid()) {
            // Logic placeholder
        }

        return $form;
    }

    protected function getForm()
    {
        return $this->createForm(new ProductType());
    }
}

使用router:debug时,我得到:

new_product              GET    ANY    ANY  /products/new.{_format}
post_products            POST   ANY    ANY  /products.{_format}

哪个很好但是因为newProductAction应该是一个形式:

  • 我不希望它可以通过HTML以外的格式访问
  • 我想从/products/new而不是/products/new.html访问我的表单(这似乎是我可以访问该资源的唯一选项)。如果我转到products/new,我会收到:Format '' not supported, handler must be implemented

3 个答案:

答案 0 :(得分:2)

sensio_framework_extra:
    view:    { annotations: false }
    router:  { annotations: true }

fos_rest:
    routing_loader:
        default_format: json
    format_listener: true
    view:
        view_response_listener: true

答案 1 :(得分:2)

我帮助将格式默认添加到json

fos_rest:
    routing_loader:
        default_format: json

答案 2 :(得分:0)

将此添加到您的config.yml

fos_rest:
    format_listener:
        rules:
            - { path: ^/products/new, priorities: [html, json, xml], fallback_format: html, prefer_extension: false }

这应该将html扩展名设置为此路径的默认值,并且应该使其不需要扩展名。