Symfony - dodawanie i pobieranie danych z bazy danych SQL

Stronę tą wyświetlono już: 283 razy

Połączenie z bazą danych już skonfigurowane, udało się stworzyć bazę danych, udało się dodać do bazy danych tablicę to teraz czas na dodanie do bazy danych jakiś danych! Bo cóż mi po bazie danych, która nic nie przechowuje? Zajmijmy się więc tym jakże palącym problemem przerabiając nieco plik src/Controllers/BaseController.php do następującej jakże przebiegłej postaci:

Listing 1
  1. <?php
  2. namespace AppController;
  3. use SymfonyBundleFrameworkBundleControllerAbstractController;
  4. use SymfonyComponentRoutingAnnotationRoute;
  5. use SymfonyComponentHttpFoundationResponse;
  6. use AppEntityPage;
  7. class PageController extends AbstractController
  8. {
  9. /**
  10. * @Route("/addPage", name="addPage")
  11. */
  12. public function addPage()
  13. {
  14. if(array_key_exists("pageTitle", $_POST) &&
  15. $_POST["pageTitle"] !== '' &&
  16. $this->getDoctrine()->getRepository(Page::class)->findOneBy(['Title' => $_POST["pageTitle"]]) === null){
  17. $entityManager = $this->getDoctrine()->getManager();
  18. $page = new Page($_POST["pageTitle"]);
  19. $page->setTitle($_POST["pageTitle"]);
  20. $page->setContent(array_key_exists("pageContent", $_POST) ? $_POST["pageContent"] : "");
  21. $entityManager->persist($page);
  22. $entityManager->flush();
  23. }
  24. return $this->render('page/index.html.twig', [
  25. 'controller_name' => 'PageController',
  26. ]);
  27. }
  28. /**
  29. * @Route("/{pageTitle}", name="pages")
  30. */
  31. public function page($pageTitle)
  32. {
  33. $convertedPageTitle = str_replace("-", " ", $pageTitle);
  34. $page = $this->getDoctrine()
  35. ->getRepository(Page::class)
  36. ->findOneBy(['Title' => $convertedPageTitle]);//find($id);
  37. var_dump($convertedPageTitle);
  38. if (!$page) {
  39. /*throw $this->createNotFoundException(
  40. 'No page found for ' . $pageTitle
  41. );*/
  42. return new Response("Oh no!!! I can't find page:" . $pageTitle);
  43. }
  44. return new Response($page->getContent());
  45. }
  46. }

Cóż my tutaj mamy? W pierwszej metodzie o jakże przewrotnej nazwie addPage odczytuję dane z tablicy $_POST, która jak nie trudno wyczytać z kodu powinna zawierać co najmniej jeden wypełniony klucz o równie przewrotnej nazwie pageTitle. Dane te będą oczywiście pochodziły od formularza, który umieszczony został w szablonie strony znajdującej się w pliku template/page/index.html.twig. Kod sprawdza również, czy w bazie danych nie istnieje już strona o nazwie podanej przez użytkownika. A dzieje się to za sprawką tego skrawka kodu:

Listing 2
  1. $this->getDoctrine()->getRepository(Page::class)->findOneBy(['Title' => $_POST["pageTitle"]]) === null

Z kolei dodawaniem danych do bazy danych zajmuje się ten fragmencik kodu:

Listing 3
  1. $entityManager = $this->getDoctrine()->getManager();
  2. $page = new Page($_POST["pageTitle"]);
  3. $page->setTitle($_POST["pageTitle"]);
  4. $page->setContent(array_key_exists("pageContent", $_POST) ? $_POST["pageContent"] : "");
  5. $entityManager->persist($page);
  6. $entityManager->flush();

Klasa Page została utworzona przy okazji tworzenia tabelki do bazy danych i to ona pozwala na łączenie się z konkretną tabelką bazy danych. Dzięki temu rozwiązaniu mogę łatwo operować na danych znajdujących się w bazie. Rzućmy więc łaskawym okiem na tęże klasę, której kod źródłowy powinien znajdować się w folderze src/Entity/Page.php:

