API: controllers + form + view

This commit is contained in:
Simon Vieille 2016-11-23 20:52:17 +01:00
parent 2d49e99002
commit 3a85b7c12b
5 changed files with 274 additions and 0 deletions

View file

@ -0,0 +1,37 @@
<?php
namespace AppBundle\Controller\Api;
use Symfony\Component\HttpFoundation\Request;
use Nelmio\ApiDocBundle\Annotation\ApiDoc;
use FOS\RestBundle\Controller\Annotations as Rest;
use FOS\RestBundle\Controller\FOSRestController;
use AppBundle\Entity\Book;
/**
* class BookController.
*
* @author Simon Vieille <simon@deblan.fr>
*/
class BookController extends FOSRestController
{
/**
* Get books.
*
* @Rest\View
*
* @ApiDoc(
* description="Get books.",
* )
*
* @param Request $request
*
* @return array
*/
public function getBooksAction(Request $request)
{
return $this->getDoctrine()
->getRepository(Book::class)
->findAll();
}
}

View file

@ -0,0 +1,90 @@
<?php
namespace AppBundle\Controller\Api;
use Symfony\Component\HttpFoundation\Request;
use Nelmio\ApiDocBundle\Annotation\ApiDoc;
use FOS\RestBundle\Controller\Annotations as Rest;
use FOS\RestBundle\View\View;
use FOS\RestBundle\Controller\FOSRestController;
use AppBundle\Entity\Category;
use AppBundle\Form\CategoryType;
/**
* class CategoryController.
*
* @author Simon Vieille <simon@deblan.fr>
*/
class CategoryController extends FOSRestController
{
/**
* Get categories.
*
* @Rest\View
*
* @ApiDoc(
* description="Get categories.",
* )
*
* @param Request $request
*
* @return array
*/
public function getCategoriesAction(Request $request)
{
return $this->getDoctrine()
->getRepository(Category::class)
->findAll();
}
/**
* Get a category.
*
* @Rest\View
*
* @ApiDoc(
* description="Get a category.",
* )
*
* @param Request $request
*
* @return mixed
*/
public function getCategoryction(Request $request, Category $category)
{
return $category;
}
/**
* Create a category.
*
* @Rest\View
* @Rest\Post("/categories/new")
* @ApiDoc(
* description="Create a category.",
* input={
* "class"="AppBundle\Form\CategoryType"
* }
* )
*
* @param Request $request
*
* @return mixed
*/
public function postCategoryNewAction(Request $request)
{
$object = new Category();
$form = $this->createForm(CategoryType::class, $object);
$form->handleRequest($request);
if (!$form->isSubmitted() || !$form->isValid()) {
return $this->view($form->getErrors(true), 400);
}
$em = $this->getDoctrine()->getManager();
$em->persist($form->getData());
$em->flush();
return ['status' => true];
}
}

View file

@ -0,0 +1,36 @@
<?php
namespace AppBundle\Controller;
use Symfony\Component\HttpFoundation\Request;
use Trinity\Bundle\ContentManagerBundle\Controller\PageController;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Symfony\Component\Routing\Annotation\Route;
use AppBundle\Entity\Category;
use AppBundle\Form\CategoryType;
/**
* class CategoryController.
*
* @author Simon Vieille <simon@deblan.fr>
*/
class CategoryController extends Controller
{
/**
* Categories page.
*
* @Template()
* @Route("/", name="example")
*
* @param Request $request
*
* @return \Symfony\Bundle\FrameworkBundle\Controller\Response
*/
public function indexAction(Request $request)
{
return [
'form' => $this->createForm(CategoryType::class, new Category())->createView(),
];
}
}

View file

@ -0,0 +1,50 @@
<?php
namespace AppBundle\Form;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Validator\Constraints\NotBlank;
use Symfony\Component\Form\Extension\Core\Type\TextType;
class CategoryType extends AbstractType
{
/**
* {@inheritdoc}
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add(
'name',
TextType::class,
[
'label' => 'Nom',
'required' => false, // html5 validation disable for the example
'constraints' => [
new NotBlank(),
],
]
);
}
/**
* {@inheritdoc}
*/
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => 'AppBundle\Entity\Category',
'csrf_protection' => false,
'allow_extra_fields' => true,
]);
}
/**
* {@inheritdoc}
*/
public function getBlockPrefix()
{
return '';
}
}

View file

@ -0,0 +1,61 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
{{ form_row(form.name) }}
<pre id="response"></pre>
<input type="button" id="submit" value="Save">
<ul id="list">
</ul>
<script src="//codeorigin.jquery.com/jquery-1.10.2.min.js"></script>
<script src="{{ asset('bundles/fosjsrouting/js/router.js') }}"></script>
<script src="{{ asset('bundles/fosjsrouting/js/fos_js_routes.js') }}"></script>
<script>
(function(w, $) {
var listCategories = function() {
$.ajax({
url: Routing.generate('get_categories'), // Si tes scripts sont dans un fichiers JS
}).done(function(collection) {
var $list = $('#list').html('');
collection.forEach(function(value) {
$list.append($('<li>').html(value.name));
});
});
}
$('#submit').click(function() {
var name = $('#name').val();
$.ajax({
url: Routing.generate('post_category_new'),
method: 'POST',
data: {
name: name,
}
}).done(function(response) {
$('#response').text(JSON.stringify(response, true));
listCategories();
}).fail(function(response) {
$('#response').text(JSON.stringify(response.responseJSON, null, 4));
listCategories();
});
});
listCategories();
})(window, jQuery);
</script>
</body>
</html>