简体   繁体   中英

Symfony2 Google Books API

I have an issue getting a book from the Google Books API in Symfony2

I am posting this form for a page (/google)...

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

and this is my controller for the result page (/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));


}

I have tried posting this number from the form

1781100489

Which is the same as going to: https://www.googleapis.com/books/v1/volumes?q=1781100489

However, when i put that number in the form and press search, i get this error

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

this is from my routing file...

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

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

this is 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 %}

Anyone got any ideas where i'm going wrong with this?

Thanks

It looks like you are trying to serialize the request object when really you just want the value from the form. Try changing your request to the api to:

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);
}

Then the route:

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

Then clear the cache:

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

or just for dev

php app/console cache:clear

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM