Uruchamianie serwera deweloperskiego na wirtualnej maszynie

VirtualBox ze skonfigurowanymi serwerami wirtualnymiW mojej codziennej pracy przy programowaniu aplikacji webowych mam wiele lokalnie skonfigurowanych wirtualnych hostów do obsługi poszczególnych projektów. Niestety wszystkie aplikacje działają w tym samym środowisku (wersja Apache, PHP, RoR, MySQL, itp.), a ewentualne zróżnicowanie jest problematyczne. Niedawno przeniosłem jednak projekty do wirtualnej maszyny, gdzie mogę mieć dowolną konfigurację środowiska nie zmieniając mojej lokalnej.

Co dokładnie daje mi takie rozwiązanie? Mam zainstalowany serwer linuksowy (Ubuntu w moim przypadku) na podstawowej maszynie i tam skonfigurowane wszystkie projekty. Są tam też uruchomione domyślne wersje serwerów z repozytorium. Jeżeli jednak potrzebuję sprawdzić działanie serwisu w innej wersji oprogramowania (np. PHP 6.0), robię klon wirtualnej maszyny, konfiguruję takie oprogramowanie, jakie potrzebuję i... voila, moje aplikacje uruchamiane są w nowym środowisku. Mój lokalny system jest niezmienony, a powrót do poprzedniej konfiguracji to poprostu wyłączenie nowego serwera i włączenie poprzedniego. Bardzo wygodne!

Największą zaletą tego rozwiązania jest to, że nie muszę zmieniać mojego środowiska programistycznego. Wszystkie pliki umieszczone są cały czas na mojej stacji roboczej i mogę na niej uruchamiać dowolne oprogramowanie do tworzenia kodu (np. NetBeans, RadRails czy gedit) oraz testowania (przeglądarki WWW).  I to wszystko za pomocą darmowego oprogramowania! Czy może być lepiej?

wykop.pl facebook.com twitter.com

PHP 5.4: wywołanie metody przy tworzeniu obiektu!

Logo PHPKrótko i na temat: najnowsze wydanie PHP 5.4 RC1 dostało nową funkcjonalność - wywoływanie metody od razu przy tworzeniu instancji obiektu. Bardzo często w kodzie pojawia się utworzenie obiektu tylko po to, żeby jedną metodę wywołać, np. pobrać dane z bazy:

  1. $dbArticles = new DbArticles;
  2. $articles = $dbArticles->fetch(array('page' => 3));

Teraz można to ubrać w jedno polecenie:

  1. $articles = (new DbArticles)->fetch(array('page' => 3));

Zmiana kosmetyczne i głównie dla "upiększenia" kodu (chociaż przy okazji nie jest tworzona zmienna), ale moim zdaniem świeta rzecz. Zdarzało mi się wcześniej nawet robić metodę statyczną do pobierania instancji, żeby mniej więcej coś takiego zasymulować, podczas gdy np. JavaScript i innę języki mają to od dawna. Teraz ma to też PHP!

wykop.pl facebook.com twitter.com

Modele i formularze Zend Framework - automatyzacja zapisu

Edycja artykułu w serwisie wołomiński.netNa codzień pracuję w Zend Framework. Praca jest bardzo przyjemna, framework jest fajnie napisany, obiektowo, elastycznie (wiele klas można rozszerzyć, jest wiele miejsc, w których domyślne klasy są gotowe do uruchomienia naszego kodu, itp.). Ale ma też wiele wad i braków, które często są rozwiązane w innych frameworkach. Twórcy ZF wiedzą o wielu z nich i obiecują, że szykowana wersja 2.0 będzie lepiej przemyślana i napisana. Ale póki nie mamy wersji 2.0 (a nawet jak będzie, nie wiadomo, czy wszystkie problemy zostaną weliminowane) trzeba sobie jakoś radzić. Jednym z problemów, które spotykam w niemal każdym projekcie, jest mechanizm zapisywania danych wysłanych przez użytkownika.

wykop.pl facebook.com twitter.com

AJAX i JSON w Zend Framework

Zacząłem niedawno nowy projekt. Kolejny oparty o Zend Framework, a tym razem w znacznym stopniu wykorzystujący tzw. AJAX. Jednak zamiast zwracać XML wolę dane dostawać jako JSON. Jak to robię, wykorzystując dobrodziejstwa ZF? Pokażę na przykładzie akcji logowania.

