Symfony - dodawanie i pobieranie danych z bazy danych SQL

Autor podstrony: Krzysztof Zajączkowski

Stronę tą wyświetlono już: 3089 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:

<?php namespace AppController; use SymfonyBundleFrameworkBundleControllerAbstractController; use SymfonyComponentRoutingAnnotationRoute; use SymfonyComponentHttpFoundationResponse; use AppEntityPage; class PageController extends AbstractController { /** * @Route("/addPage", name="addPage") */ public function addPage() { if(array_key_exists("pageTitle", $_POST) && $_POST["pageTitle"] !== '' && $this->getDoctrine()->getRepository(Page::class)->findOneBy(['Title' => $_POST["pageTitle"]]) === null){ $entityManager = $this->getDoctrine()->getManager(); $page = new Page($_POST["pageTitle"]); $page->setTitle($_POST["pageTitle"]); $page->setContent(array_key_exists("pageContent", $_POST) ? $_POST["pageContent"] : ""); $entityManager->persist($page); $entityManager->flush(); } return $this->render('page/index.html.twig', [ 'controller_name' => 'PageController', ]); } /** * @Route("/{pageTitle}", name="pages") */ public function page($pageTitle) { $convertedPageTitle = str_replace("-", " ", $pageTitle); $page = $this->getDoctrine() ->getRepository(Page::class) ->findOneBy(['Title' => $convertedPageTitle]);//find($id); var_dump($convertedPageTitle); if (!$page) { /*throw $this->createNotFoundException( 'No page found for ' . $pageTitle );*/ return new Response("Oh no!!! I can't find page:" . $pageTitle); } return new Response($page->getContent()); } }

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:

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

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

$entityManager = $this->getDoctrine()->getManager(); $page = new Page($_POST["pageTitle"]); $page->setTitle($_POST["pageTitle"]); $page->setContent(array_key_exists("pageContent", $_POST) ? $_POST["pageContent"] : ""); $entityManager->persist($page); $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:

<?php namespace AppEntity; use DoctrineORMMapping as ORM; /** * @ORMEntity(repositoryClass="AppRepositoryPageRepository") */ class Page { /** * @ORMId() * @ORMGeneratedValue() * @ORMColumn(type="integer") */ private $id; /** * @ORMColumn(type="string", length=255, nullable=true) */ private $Title; /** * @ORMColumn(type="text", nullable=true) */ private $content; public function getId(): ?int { return $this->id; } public function getTitle(): ?string { return $this->Title; } public function setTitle(?string $Title): self { $this->Title = $Title; return $this; } public function getContent(): ?string { return $this->content; } public function setContent(?string $content): self { $this->content = $content; return $this; } }

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:

{% extends 'base.html.twig' %} {% block title %}Hello PageController!{% endblock %} {% block body %} <div class="container"> <form action="" method="POST"> <div class="form-group"> <label for="pageTitle" class="form-control"> Tytuł strony: </label> <input type="text" maxlength="255" minlength="5" required name="pageTitle"/> </div> <div class="form-group"> <label for="pageContent" class="form-control"> Treść strony: </label> <textarea name="pageContent" class="form-control"></textarea> </div> <button class="btn btn-primary" type="submit">Dodaj stronę</button> </form> </div> {% endblock %}

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

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>{% block title %}Welcome!{% endblock %}</title> {% block stylesheets %} <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous"> {% endblock %} </head> <body> {% block body %}{% endblock %} {% block javascripts %} <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous"></script> <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script> {% endblock %} </body> </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.