Documentation

This commit is contained in:
Simon Vieille 2016-11-24 00:12:34 +01:00
parent 8b3d43beb3
commit c8566ce06c
6 changed files with 44 additions and 2 deletions

View File

@ -31,6 +31,8 @@ class AppKernel extends Kernel
$bundles[] = new Symfony\Bundle\WebProfilerBundle\WebProfilerBundle(); $bundles[] = new Symfony\Bundle\WebProfilerBundle\WebProfilerBundle();
$bundles[] = new Sensio\Bundle\DistributionBundle\SensioDistributionBundle(); $bundles[] = new Sensio\Bundle\DistributionBundle\SensioDistributionBundle();
$bundles[] = new Sensio\Bundle\GeneratorBundle\SensioGeneratorBundle(); $bundles[] = new Sensio\Bundle\GeneratorBundle\SensioGeneratorBundle();
// app (ne pas oublier)
$bundles[] = new Nelmio\ApiDocBundle\NelmioApiDocBundle(); $bundles[] = new Nelmio\ApiDocBundle\NelmioApiDocBundle();
} }

View File

@ -13,6 +13,17 @@ use AppBundle\Form\CategoryType;
/** /**
* class CategoryController. * class CategoryController.
* *
* Les controleurs de ce type (chargés un à un via `routing.yml`)
* permettent de créer des accès type API.
*
* La nomenclature des méthodes permettent de définir
* le type de requête HTTP permis et la route associée.
*
* Il est possible de modifier le chemin (je l'ai fais pour l'exemple).
*
* Tout ce qui est @ApiDoc permet de générer les données pour la sandox
* qui fait aussi office de documentation pour l'API.
*
* @author Simon Vieille <simon@deblan.fr> * @author Simon Vieille <simon@deblan.fr>
*/ */
class CategoryController extends FOSRestController class CategoryController extends FOSRestController

View File

@ -19,6 +19,11 @@ class CategoryController extends Controller
/** /**
* Categories page. * Categories page.
* *
* Cette action permet d'afficher le formulaire pour
* ajouter une catégorie. Le javascript inscrit dans le template
* associé va faire appel à l'API pour afficher les catégories
* existantes et permettre d'en ajouter.
*
* @Template() * @Template()
* @Route("/", name="example") * @Route("/", name="example")
* *

View File

@ -7,6 +7,15 @@ use Doctrine\ORM\Mapping as ORM;
/** /**
* Category. * Category.
* *
* Tous les objets retournés dans l'API sont transformés
* de manière à pouvoir être retournés au format JSON ou XML.
* Le comportement par défaut est de récupérer l'ensemble des attributs
* et de les retourner tels quels. Je prend le parti de choisir
* les données à afficher via les annotations JMS et les méthodes
* que je préfix par `getRest`. Ça permet donc de filtrer
* ce que l'on veut voir apparître dans l'API et ce qui ne doit pas y
* figurer.
*
* @ORM\Table(name="category") * @ORM\Table(name="category")
* @ORM\Entity(repositoryClass="AppBundle\Repository\CategoryRepository") * @ORM\Entity(repositoryClass="AppBundle\Repository\CategoryRepository")
* @JMS\Serializer\Annotation\ExclusionPolicy("all") * @JMS\Serializer\Annotation\ExclusionPolicy("all")

View File

@ -21,7 +21,11 @@ class CategoryType extends AbstractType
TextType::class, TextType::class,
[ [
'label' => 'Nom', 'label' => 'Nom',
'required' => false, // html5 validation disable for the example // Je vire le required HTML pour permettre de valider
// le formulaire avec une donnée vide et non valide
// Tu pourras voir de quelle manière les erreurs
// sont remontées
'required' => false,
'constraints' => [ 'constraints' => [
new NotBlank(), new NotBlank(),
], ],
@ -36,6 +40,7 @@ class CategoryType extends AbstractType
{ {
$resolver->setDefaults([ $resolver->setDefaults([
'data_class' => Category::class, 'data_class' => Category::class,
// Ces 2 configurations sont importantes
'csrf_protection' => false, 'csrf_protection' => false,
'allow_extra_fields' => true, 'allow_extra_fields' => true,
]); ]);
@ -46,6 +51,7 @@ class CategoryType extends AbstractType
*/ */
public function getBlockPrefix() public function getBlockPrefix()
{ {
// Très important également
return ''; return '';
} }
} }

View File

@ -21,10 +21,14 @@
<script src="{{ asset('bundles/fosjsrouting/js/fos_js_routes.js') }}"></script> <script src="{{ asset('bundles/fosjsrouting/js/fos_js_routes.js') }}"></script>
<script> <script>
// J'utilise jQuery par flemme
(function(w, $) { (function(w, $) {
var listCategories = function() { var listCategories = function() {
$.ajax({ $.ajax({
url: Routing.generate('get_categories'), // Si tes scripts sont dans un fichiers JS // Si tes scripts sont dans un fichiers JS
// tu peux accéder aux routes (et les générer)
// via cette méthode (voir le README)
url: Routing.generate('get_categories'),
}).done(function(collection) { }).done(function(collection) {
var $list = $('#list').html(''); var $list = $('#list').html('');
@ -47,6 +51,11 @@
$('#response').text(JSON.stringify(response)); $('#response').text(JSON.stringify(response));
listCategories(); listCategories();
}).fail(function(response) { }).fail(function(response) {
// En cas d'erreur, l'API est faite de telle sorte
// que les données mal saisies soient remontées avec le message
// d'erreur associé.
// Avec un peu de code, tu peux automatiser l'affichage des erreurs
// puisque les erreurs sont associés à leur champ respectif.
$('#response').text(JSON.stringify(response.responseJSON, null, 4)); $('#response').text(JSON.stringify(response.responseJSON, null, 4));
listCategories(); listCategories();
}); });