Some tips on setting up a REST-full app with Zend Framework

I’ve recently been faced with the challenge of setting up a REST-full interface using Zend and I found it to be not so straight forward as one would expect from ZF. At first I tried with Zend_Rest_Server but I gave up quickly for 2 reasons:

  • I didn’t like that it was too much of a RPC style server and almost not at all REST;
  • I was integrating this REST api into an existing web application and I wanted to reuse the routing and bootstraping of the app which meant I had to hack and slash to integrate it which I don’t particularily enjoy.

I turned to the old router and controller instead and it was easier than expected.

Set up a route for the REST api

I wanted to use endpoints that looks like this: /rest/<resource>/[id] so I’ve set up my route as follows:

In application.ini:

1
2
3
4
resources.router.routes.rest.route = "rest/:resource/:id"
resources.router.routes.rest.defaults.controller = "rest"
resources.router.routes.rest.defaults.action = "rest"
resources.router.routes.rest.defaults.id = ""

You could also do this in bootstrap.php :

1
2
3
4
5
6
7
8
$router = Zend_Controller_Front::getInstance()->getRouter();
$router->addRoute(
'rest',
new Zend_Controller_Router_Route(
'rest/:resource/:id',
array('controller' => 'rest','action' => 'rest')
)
);

Extend Zend_Controller_Action to handle REST requests

