diff --git a/.idea/cc34.iml b/.idea/cc34.iml
index ab219fd..5897e87 100644
--- a/.idea/cc34.iml
+++ b/.idea/cc34.iml
@@ -133,6 +133,9 @@
+
+
+
diff --git a/.idea/php.xml b/.idea/php.xml
index 0069d06..8026c7c 100644
--- a/.idea/php.xml
+++ b/.idea/php.xml
@@ -140,6 +140,9 @@
+
+
+
diff --git a/.idea/symfony2.xml b/.idea/symfony2.xml
new file mode 100644
index 0000000..2dfac5e
--- /dev/null
+++ b/.idea/symfony2.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/README.md b/README.md
index 4f2e592..7437e1e 100644
--- a/README.md
+++ b/README.md
@@ -41,3 +41,8 @@ symfony composer require fakerphp/faker
symfony composer require orm-fixtures --dev
symfony console doctrine:fixtures:load
```
+
+### Question 4
+```bash
+symfony console make:crud Atelier
+```
\ No newline at end of file
diff --git a/src/Controller/AtelierController.php b/src/Controller/AtelierController.php
new file mode 100644
index 0000000..1e16b43
--- /dev/null
+++ b/src/Controller/AtelierController.php
@@ -0,0 +1,78 @@
+render('atelier/index.html.twig', [
+ 'ateliers' => $atelierRepository->findAll(),
+ ]);
+ }
+
+ #[Route('/new', name: 'app_atelier_new', methods: ['GET', 'POST'])]
+ public function new(Request $request, AtelierRepository $atelierRepository): Response
+ {
+ $atelier = new Atelier();
+ $form = $this->createForm(AtelierType::class, $atelier);
+ $form->handleRequest($request);
+
+ if ($form->isSubmitted() && $form->isValid()) {
+ $atelierRepository->save($atelier, true);
+
+ return $this->redirectToRoute('app_atelier_index', [], Response::HTTP_SEE_OTHER);
+ }
+
+ return $this->renderForm('atelier/new.html.twig', [
+ 'atelier' => $atelier,
+ 'form' => $form,
+ ]);
+ }
+
+ #[Route('/{id}', name: 'app_atelier_show', methods: ['GET'])]
+ public function show(Atelier $atelier): Response
+ {
+ return $this->render('atelier/show.html.twig', [
+ 'atelier' => $atelier,
+ ]);
+ }
+
+ #[Route('/{id}/edit', name: 'app_atelier_edit', methods: ['GET', 'POST'])]
+ public function edit(Request $request, Atelier $atelier, AtelierRepository $atelierRepository): Response
+ {
+ $form = $this->createForm(AtelierType::class, $atelier);
+ $form->handleRequest($request);
+
+ if ($form->isSubmitted() && $form->isValid()) {
+ $atelierRepository->save($atelier, true);
+
+ return $this->redirectToRoute('app_atelier_index', [], Response::HTTP_SEE_OTHER);
+ }
+
+ return $this->renderForm('atelier/edit.html.twig', [
+ 'atelier' => $atelier,
+ 'form' => $form,
+ ]);
+ }
+
+ #[Route('/{id}', name: 'app_atelier_delete', methods: ['POST'])]
+ public function delete(Request $request, Atelier $atelier, AtelierRepository $atelierRepository): Response
+ {
+ if ($this->isCsrfTokenValid('delete'.$atelier->getId(), $request->request->get('_token'))) {
+ $atelierRepository->remove($atelier, true);
+ }
+
+ return $this->redirectToRoute('app_atelier_index', [], Response::HTTP_SEE_OTHER);
+ }
+}
diff --git a/src/Form/AtelierType.php b/src/Form/AtelierType.php
new file mode 100644
index 0000000..928e385
--- /dev/null
+++ b/src/Form/AtelierType.php
@@ -0,0 +1,26 @@
+add('nom')
+ ->add('description')
+ ;
+ }
+
+ public function configureOptions(OptionsResolver $resolver): void
+ {
+ $resolver->setDefaults([
+ 'data_class' => Atelier::class,
+ ]);
+ }
+}
diff --git a/templates/atelier/_delete_form.html.twig b/templates/atelier/_delete_form.html.twig
new file mode 100644
index 0000000..4eb7ce9
--- /dev/null
+++ b/templates/atelier/_delete_form.html.twig
@@ -0,0 +1,4 @@
+
diff --git a/templates/atelier/_form.html.twig b/templates/atelier/_form.html.twig
new file mode 100644
index 0000000..bf20b98
--- /dev/null
+++ b/templates/atelier/_form.html.twig
@@ -0,0 +1,4 @@
+{{ form_start(form) }}
+ {{ form_widget(form) }}
+
+{{ form_end(form) }}
diff --git a/templates/atelier/edit.html.twig b/templates/atelier/edit.html.twig
new file mode 100644
index 0000000..c844be6
--- /dev/null
+++ b/templates/atelier/edit.html.twig
@@ -0,0 +1,13 @@
+{% extends 'base.html.twig' %}
+
+{% block title %}Edit Atelier{% endblock %}
+
+{% block body %}
+ Edit Atelier
+
+ {{ include('atelier/_form.html.twig', {'button_label': 'Update'}) }}
+
+ back to list
+
+ {{ include('atelier/_delete_form.html.twig') }}
+{% endblock %}
diff --git a/templates/atelier/index.html.twig b/templates/atelier/index.html.twig
new file mode 100644
index 0000000..f243327
--- /dev/null
+++ b/templates/atelier/index.html.twig
@@ -0,0 +1,37 @@
+{% extends 'base.html.twig' %}
+
+{% block title %}Atelier index{% endblock %}
+
+{% block body %}
+ Atelier index
+
+
+
+
+ Id |
+ Nom |
+ Description |
+ actions |
+
+
+
+ {% for atelier in ateliers %}
+
+ {{ atelier.id }} |
+ {{ atelier.nom }} |
+ {{ atelier.description }} |
+
+ show
+ edit
+ |
+
+ {% else %}
+
+ no records found |
+
+ {% endfor %}
+
+
+
+ Create new
+{% endblock %}
diff --git a/templates/atelier/new.html.twig b/templates/atelier/new.html.twig
new file mode 100644
index 0000000..72b08fe
--- /dev/null
+++ b/templates/atelier/new.html.twig
@@ -0,0 +1,11 @@
+{% extends 'base.html.twig' %}
+
+{% block title %}New Atelier{% endblock %}
+
+{% block body %}
+ Create new Atelier
+
+ {{ include('atelier/_form.html.twig') }}
+
+ back to list
+{% endblock %}
diff --git a/templates/atelier/show.html.twig b/templates/atelier/show.html.twig
new file mode 100644
index 0000000..5b0e05f
--- /dev/null
+++ b/templates/atelier/show.html.twig
@@ -0,0 +1,30 @@
+{% extends 'base.html.twig' %}
+
+{% block title %}Atelier{% endblock %}
+
+{% block body %}
+ Atelier
+
+
+
+
+ Id |
+ {{ atelier.id }} |
+
+
+ Nom |
+ {{ atelier.nom }} |
+
+
+ Description |
+ {{ atelier.description }} |
+
+
+
+
+ back to list
+
+ edit
+
+ {{ include('atelier/_delete_form.html.twig') }}
+{% endblock %}