Listing 4
  1. <?php
  2. namespace AppEntity;
  3. use DoctrineORMMapping as ORM;
  4. /**
  5. * @ORMEntity(repositoryClass="AppRepositoryPageRepository")
  6. */
  7. class Page
  8. {
  9. /**
  10. * @ORMId()
  11. * @ORMGeneratedValue()
  12. * @ORMColumn(type="integer")
  13. */
  14. private $id;
  15. /**
  16. * @ORMColumn(type="string", length=255, nullable=true)
  17. */
  18. private $Title;
  19. /**
  20. * @ORMColumn(type="text", nullable=true)
  21. */
  22. private $content;
  23. public function getId(): ?int
  24. {
  25. return $this->id;
  26. }
  27. public function getTitle(): ?string
  28. {
  29. return $this->Title;
  30. }
  31. public function setTitle(?string $Title): self
  32. {
  33. $this->Title = $Title;
  34. return $this;
  35. }
  36. public function getContent(): ?string
  37. {
  38. return $this->content;
  39. }
  40. public function setContent(?string $content): self
  41. {
  42. $this->content = $content;
  43. return $this;
  44. }
  45. }

Jeżeli nie masz krótkiej pamięci i czytasz ten dział od samego początku aż dotarłeś do tej strony to powinieneś już kojarzyć skąd to się wzięło do diaska! Jak widać ta klasa całkiem zgrabnie opisuje pola tabeli, ma też odpowiednie metody ustawiające i pobierające jej pola. Jest tutaj coś w rodzaju opisu jakiego typu są pola tejże klasy w bazie danych no po prostu full wypas!

Zerknijmy jeszcze łaskawym okiem na plik template/page/index.html.twig, w którym znajduje się formularz:

Listing 5
  1. {% extends 'base.html.twig' %}
  2. {% block title %}Hello PageController!{% endblock %}
  3. {% block body %}
  4. <div class="container">
  5. <form action="" method="POST">
  6. <div class="form-group">
  7. <label for="pageTitle" class="form-control">
  8. Tytuł strony:
  9. </label>
  10. <input type="text" maxlength="255" minlength="5" required name="pageTitle"/>
  11. </div>
  12. <div class="form-group">
  13. <label for="pageContent" class="form-control">
  14. Treść strony:
  15. </label>
  16. <textarea name="pageContent" class="form-control"></textarea>
  17. </div>
  18. <button class="btn btn-primary" type="submit">Dodaj stronę</button>
  19. </form>
  20. </div>
  21. {% endblock %}

Jak widać na załączonym kodzie nie ma tu zbyt wiele do omówienia, dodam jeszcze zawartość pliku template/base.html.twig:

Listing 6
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>{% block title %}Welcome!{% endblock %}</title>
  6. {% block stylesheets %}
  7. <link rel="stylesheet"
  8. href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css"
  9. integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T"
  10. crossorigin="anonymous">
  11. {% endblock %}
  12. </head>
  13. <body>
  14. {% block body %}{% endblock %}
  15. {% block javascripts %}
  16. <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js"
  17. integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo"
  18. crossorigin="anonymous"></script>
  19. <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js"
  20. integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1"
  21. crossorigin="anonymous"></script>
  22. <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js"
  23. integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM"
  24. crossorigin="anonymous"></script>
  25. {% endblock %}
  26. </body>
  27. </html>

Podgląd strony localhost:8000/addPage wygląda następująco:

Symfony - formularz wysyłający dane do dodania do bazy danych
Rys. 1
Symfony - formularz wysyłający dane do dodania do bazy danych

Powróćmy jeszcze tylko do listingu 1, gdzie w metodzie page umieszczony został kod, który pobiera dane z bazy danych i wyświetla je na stronie.

Komentarze