Here is how a basic rest controller might look like.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
class RestController extends Zend_Controller_Action
{
// HTTP verb to action mapping
protected $_methodMapping = array(
'GET' => 'read',
'POST' => 'create',
'PUT' => 'update',
'DELETE' => 'delete'
);
public function preDispatch()
{
$request = $this->getRequest();
// we only do this pre-dispatching logic if the action is rest
// otherwise we will cause an infinite loop in the front controller
if ($request->getActionName() != 'rest') {
return;
}
// find the HTTP method used to make the request (GET, POST, PUT.. )
$httpMethod = $request->getMethod();
// map it to an action name
$action = $this->_methodMapping[$httpMethod];
// get the data sent by the client
$data = $this->_getData();
// save thid data into the request
$request->setParam('data', $data);
// finaly, forward to the appropriate action
$this->_forward($action);
    }
// a method to send error responsed to clients
protected function _error($code, $message)
{
$response = $this->getResponse();
$response->setHttpResponseCode($code);
$response->setHeader('X-Application-Error-Code', $message);
}
// a method for extracting data from the request
// getting POST and GET values is easy, we can access them using $_GET or
// $_POST superglobals or $request->getParam();
// for PUT and delete we have to parse the raw body of the request
protected function _getData($request)
{
$rawBody = $request->getRawBody();
$contentType = $request->getHeader('Content-Type');
$data = array();
switch (true) {
case strpos($contentType, 'application/json') !== false:
$data = Zend_Json::decode($rawBody);
break;
case strpos($contentType, 'application/xml') !== false:
//$data = /* parse xml */;
break;
}
// if we have POST
if (count($_POST)) {
$data += $_POST;
}
return $data;
}
// helper method to send a response to clients
protected function _sendResponse($data)
{
$response= $this->getResponse();
$response->setHeader('Content-Type', 'application/json');
echo Zend_Json::encode($data);
}
// the init method in wich we disable any layout and view renderers
public function init()
{
$this->_helper->layout()->disableLayout();
$this->_helper->viewRenderer->setNoRender(true);
}
// the dummy action for our controller. this should never be called because
// we are forwarding from it in preDispatch()
public function restAction()
{
}
// GET method
public function readAction()
{
}
// POST method
public function createAction()
{
}
// PUT method
public function updateAction()
{
}
// DELETE method
public function deleteAction()
{
}

Routing and dispatching

I’m being fancy here by using the preDispatch() and _forward to call the actual method. preDispatch() is called before an action is called in the action controller. By calling _forward() I’m basicaly setting the isDispatched flag in the request object to false which will cause the action to be skipped. The front controller action loop will reiterate and redo the process for the new action. To avoind an infinite loop we need a breaking condition, which in this case is $request->getActionName() != 'rest'.

Getting data from client

Another thing worth metioning is how we get the data from the client. PHP makes it easy to access GET and POST data using the superglobals and Zend makes it even easier: $request->getParam(). For some reason, neither PHP nor Zend don’t provide any easy acess to data sent via the other request methods, specificaly PUT, so we have to do this ourselves.

All data sent by client is in the raw http body wich is accessible with $request->getRawBody(). We can also take a look at the Content-Type request header to get a hint of what kind of data we have (JSON, XML, etc..). Headers are acessible with $request->getHeader($headerKey).

Response

To have a truly RESTfull app we should be making good use of the HTTP response codes and headers. A good REST response will include an appropriate reponse code and a helpfull user error message. To do this you can use the setHttpResponseCode and setHeader methods of the reponse object.

Wikipedia has a list of HTTP status codes and you can also take a look at some common REST error responses on MSDN.

Next steps

Depending on your app you might want to turn this into an abstract controller and extend it for each resource or you could also use it as a single entry point and delegate to a separate resource handling class.

Universul e împotriva mea

Nu știu alții cum sunt, dar eu când am de cumpărat ceva valoros îmi plânge inima după fiecare leuț pe care trebuie să îl dau în plus. Pe principiul, dacă te-ai fript cu ciorba sufli și-n iaurt când am de dat bani mulți, mereu încerc să găsesc cea mai buna ofertă, astfel încât banii aia mulți să nu fie chiar atât de mulți. Pentru că nu există sentiment mai covârșitor decât cel pe care îl simți în fața unei vitrine în care tronează obiectul ce tocmai ți l-ai cumpărat, dar la un preț simțitor mai mic.

Mie îmi place laptele. Și când spun că îmi place, ar trebui să înțelegeți ca ÎMI PLACE. Ce treaba are asta cu produsele ce costă bani mulți? Ei bine pentru a putea avea parte de lapte când vreau eu este nevoie de un frigider funcțional în casă pe care să îl pot burduși cu sticle și cutii de lapte. Acum ceva vreme mi s-a stricat frigiderul, am fost nevoit să beau repede tot laptele din el pentru ca nu fac eu risipă la așa ceva. Spre norocul meu nu am dezvoltat nici o intoleranța la lactoza și burta este încă la o dimensiune acceptabilă, cel puțin așa zice prietena mea. Așa că încă ÎMI PLACE laptele la fel de mult și îl beau în continuare în cantități industriale.

Cum spuneam, am avut nevoie imperioasă de un frigider nou. Așa că am luat la puricat magazinele din oraș în căutarea sponsorului perfect pentru dependența mea de lapte. L-am găsit într-un final, nici prea mare, nici prea mic, alb și strălucitor. A fost dragoste la prima vedere, dar magia a spulberat-o repede un angajat ce a venit să mă convingă că este ultimul de acel tip și că este la ofertă până vineri. Era luni. A insistat prea mult pe faptul că e ultimul și că ar fi bine să îl iau acum, ori niciodată! așa ca am plecat acasă și am luat la puricat și magazinele online. Și l-am găsit mai ieftin cu 100 de lei.

Dacă ar fi avut Altex atunci o promoție pentru frigiderul meu similară cu cea pe care o are acum pentru laptopurile cu sistem de operare Microsoft, adică ți se oferă 2x Diferenta dacă găsești în alt magazin online produsul la un preț mai mic, m-aș fi scos. Din păcate promoția Altex e valabilă acum, iar eu am avut nevoie de frigider acum câteva luni.

Marius, am cam puțin lapte în frigider acum, ceea ce mă întristează puțin, dar probabil că un Kit wireless desktop Microsoft, m-ar consola oarecum.

Paznici de noapte

Eram la Ion într-o seară, pe vremea când stăteam amândoi în Nicolina la 2 pași(încrucișați) unu de altul și după ce i-am terminat coniacul din dotare coboară omu în șlapi cu mine să mă conduca până jos, la scară. De la scară până la următorul bloc, până la intersecție, până la următoarea intersecție și așa am ajuns la un bloc oarecare deja la al doilea PET de bere, la a doua oră după miezul nopții.

O seară răcoroasă după o zi toridă, o bere rece după un coniac sec. Veselie și voie bună până când observăm că pe străduța lângă care beam noi încep să treacă următoarele: o mașina de poliție; după vreo 5 minute o mașina de la jandarmerie, apoi după inca vreo 10 minute se întoarce mașina de politie și apoi o mașină de la intervenții speciale. Deja când i-am vazut pe ăștia am simtit morcovul înfingându-se destul de adânc în receptacul pentru că ăștia sânt genu care întâi îți plantează bocancul în gură și apoi te întrebă cine ești și cu ce treabă.

Am decis să ne dăm mai la o parte și ne-am baricadat în scara blocului dar nici acolo n-am scapat de dracu. Eram deja la a nu știu cât-a polietilenă tereftalată de bere, la a nu știu cât-a oră din noapte când întră organul polițist în scară și ne întreabă:
- Bună seara. Locuiți aici?
La care eu, cu candoarea unui om cu 4 litri de bere experiență pe Curiculum Nocturne îi răspund prompt:
- Nu. Noi doar o păzim.

Nu mi-am amintit seara aceea decât acum, după aproape 2 ani și îmi pare rău pentru că probabil a fost tare frumoasă. Morala ar vrea să fie că alcoolul daunează sănătății dar defapt morala e ceva mai pragmatica: nu are sens să bei atât de mult încât să ți se rupă filmu și să nu-ți mai aduci aminte. Asta este o risipă de alcool care nu trebuie iertată ușor.

Cumparatul de pe net

Acum cand toata Europa se modernizeaza, exista scurgeri si mai scapa si la noi cate o picatura de civilizatie si incepe sa se simta. In online au aparut din ce in ce mai multe magazine virtuale iar legislatia din domeniu le permite sa presteze servicii de calitate la distanta si protejeaza cumparatorul impotriva fraudei.

Comertul electronic are avantajele si dezavantajele lui. Pe net gasesti lucruri mai ieftine si intr-o gama mai variata dar trebuie sa fii atent pentru ca mai exista si factorul teapa. Faptul ca tu nu stii sa te documentezi si sa apreciezi calitatea unui produs nu e acelasi lucru cu situatia in care comenzi de pe net ultimul model de adidasi Nike si primesti o pereche de slapi gauriti in talpa.

Se mai intampla ca si la magazine respectabile sa comanzi una si sa primesti alta, dar asta din eroare si deobicei se solutioneaza rapid si amiabil. Am patit-o de mai multe ori, odata cu o camera foto la care trebuia sa primesc gratuit un card de memorie de 4gb. Au uitat sa trimita cardul si aveam doar camera si cardul ei demonstrativ de 8Mb care trebuia bagat in calculator la fiecare 3 poze. Era ridicol. Asa ca i-am sunat, le-am povestit si au fost destul de amabili incat a doua zi sa-mi trimita cardul. Au trimis un curier pentru un amarat de card de memorie si l-au impachetat in ditamai cutia de la o placa de baza in care am scotocit vreo 10 minute pana sa gasesc cardul.

Am patito si azi. Mi-am comandat niste piese de bicicleta si a venit coletul. Trebuia sa am acolo un bidon de 500ml cu suport pentru prins pe bicla. Baietii mi-au trimis varianta de 750ml, lucru care nu ma deranjeaza, 250ml in plus de vodka nu au cum sa strice. Era si putin zgariat dar nici asta nu ma deranjeaza pentru ca oricum dupa cateva folosiri la fel urma sa ajunga si la mine. Au omis sa trimita suportul cu care vine prins pe bicicleta, lucru care ma deranjeaza pentru ca acum am un bidon de aluminiu de 16 lei care imi este la fel de util ca si sticla de Fanta la jumate pe care o port in momentul de fata in rucsac. Le-am trimis mail si sant tare curios cum se va rezolva si asta.

In concluzie, nu te speria de cumparatul online. Se mai intampla si nevrute din astea dar se rezolva usor.

Cum sa iti alegi un laptop

Laptopurile au inceput sa inlocuiasca desktopurile, adica acele monstruozitati de calculatoare care iti ocupau trei sferturi de birou, si fiind nevoit sa-mi iau si eu un laptop cat de curand, am considerat ca ar fi util sa dau ceva sfaturi despre cum sa iti alegi un laptop, poate ajuta pe cineva.

Exista cativa factori care trebuie luati in considerare la achizitia oricarui calculator, si anume: pretul, performanta, calitatea si specific laptopurilor: bateria, dimensiuni, greutate. Sa le luam pe rand.

Performanta e data de procesor, memorie, placa video si eventual hard disk. Pentru un calculator folosit in regim “office”, adica messenger, youtube si facebook chiar nu se merita sa investesti intr-un bolid cu 4gb de RAM si nu stiu ce procesor. Daca doresti sa te joci pe el, si prin asta ma refer la jocuri noi si pretentioase, ai putea sa cauti ceva cu o placa video dedicata, dar pentru un counter strike, word of warcraft sau o fifa, orice placa video din oferta actuala, fie ea incorporata sau nu, este suficienta.

Cand e vorba de laptopuri, trebuie sa mai iei in consideratie si alte chestii gen baterie, greutate, dimensiuni. Daca intentionezi sa-ti iei un laptop pe care sa-l cari zilnic dupa tine la facultate sau servici, o dihanie de trei kilograme si jumatate s-ar putea sa-ti rupa spatele, mai ales daca esti o fata de 1.55, subtire ca un pai.

Bateria. In cazul in care intentionezi sa-l folosesti in principal acasa sau la servici, daca nu cumva traiesti intr-o pestera fara curent electric, nu prea ai nevoie de o baterie sofisticata cu o autonomie care pare sa nu se mai sfarseasca. Daca in schimb calatoresti mult si crezi ca vei avea nevoie sa-l folosesti mai multa vreme fara sa ai vreo priza la indemana, se merita sa cauti un laptop care consuma putin sau care vine echipat cu o baterie serioasa.

Conectivitate. Laptopurile vin echipate pentru toate nevoile standard de conectivitate: wireless, retea, usb, iesiri audio si video. Porturi mai fitoase, gen HDMI sau eSATA sant niste mofturi mondene care nu se justifica in nici un fel si nu ar trebui sa lasati cunoscatorii sa vi le prezinte ca pe niste optiuni deosebite.

In final, sa ne uitam putin in oferta eMAG, si sa vedem 3 exemple de laptopuri bune si 1 exemplu de laptop rau.

