Symfony2 Google Books API

时间:2016-05-10 19:42:21

标签: php api symfony google-books

我在Symfony2中从Google Books API获取图书时遇到问题

我发布此页面的表单(/ google)...

    <form action="/googlevolume" method="post"> 
        <input type="text" name="title" id="title" size="40" value=""> 
        <input type="submit" value="Search">
    </form>

这是我的结果页面控制器(/ googlevolume)......

public function googlevolume(Request $request)
{

        $enquiry = new Enquiry();

        $form->bind($request);

        $response = $enquiry->get("https://www.googleapis.com/books/v1/volumes?q=".$form->get('title')->getData());

        $data=$response->json();

        $response2=$data['items'];

        return $this->render('BloggerBlogBundle:Page:googlevolume.html.twig', array('items' => $response2));


}

我已尝试从表单

发布此号码
1781100489

与以下内容相同: https://www.googleapis.com/books/v1/volumes?q=1781100489

然而,当我在表格中输入该号码并按搜索时,我收到此错误

Controller "Blogger\BlogBundle\Controller\PageController::googlevolumeAction" for URI "/googlevolume" is not callable.

这是来自我的路由文件...

google:
    pattern: /google
    defaults: { _controller: BloggerBlogBundle:Page:google }
    requirements:
         _method: GET

googlevolume:
    pattern: /googlevolume
    defaults: { _controller: BloggerBlogBundle:Page:googlevolume }
    requirements:
        _method: POST

这是googlevolume.html.twig ...

 {# src/Blogger/BlogBundle/Resources/views/Page/googlevolume.html.twig #}
 {% extends 'BloggerBlogBundle::layout.html.twig' %}
 {% block title %} Google Books{% endblock%}
 {% block body %}
 <header>
    <h1>Google Book</h1>
 </header>
 <br>
 {% for item in items %}
 <article>
 <img src="{{ item.volumeInfo.imageLinks.thumbnail}}"/>
 <h4>{{ item.volumeInfo.title}}</h4>
 {% if item.volumeInfo.description is defined %}
 {{ item.volumeInfo.description }}
 {% endif %}
 <strong> {{ item.volumeInfo.publishedDate }}</strong><br/>
 <b>{{ item.volumeInfo.authors | join }}</b>
 </article>
 {% endblock %}

任何人都有任何想法,我在这里遇到了什么问题?

由于

1 个答案:

答案 0 :(得分:1)

当您真正想要表单中的值时,看起来您正在尝试序列化请求对象。尝试将您的请求更改为api:

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;

...

public function googlevolumeAction(Request $request)
{
    $form = $this->createFormBuilder(null,[
            'csrf_protection' => false
        ])
        ->add('title','text')
        ->add('Search', 'submit')
        ->getForm();

    $form->bind($request);
    if($form->isValid()){
        $enquiry = new Enquiry();
        $response = json_decode(file_get_contents("https://www.googleapis.com/books/v1/volumes?q=".$form->get('title')->getData()),true);

        if(array_key_exists('items',$response)){
            return $this->render('BloggerBlogBundle:Page:googlevolume.html.twig', [
                'items' => $response['items']
            ]);
        } else {
            return new Response('Google Volume did not have any items', 400);
        }
    }

    return new Response('Google Volume Not Found', 404);
}

然后路线:

googlevolume:
    pattern: /googlevolume
    defaults: { _controller: BloggerBlogBundle:Page:googlevolumeAction }
    requirements:
        _method: POST

然后清除缓存:

php app/console cache:clear --env=prod

或仅适用于开发

php app/console cache:clear