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:
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: