Kontroler i Fixtures w tworzeniu aplikacji.

W tekście: Jak wykorzystać wzorzec projektowy MVC w Symfony2? omówiłam dokładnie działanie Model - Kontroler - Widok. Dzięki temu zapewne wiesz już jaką ważną rolę podczas Twojej pracy odgrywa prosty wzorzec projektowy. Dziś chcę abyśmy przyjrzeli się bliżej samemu Kontrolerowi jako jednej z ważniejszych części MVC. Chcę również zainteresować Cię niezbędnym elementem w którą musi być wyposażona każda aplikacja czyli Fixtures.

W prosty sposób dowiesz się jak Kontroler i Fixtures ułatwią Ci pracę nad aplikacją.

kontroler/fixtures

Czym jest Kontroler?

Najprościej mówiąc Kontrolera uznać można po prostu za funkcję PHP. Jest on pewnego rodzaju pośrednikiem, odpowiada bowiem za komunikację między widokiem a modelem. Jego praca polega na pobraniu informacji z modelu i przesłanie ich do widoku, prosto, szybko i komfortowo. Odpowiedź może przybierać różne formy. Może nią być jakaś strona HTML czy też przekierowanie bądź strona błędu 404. Nie wykluczone jest że informacja pojawi się w formie obrazu lub dokumentu XML. Jak widzisz ogromna rozpiętość, ale to i tak nie wszystko ponieważ rodzajów odpowiedzi może być wiele.

Jeżeli chodzi o Kontrolera możesz spotkać się z pojęciem: akcja = metoda kontrolera. Jest to nic innego jak komunikat dla Ciebie że odnosi się to do zwyczajnej metody kontrolera.

Aby wygenerować Kontrolera potrzebne jest nam proste polecenie: app/console generate:controller.

Jak widzisz to nic skomplikowanego, poradzisz sobie z tym nawet z zamkniętymi oczami.

Akcja Kontrolera na przykładzie wyszukiwania artykułu.

Przyjrzyjmy się jak przebiega działanie Kontrolera w praktyce.

public function showArticleAction($id)

{

$article=$this->getDoctrine()->getEntityManager():

$article=$em->getReponsitory('DemoArticleBundle:Article')->find($id);

if(!$article){

throw$this->createNotFoundException('brak takiego artykułu'):

}

return array(

'article'=>$article

):

}

- za pomocą "return array" przekazujemy zmienną "article" do widoku.

Na samym początku korzystamy z EntityManagera jest to główne narzędzie które umożliwi nam pobrać dane z bazy danych.

Na co należy zwrócić uwagę?

Ważne jest, że jako parametr metody przekazane jest ID czyli artykuł nasz artykuł odwołuje się do danego ID, który zostanie przekazany przez adres URL.

Jeśli adres URL nie zostanie znaleziony to w tym momencie wyskoczy nam komunikat Exception, jeżeli się to nie stanie to przekazujemy artykuł który znaleźliśmy.

Jak zapewne już dostrzegłeś, aby przekazać zmienną do widoku musimy zwrócić tablicę i podać jako klucz "article" czyli zmienną do której będziemy się odnosić i wartość.

Aby Twoja aplikacja była kompletna nie możesz zapomnieć o Fixtures.

Niestety nie są one standardowo wbudowane do naszej aplikacji tak jak w Railsach więc sami musimy je sobie dodać. Fixtures są bardzo ważne, za ich pomocą wrzucamy przykładowe dane do bazy. Dzięki nim, możemy wrzucać dane na serwerze, które są na początku np. Kategorie w Produktach. Wyobraź sobie, że masz jakiś produkt wtedy kategorie które są do wszystkich produktów możemy również wrzucić do Fixtures.

Co ważne, dane które raz stworzyliśmy zostają zapisane i korzystać z nich mogą również inni developerzy. Kolejną zaletą jest to, że w momencie kiedy nad projektem pracuje kilka osób to w tym momencie możemy zaoszczędzić czas sobie, ale również pozostałym programistom.

A jak to jest z instalacją?

Fixtures są proste i jestem przekonana, że zrozumie je każdy. Instalacja jest dokładnie taka jak przy instalowaniu zwyczajnego Bundla.

Wpisujemy sobie:

{

"require": {

"doctrine/doctrine-fixtures-bundle": "2.2.*"

}

}

W zarejsterowaniu odpowiedniego Bundla pomoże nam :

// ...

public function registerBundles()

{

$bundles = array(

// ...

);

if (...) {

// ...

$bundles[] = new DoctrineBundleFixturesBundleDoctrineFixturesBundle();

};

// ...

}

Aby zapisać teraz przykładowe dane musimy utworzyć w naszym głównym Bundlu folder : DataFixtures/ORM, powinno to wyglądać w ten sposób:

// src/Acme/HelloBundle/DataFixtures/ORM/LoadUserData.php

namespace AcmeHelloBundleDataFixturesORM;

use DoctrineCommonDataFixturesFixtureInterface;

use DoctrineCommonPersistenceObjectManager;

use AcmeHelloBundleEntityUser;

class LoadUserData implements FixtureInterface

{

/**

* {@inheritDoc}

*/

public function load(ObjectManager $manager)

{

$userAdmin = new User();

$userAdmin->setUsername('admin');

$userAdmin->setPassword('test');

$manager->persist($userAdmin);

$manager->flush();

}

}

Samo napisanie Fixtures nie wiąże się z natychmiastowym zładowaniem danych. Dopiero polecenie : doctrine:fixtures:load - ładuje te dane jako przykładowe.

W razie wątpliwości proponuję skorzystać z dokumentacji: http://symfony.com/doc/current/bundles/DoctrineFixturesBundle/index.html.

Samo stworzenie aplikacji nie jest jeszcze sukcesem, ale stworzenie aplikacji ze zrozumieniem, jest już czymś wartym uznania. Najlepszym krokiem żeby tworzyć dobre aplikacje jest zrozumienie wzorca MVC w Symfony. Dodatkowo jeżeli uzupełnisz aplikację we wszystkie niezbędne jej elementy będzie ona idealna i z pewnością niepowtarzalna. Konieczne zatem jest poznanie funkcji jakie pełni Kontroler i Fixtures przy tworzeniu aplikacji - pamiętaj wiedzy nigdy nie jest za dużo.

Pamiętaj, że programowanie nie musi być trudne, zapraszam do zapoznania się z innymi naszymi artykułami, które w prosty i przystępny sposób pomogą Ci zrozumieć podstawy i sprawnie pozyskać niezbędną wiedzę.