我实际上使用自动路由生成我的api Rest,使用FOSRESTBundle,我也使用NelmioApiDocBundle生成api doc.
为我的routing.yml生成api的路由
users:
type: rest
resource: Project\RESTBundle\Controller\UsersController
Run Code Online (Sandbox Code Playgroud)
但是对于某些操作,我想设置我的自定义路由...如果我尝试为操作添加另一个路由规则,它只是忽略它并生成自动路由.
我一直在尝试Symfony 2.2,FOSRest Bundle(使用JMS Serializer)和使用MongoDB的Doctrine ODM.
经过几个小时试图找出如何正确设置FOSRest捆绑包后,我仍然遇到一些麻烦:我有一个非常简单的路线,返回产品和价格列表.每当我请求HTML格式时,我得到正确的响应,但如果我请求任何其他格式(JSON,XML),我会收到错误:
[{"message": "Resources are not supported in serialized data. Path: Monolog\\Handler\\StreamHandler -> Symfony\\Bridge\\Monolog\\Logger -> Doctrine\\Bundle\\MongoDBBundle\\Logger\\Logger -> Doctrine\\Bundle\\MongoDBBundle\\Logger\\AggregateLogger -> Doctrine\\ODM\\MongoDB\\Configuration -> Doctrine\\MongoDB\\Connection -> Doctrine\\ODM\\MongoDB\\LoggableCursor",
"class": "JMS\\Serializer\\Exception\\RuntimeException",...
Run Code Online (Sandbox Code Playgroud)
你可以在这里看到完整的错误信息
我当前的设置非常简单:我创建了一个到控制器的单一路径,返回产品列表和价格(我按照这个例子来创建产品文档).
这是路线:
rest_product:
type: rest
resource: Onema\RestApiBundle\Controller\ProductController
Run Code Online (Sandbox Code Playgroud)
这是控制器:
<?php
namespace Onema\RestApiBundle\Controller;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use FOS\RestBundle\Controller\FOSRestController;
use FOS\RestBundle\Routing\ClassResourceInterface;
use FOS\Rest\Util\Codes;
use JMS\Serializer\SerializationContext;
use Onema\RestApiBundle\Document\Product;
class ProductController extends FOSRestController implements ClassResourceInterface
{
public function getAction()
{
$dm = $this->get('doctrine_mongodb')->getManager();
$products = $dm->getRepository('RestApiBundle:Product')->findAll();
if(!$products)
{
throw …Run Code Online (Sandbox Code Playgroud) 使用Symfony2,FOSRest和Doctrine构建API.鉴于以下路线:
"GET /api/path/to/product"
Run Code Online (Sandbox Code Playgroud)
以及以下参数:
[("vendorID", 10), ("destination", "tanzania"), ("type", "accommodation"), ("sort", "price", "ASC")]
Run Code Online (Sandbox Code Playgroud)
使用FOSRest捆绑包可以检索这些字符串,但是,将它们映射到学说查询是挑战的起因.
我想过使用为查询字符串的不同组合定制的大量案例语句,而不是优雅的解决方案.想要构建一个不会严重影响性能的更通用的控制器.任何建议都会有帮助.
我正在研究一个新项目symfony 2.我正在同时学习这个框架.对于用户管理,我使用捆绑FOSUserBundle.我的项目运作良好,我可以登录,注册,注销和所有其他命令.
问题是,我想制作智能手机应用程序,它将使用我的Symfony应用程序的API.在应用中,用户必须登录或注册.是否也可以为API使用FOSUserBundle方法?
我研究了另一个非常适合制作API的软件包,它是FOSRestBundle.如果没有解决方案,你认为我将不得不创建我自己的用户方法,如:
/api/login
/api/registrer
Run Code Online (Sandbox Code Playgroud)
然后,在这个方法里面,我重定向到FOSUserBundle方法?我很想知道什么是最好的,最干净的登录方式,并通过智能手机注册FOSUserBundle,所以使用API
谢谢
我将JSON数据发布到控制器中的表单.实体没有填写我发送的属性,这里是它的样子:
// Controller
class UserApiController extends FOSRestController
{
// works fine
public function cgetAction()
{
return $this->get('model.user')->getAllUsers();
}
// works fine
public function getAction($id)
{
return $this->get('model.user')->getUserById($id);
}
// this method fails
public function postAction(Request $request)
{
$form = $this->createForm(new UserType(), new User());
$form->bind($request);
if($form->isValid())
{
die('are you valid or not??');
}
return $this->view($form, 400);
}
}
Run Code Online (Sandbox Code Playgroud)
实体看起来像常规实体,也可以形成.
我有一个测试控制器将json数据发送到api:
public function testJsonPostAction()
{
$client = static::createClient();
$client->request(
'POST',
'/api/1.0/users',
array(),
array(),
array('CONTENT_TYPE' => 'application/json'),
'{"firstName": "John", "lastName": "Doe", "emailAddress": "something@somewhere.com", …Run Code Online (Sandbox Code Playgroud) 我在里面制作了一个Bundle和一个REST控制器."index"方法以JSON格式返回数组,没关系:
MyBundle /控制器/原料药/休息/ BaconController.php
class BaconController extends Controller implements ClassResourceInterface
{
/**
* @var Request $request
* @return array
* @Rest\View
*/
public function cgetAction(Request $request)
{
$mediaType = $request->attributes->get('media_type');
$format = $request->getFormat($mediaType);
my_dump($format);
return array(
array("id" => 1, "title" => "hello",),
array("id" => 2, "title" => "there",),
);
}
}
Run Code Online (Sandbox Code Playgroud)
MyBundle /资源/配置/ API/routing_rest.yml
my_api_rest_bacon:
type: rest
resource: "MyBundle:Api/Rest/Bacon"
name_prefix: api_rest_bacon_
prefix: /my/bacon
Run Code Online (Sandbox Code Playgroud)
所以,此时JSON结果完全返回:
mysite.com/app_dev.php/api/my/bacon/bacons.json
返回我的数组.
但现在我需要让我的控制器生成带有数据的PDF.所以我希望它在我打电话时返回PDF文件:
mysite.com/app_dev.php/api/my/bacon/bacons.pdf
我发现了一些半手册:RSS视图处理程序,RSS config.ynal,带有答案的CSV问题.并尝试做类似的事情:
我添加了这些行
Symfony的/应用/配置/ config.yml
framework: …Run Code Online (Sandbox Code Playgroud) 我在使用FOSRestBundle时遇到错误.
致命错误:在第209行的/home/a15net/public_html/kavuklar/vendor/friendsofsymfony/rest-bundle/FOS/RestBundle/View/ViewHandler.php中找不到类'JMS\Serializer\SerializationContext'
它在composer.phar更新之前工作.
你有没有想过为什么我会收到这个错误?
我正在尝试将 FOSRestBundle 集成到我的应用程序中。
我只想在路线匹配时使用它,例如^/api.
我真的不知道如何使用这个包,而且我认为文档非常糟糕。(没有冒犯的意思)。
fos_rest:
format_listener:
enabled: true
rules:
- { path: '^/api', priorities: ['json', 'xml'], fallback_format: 'html' }
Run Code Online (Sandbox Code Playgroud)
当我从浏览器请求任何路线时,我收到此错误:
无法确定匹配的已接受响应格式
我只想匹配以 ^/api 开头的路由。
有任何想法吗?
Symfony 3.1.7 + FOSRestBundle 最新版本
<?php
namespace PM\ApiBundle\Controller;
...
use FOS\RestBundle\Controller\Annotations as Rest;
use FOS\RestBundle\View\View;
class ArticlesController extends FOSRestController
{
/**
* @ApiDoc(
* section="articles",
* resource=true,
* description="Get articles published"
* )
* @Rest\View(serializerGroups={"article"})
* @Rest\Get("/articles")
*/
public function getArticlesAction(Request $request)
{
$articles = $this->getDoctrine()
->getManager()
->getRepository('PMPlatformBundle:Article')
->findAllDateDesc();
/* @var $articles Article[] */
return $articles;
}
Run Code Online (Sandbox Code Playgroud)
然后在我的文章实体中,我使用正确的使用语句添加了这个注释 @Groups({"article"})。
我得到的默认序列化程序:
[
[],
[]
]
Run Code Online (Sandbox Code Playgroud)
我得到了 Whit JMS 序列化程序(捆绑):
{
"0": {},
"1": {}
}
Run Code Online (Sandbox Code Playgroud)
(我在 db 中有两篇文章)似乎无法识别“文章”组。当我使用没有这个注释的默认序列化程序时,我得到一个循环错误。
怎么了 ?
[编辑] …
这是情况:我在基于 symfony3 的 rest api 上工作,它使用 FOSRestBundle 和 symfony 序列化器组件,因此方法返回数组,FOSRest 处理编码和响应。问题是序列化程序使用带有默认设置的 json_encode 和某些符号的 api 返回数据,如 '\u00c9S'。所以我需要以某种方式将 'JSON_UNESCAPED_UNICODE' 传递给 json_encode() 。有什么合适的方法可以达到这个目标吗?方法示例:
namespace AppBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use FOS\RestBundle\Controller\Annotations as Rest;
use Nelmio\ApiDocBundle\Annotation\ApiDoc;
use Symfony\Component\HttpFoundation\Request;
/**
* Class ExampleController
* @package AppBundle\Controller
*/
class ExampleController extends Controller
{
/**
* @Rest\Get("/get-some-data")
* @param Request $request
* @return array
*/
public function getSomeDataAction(Request $request)
{
$someData = [
'prop1' => 'Value',
'prop2' => 'Value',
'prop3' => 'Value',
'prop4' => 'Value',
];
return …Run Code Online (Sandbox Code Playgroud) fosrestbundle ×10
symfony ×10
php ×6
api ×2
rest ×2
doctrine-odm ×1
doctrine-orm ×1
forms ×1
mobile ×1
mongodb ×1
symfony-2.1 ×1
symfony-2.2 ×1
symfony-2.3 ×1