  1. Lenovo IdeaPad G550L . Este primul pe lista pentru ca e un Lenovo care pur si simplu sant geniali cand e vorba de laptopuri. Este un exemplu de laptop bun pentru ca are un procesor capabil dual-core 2.4Ghz, 2gb de memorie RAM, un hard disk generos de 500Gb si costa doar 1600 RON.
  2. Acer Aspire 5742G pentru ca are un procesor bun Intel i3 2.53Ghz, 4gb memorie RAM, placa video dedicata GeForce GT540M care va face fata la jocuri noi si pretentioase. Pret: 2350 RON.
  3. Sony Vaio seria Y – VPCYB1S1E/S pentru ca este un substitut al calculatorului personal in doar 11 inch pe care il poti purta si in poseta.

Si un exemplu de laptop rau: MacBook care desi nu ofera nimic spectaculos la capitolul hardware, costa aproape 4500 RON.

Inapoi la scoala

M-am intors la facultate, dupa un semestru de dor si jale, si am revenit pe bancile universitatii devenind din nou student in anul IV, dubla 2. Imi place sa spun ca eu defapt acuma fac studiu de aprofundare sau ca sant ultimul student care a mai prins sistemul pre-Bologna cand facultatea noastra avea 5 ani de studiu pentru licenta dar adevarul este ca m-am inecat ca tiganul la mal: n-am ramas repetent sau corigent in cei 12 ani de scoala si am reusit fix acum in ultimul an de facultate.

In prima zi am facut cunostinta cu noii mei colegi care sant defapt vechii mei colegi. Noua grupa de robotica este, acum cu tot cu mine, cam in proportie de 10-20% vechea grupa de robotica.

M-a recunoscut si domnisoara profesoara si a fost foarte surprinsa sa ma vada, lucru deasemenea surprinzator, avand in vedere ca ea a fost cea care nu a vrut sa-mi incheie situatia. Deci ea a fost surprinsa sa ma aiba din nou ca student, iar eu am fost suprins ca ea a fost surprinsa ba mai mult, m-a surprins si faptul ca si-a adus aminte ca joc baschet. O zi tare ciudata.

Defapt eu trebuie sa refac o singura disciplina deci ma duc cam odata pe saptamana la facultate, iar disciplina asta avea doar un laborator anu trecut, acum are si proiect si laborator, deci mi-am cam luat teapa, lucru pe care l-a evidentiat si profa, zambind sadic.

Rebeca Negru – Vineri

7 dimineata, ma trezesc dimineata
Trebuie sa fiu proaspata, trebuie sa cobor jos,
Trebuie sa-mi iau castronul, trebuie sa servesc cereale,
Vazand totul, timpul pleaca
Tic tac, toata lumea se grabeste,
Trebuie sa merg in statia de autobuz,
Trebuie sa prind autobuzul, imi vad prietenii

Lovind cu piciorul scaunul din fata,
Lovind cu piciorul scaunul din spate,
Trebuie sa ma decid,
Pe care scaun sa il iau.

M-am apucat de scris cantece. Nu e chiar cea mai reusita strofa, dar daca tipa asta a reusit sa faca 47 de milioane de vizualizari cu versurile astea in engleza, inseamna totusi ca sant pe drumul cel bun.

E Vineri, Vineri,
Trebuie sa cobor Vineri,
Toata lumea se uita inainte catre weekend, weekend,
Vineri, Vineri,
Cobor Vineri,
Toata lumea se uita inainte catre weekend.

Wow ce merge treaba. Sant inspirat tare astazi. Deja vad milioanele de fani aliniati in fata mea pentru autograf.

Petrecand, Petrecand,
Petrecand, Petrecand,
Distractie, distractie, distractie, distractie,
Privind inainte catre weekend

Am observat ca Rebecuta e comparata cu un anume Justin Bieber; ca si cum Rebecuta noastra ar fi de talia unui anonim ca Bieber. Defapt, cine harap alb si merele de aur este acest Bieber de care am tot auzit dar despre care nu stiu nimic?

Ieri a fost Joi, Joi,
Astazi e este Vineri, Vineri
Noi noi noi noi asa de entuziasmati,
Noi asa de entuziasmati,
Noi avea o minge azi

Maine e Sambata,
Si Duminica urmeaza duuuu…uuuupa
Nu vreau sa se sfarseasca weekendul acesta

… pauza de vomitat … .

Revenind. Deci ieri a fost Joi, azi e Vineri, maine Sambata si apoi Duminica. In caz ca existau dubii. Parca se cere o schimbare de ritm asa ca hai sa-i dam cu niste rap de la Usher, alta mondenitate pe care nu l-as recunoaste nici daca mi l-ai arata cu degetu.

R-N, Rebeca Negru,
Deci racorindu-ma in scaunul din fata, in scaunul din fata,
In scaunul din spate, in scaunul din spate,
Conduc, navighez,
Benzi rapide, schimband benzile,
Cu o masina sus in lateralul meu, uooo!
Trecand pe langa este un autobuz scolare in fata mea,
Face tic tac, tic tac, vreau sa tip

Daca tot e vineri azi, pentru cei tari de stomac: play!

Doi doi doi

Bat sfios la usa si intru. Imi arata intr-un colt intunecos al camerei un scaun, imi zice sa iau loc si imi da un fel de polonic mic de plastic. S-a mai foit pe acolo vreun minut, timp in care eu transpirasem si tremuram ca o varga de emotie, dupa care imi zice: acopera un ochi si uita-te acolo.

Imi faceam fisa medicala pentru scoala de soferi si ramasesem doar cu oftalmologia. Ma gandeam optimist ca daca am plecat pana si din cabinetul de psihoogie fara dunga rosie pe buletin, ar trebui sa ma descurc si aici desi sant mai chior ca un liliac.

Am acoperit ochiul, tipa a inceput sa apese pe niste butoane iar pe peretele unde m-a pus sa ma uit apare un patratel micut, alb. Si imi zice: “Hai, spune”. La care eu, ma uit perplex la ea cu ochiul neacoperit gandindu-ma “aaa, ce vrea sa zica; trebuia oare sa invat vreo poezie?”. Dupa aia imi pica imediat fisa ca punctuletul ala mic si in ceata din centrul patratului nu e o musca ci s-ar putea sa fie o litera si involuntar am scapat un “Ah!” cu voce tare la care doctorita zice foarte promt, “da, corect” si apasa alt buton, alt patratel.

Cam la asta s-au rezumat raspunsurile mele corect, restul testului a fost un esec total. Ea imi arata numere eu ii citeam litere, dupa aia m-am prins si vedeam doar 2 2 2, aducandu-mi aminte cu melancolie de carnetul de note din liceu. Aparent cu ochiul drept vad mai putin de jumatate din vederea normala si nu a vrut sa-mi dea drumu. M-am ofticat putin, dar are dreptate. Nici eu n-as lasa la volan pe cineva care daca vrea sa se asigure in intersectie, trebuie sa scoata capul pe geam si sa strige: “Ba, daca esti vreunu acolo, claxoneaza!”.

dar flamanzila.ro rulz

Ziceam ceva mai devreme ca moara de foc sucks, ei bine flamanzila rulz. Au facut ei un fel de concurs la care nici macar nu stiam ca am participat dar pe care se pare ca l-am castigat. Asta e un fel de culme a victoriei: sa castigi competitii la care nici macar nu participi. Ma simt atat de cool, ca un pui mic de Chuck Norris, care probabil acum ma cam invidiaza. Sincer nu stiu daca au aranjat ei asa fel incat sa compenseze pentru teapa cu moara de foc sau pur si simplu fiind un serviciu foarte nou, eu am fost cam singurul client. Important e ca am castigat.

Premiul e cam ciudatel. Este vorba despre un Voucher la un salon de hairstyling. La tunsoarea mea si mai ales ca sant genu care se piaptana cu batista, nu stiu ce ar putea sa-mi faca. Poate pe parul de pe burta sa-mi aplice un hairstyling dar sincer nu simt nevoie unei stilizari de blana; deabia am facut implantul si e inca sensibil.

Voucherul valoreaza vreo 600 RON, adica 6 milioane de lei vechi. Da. Stiu! Si mie mi-a cazut fata cand am auzit. Stau si ma gandesc care e legatura intre restaurante, pizzerii, livrarile la domiciliu si hairstyling dar mai important, stau si ma gandesc cine ar da 600 RON pentru o tunsoare. In general coafurile femeilor sant cu mult mai scumpe decat cele ale barbatilor. De ce? Ar fi usor de crezut ca e din cauza complexitatii dar nu e asa. Raspunsul e simplu: factorul de risc.

E cu mult mai riscant sa tunzi o femeie decat un barbat. Daca faci o greseala in tunsoarea unui barbat, nu e asa mare problema: tunzi mai scurt, intr-o luna ii creste la loc si salut; nu-ti scoate nimeni ochii cu furculita. Dar la o femeie… la o femeie greu mai scapi cu puls si respiratie din ghiarele ei daca ii tai prea adanc din podoaba capilara. Asadar acea diferenta mare intre preturi este defapt sporul de risc al coafezei, care este surprinzator mai mare decat al unui pompier sau soldat.

Moara de foc sucks!

Ii vine azi Iuliei sa manance pizza la pranz si dupa ce mi-a zis, normal ca mi-a facut si mie pofta. Uite asa s-au format spontan doi flamanzi cu chef de pizza. Fiind la servici, nu puteam sa ies in oras asa ca i-am zis sa vina la mine in pauza ei de pranz si facem comanda.

Zis si facut. Am intrat pe flamanzila.ro si am facut comanda de 2 pizzoaie de la moara de foc. Pentru cine nu stie, flamanzila.ro e un site destul de nou unde poti face comanda online de mancare de pe la restaurante din Iasi si care chiar functioneaza. Pana azi. Azi ne-a tras teapa.

Am facut comanda si dupa 10 minute ma suna o tanti de la moara de foc sa confirme comanda. Dupa ce i-am zis ca da doamna, se confirma lasa telefonul si apuca-te de framantat, am intrebat-o cat dureaza. 40-50 minute maxim zice ea senina si plina de viata asa ca am facut eu niste calcule si i-am zis Iuliei la ce ora sa vina ca sa ajunga odata cu pizza.

Am asteptat o ora si ceva iar pizza aia nenorocita n-a venit. Trecuse deja pauza ei de masa si a trebuit sa plece; mai flamanda decat a venit. Acuma in timp ce scriu a aparut si baiatul cu pizza si merita sa-i spun sa si-o bage in fund si s-o cace pe gura dar am fost ceva mai diplomat pentru ca probabil n-a fost vina lui.

In concluzie: epic fail. Trecem si moara de foc pe lista neagra alaturi de pizzeria domneasca, care desi fac o pizza excelenta, cand e vorba de livrat sant niste porci. Te taxeaza cu 2 RON pe cutie lucru care mi se pare aberant. Mi-as dori o functie de dislike pe Facebook, macar cu atat sa ma razbun si eu pentru faze de astea.