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