Witaj, Gościu O nas | Kontakt | Mapa
Wortal Forum PHPEdia.pl Planeta Kubek IRC Przetestuj się!

Frameworki dla PHP, czyli wydajne tworzenie aplikacji

Warstwa usług systemowych

W typowej aplikacji istnieją usługi systemowe, których nie da się przyporządkować tylko do jednej z warstw MVC. Dobrym przykładem takiej usługi jest tworzenie wpisów do dziennika zdarzeń (ang. logging). Najczęściej chcielibyśmy śledzić to, co dzieje się zarówno w warstwie kontrolera (np. jakie akcje są wywoływane) jak i modelu (np. jakie zapytania są wysyłane do bazy danych). Kolejnym przykładem może być obsługa cache, wysłanie e-mail`a czy sprawdzanie uprawnień. Wszystkie te usługi mogą pojawić się wielokrotnie w modelu lub kontrolerze praktycznie w każdej aplikacji WWW. Są więc idealnymi kandydatami na wbudowanie ich do frameworka.

Spójrzmy na Listing 10. Znajduje się tam przykładowa usługa DBManager odpowiedzialna za nawiązywanie połączenia z bazą danych. Zauważmy, że klasa DBManager jest statyczna. Chcemy mieć dostęp do bazy z wielu różnych miejsc frameworka oraz otwarte tylko jedno połączenie. Sposób wykorzystania klasy DBManager przedstawiliśmy już w konstruktorze DAO ( Listing 10).

Usługi systemowe, rozciągające się na wiele warstw, wprowadzają pewne zamieszanie w architekturze systemu. Chcemy mieć do nich łatwy dostęp z wielu fragmentów kodu, a jednocześnie najczęściej potrzebujemy tylko jednej instancji danego obiektu. W takich przypadkach często stosowanym podejściem, którego należy zdecydowanie unikać, jest używanie zmiennych globalnych.

Wracając do przykładu z połączeniem do bazy danych, moglibyśmy je otwierać we Front Controllerze, zapisywać w zmiennej globalnej, do której sięgalibyśmy w razie potrzeby. Niestety, użycie zmiennych globalnych w takim przypadku ma dwie zasadnicze wady. Po pierwsze oznacza konieczność włączenia biblioteki AdoDB i otwarcie połączenia z bazą zawsze, nawet dla akcji, które nie potrzebują do niej dostępu (np. formularz dodawania nowej wiadomości). Po drugie, nasz kod staje się bardzo zależny od zmiennej globalnej -gdybyśmy chcieli użyć naszego obiektu DAO w innym projekcie, musielibyśmy pamiętać o konieczności utworzenia wszystkich potrzebnych zmiennych globalnych. Zastanówmy się, co by się stało, gdybyśmy chcieli użyć DAO w innym projekcie, który sam zarządza połączeniami z bazą danych? Oczywiście, musielibyśmy zdublować to połączenie w zmiennej globalnej.

Użycie statycznej usługi systemowej typu DBManager nie uchroni nas wprawdzie przed wszystkimi wadami związanymi ze zmiennymi globalnymi, ale czyni je mniej dokuczliwymi. Prosty kod DBManagera możemy łatwo podmieniać integrując w ten sposób nasze DAO z dowolną strategią otwierania połączenia z bazą. Niejako przy okazji uzyskaliśmy efekt tzw. lazy include, dzięki któremu potrzebna biblioteka jest włączana i inicjalizowana tylko wtedy, gdy jest naprawdę potrzebna.

Listing 7. Kontroler akcji

<?php
require_once('newsmodeldao.class.php');
require_once('newsmodel.class.php');
class newslistaction {
    private $_newsmodeldao;
    public function __construct(){
        $this->_newsmodeldao =
        new NewsModelDao();
    }
    public function processRequest(){
        $result_arr =
        $this->_newsmodeldao->
        findAllNews();
        $mv = new ModelAndView();
        $mv->setModel($result_arr);
        $mv->setView('news_list.view.php');
        return $mv;
    }
}
?>

Listing 8. Front Controller po wprowadzeniu obsługi wyjątków

<?php
require_once('conf/index.conf.php');
require_once('lib/core/ModelAndView.class.php');
try{
    $action_to_run = $_GET['action'];
    if ($action_to_run != '') {
        $action_file_name = DIR_ACTIONS.'/'.$action_to_run.'.action.php';
        if (file_exists($action_file_name)) {
            require_once($action_file_name);
            $actionclassname = $action_to_run.'action';
            $actioncontroller = new $actionclassname();
            $mv = $actioncontroller->processRequest();
            if ($mv!=null) {
                require_once(SMARTY_DIR_LIB.'/Smarty.class.php');
                $smarty = new Smarty();
                $smarty->tempalte_dir = SMARTY_DIR_TEMPALTES;
                $smarty->compile_dir = SMARTY_DIR_TEMPALTES_C;
                $smarty->debugging = SMARTY_DEBUG;
                $smarty->assign($mv->getModel());
                $smarty->display($mv->getView());
            }
        } else {
            throw new Exception("Brak pliku akcji '$action_file_name' do uruchomienia!");
        }
    } else {
        throw new Exception("Brak akcji do uruchomienia!");
    }
}
catch(Exception $e){
    print_r($e);
}
?>
Informacje na podobny temat:
Wasze opinie
Wszystkie opinie użytkowników: (11)
Adam
Czwartek 14 Styczeń 2010 6:22:02 pm - pp-layouts <a.lyskawa_at_gmail.com>

A już myślałem, że jestem szaleńcem rozwijając własny framework. A robię tak dlatego, że wychodzi mi zawsze szybciej napisać brakujący komponent X niż nauczyć się od podstaw nowego frameworka. Do tego jeszcze ta siła przyzwyczajeń. Byłbym chory gdybym miał na przykład mieszać php z html w jednym pliku, a np w ZF to norma.

Fajny art
Piątek 09 Styczeń 2009 10:04:20 am - uve

Fajny art, tylko nie rozumiem jednej rzeczy.

Co jest zawarte w klasie newsmodel.clsss.php ?

Pozdr.

pdf
Wtorek 06 Styczeń 2009 1:40:05 pm - yaotzin <yaotzin1_at_o2.pl>

PDF'a dajcież ...

Art
Piątek 08 Sierpień 2008 12:29:47 pm - Joachim Peters <edaroo_at_gmail.com>

Fajny art, na poziomie :)

Wersja do wydruku
Wtorek 30 Październik 2007 4:09:24 pm - reddy

A czy jest gdzies wersja do wydruku (np. PDF lub calosc na jednej stronie)? Wygodniej czytac z kartki :)

;)
Środa 15 Sierpień 2007 8:41:40 pm - carbolymer

Ciężki artykuł o ciężkim temacie. Listingi zbyt porozrzucane, czasem nie można odnaleźć klas o których jest mowa w tekście. Jest parę literówek w kodzie. Ogólnie jest dobrze.

Dobry artykul
Czwartek 04 Maj 2006 1:45:52 am - SzajbuS <szajbus_at_rambler.com.pl>

Listingi i rysunki troche zle umiejscowione w tekscie, co utrudnia czytanie, ale wartosc merytoryczna wysoka.

Brak druku do PDF
Środa 22 Luty 2006 9:27:25 pm - angel2953

Dlaczego jest brak możliwości pobrania tego artykułu jako pliku PDF ? Lub jeśli ów link istnieje (ja go jakoś nie potrafię zlokalizować) dlaczego jest tak słobo widoczny ?

prosty temat
Sobota 28 Styczeń 2006 6:00:51 pm - emp

po prostu zrob sobie swoje klasy i chierarchie klas i masz szkielety aplikacji i do tego bardzo modularne

Profesjonalizm
Niedziela 15 Styczeń 2006 12:22:17 pm - aztech <scrabblewroclaw_at_op.pl>

Cieszę się, że uwagi jakie zgłosiłem co do wyglądu listingów oraz ich podlinkowania zostały zauważone i szybko wprowadzone. To świadczy o profesjonalnym podejściu osób tworzacych ten wortal.
Brawo!

Brak danych :)
Piątek 13 Styczeń 2006 10:32:09 pm - ..:: pingu ::.. <pingu_at_interia.pl>

W PDF'ie ten artykuł wyglada duzo lepiej :P

Szkoda ze czasem trzeba przejsc na nastepna strone aby zobaczyc listing :(

Mentax.pl    NQ.pl- serwery z dodatkiem świętego spokoju...   
O nas | Kontakt | Mapa serwisu
Copyright (c) 2003-2024 php.pl    Wszystkie prawa zastrzeżone    Powered by eZ publish Content Management System eZ publish Content Management System