Akcja logowania nie generuje u mnie żadnych formularzy ani tekstu. Służy tylko do wywołania przez zapytanie asynchroniczne i zwrócenia danych jako JSON.

Oto kod akcji:

  1. class AccountController extends Zend_Controller_Action
  2. {
  3.     function signinAction()
  4.     {
  5.         if($this->view->checkLogin())die();
  6.         $this->_helper->layout->setLayout('json');
  7.         $this->view->json = array('error'=>0, 'signin'=>false, 'message'=>'');
  8.         if($this->_request->isPost())
  9.         {
  10.             $f = new Zend_Filter_StripTags();
  11.             $login = $f->filter($this->_request->getPost('login',''));
  12.             $password = $f->filter($this->_request->getPost('password',''));
  13.             if(!empty($login))
  14.             {
  15.                 $authAdapter = new Zend_Auth_Adapter_DbTable(Zend_Db_Table::getDefaultAdapter(), 'users', 'email', 'passwd', 'MD5(?) AND is_deleted = 0');
  16.                 $authAdapter->setIdentity($login);
  17.                 $authAdapter->setCredential($password);
  18.                 $auth = Zend_Auth::getInstance();
  19.                 $result = $auth->authenticate($authAdapter);
  20.                 if($result->isValid())
  21.                 {
  22.                     $data = $authAdapter->getResultRowObject(array('id_user', 'email', 'name', 'user_role'));
  23.                     $auth->getStorage()->write($data);
  24.                     $this->view->json['signin']=true;
  25.                 }
  26.             }
  27.         }
  28.         if(!$this->view->json['signin'])
  29.             $this->view->json['message']='Podane e-mail i hasło nie pasują do siebie.';
  30.     }
  31. }

Po kolei

Cała magia zaczyna się od

  1. $this->_helper->layout->setLayout('json');
  2. $this->view->json = array('error'=>0, 'signin'=>false, 'message'=>'');

czyli wybrania layoutu dla tej akcji i zainicjowania tablicy json w obiekcie view. Dalej odbywa się logowanie za pomocą modułu Zend_Auth (o tym może przy innej okazji) i odpowiednie wypełnianie tablicy json.

A po co był ten wybór layoutu? To nowość w wersji 1.5 frameworka. W pliku bootstrap (zazwyczaj index.php) należy go zainicjować dodając linijkę:

  1. Zend_Layout::startMvc(array('layoutPath'=>ROOT_DIR.'/application/views/layouts/'));

Domyślny layout należy umieścić w pliku /application/views/layouts/layout.phtml - będzie on wczytywany dopóki go dla danej akcji nie wyłączymy lub nie zmienimy. To drugie zrobiłem właśnie w akcji logowania. A w pliku /application/views/layouts/json.phtml wrzuciłem tylko:

  1. <?=$this->json(isset($this->json)?$this->json:array())?>

i wtedy cała odpowiedź akcji to przerobiona tablica json za pomocą zendowego helpera json(). Reszta to już kwestia JS i odpowiedniego odczytania zwróconego obiektu. Korzystam z mootools i tamtejszej metody Json.evaluate(); pobieranie danych za pomocą Json.Remote generowało błędy.

  1. /*
  2.  * url - adres akcji logowania - w przykładzie /account/signin/
  3.  * params - informacje logowania
  4.  */
  5. new Ajax(url, {'data':params, 'method': 'post', 'onComplete': function(t){
  6.         var data = Json.evaluate(t);
  7.         if(!data)
  8.                 alert('Wystąpił błąd podczas logowania!');
  9.         if(data.error)
  10.                 alert('Wystąpił błąd podczas logowania!');
  11.         if(data.signin)
  12.                 alert('Zalogowany!');
  13.         else
  14.                 alert(data.message);
  15. }

Podsumowanie

Oczywiście logowanie to tylko przykład tworzenia wyniku JSON. Najważniejsze elementy to:

  • zainicjowanie Zend_Layout;
  • utworzenie tablicy json (tylko ten krok należy wykonać w każdej akcji, pozostałe wykonają się automagicznie);
  • zdefiniowanie layoutu jsonowego;
  • przekształcenie tablicy do JSON w layoucie;
  • skrypt akcji w views może zostać pusty.
wykop.pl facebook.com twitter.com

dekoderek-jogg