ето ти crash course как предполагам, че работи symfony (базирано на опита ми с Rails, от който всички копират):
-
идва заявка от потребител/браузър за даден адрес: http://example.com/foo/bar?baz=baba&larodi=foo
-
заявката минава през някакъв уеб сървър; примерно, Apache или Nginx и според настройките на уеб сървъра, се решава какво да стане с нея; обикновено, ако е за съществуващ статичен файл (картинка, CSS файл, JS файл и т.н.), файлът се праща на клиента и толкова; ако не е за съществуващ файл, обикновено се препраща на някакъв PHP код; да кажем, на твоето Symfony приложение
-
Symfony получава препратената заявка и решава какво да я прави; вижда, че тя е
GET /foo/bar?baz=baba&larodi=foo
. Прави следните стъпки:-
Разпарчатосва URL-а; това след
?
се нарича query string и съдържа key-value параметри; всяка двойка е разделена с&
; в случая, параметрите саbaz=baba
иlarodi=foo
; symfony ги слага в някакъв (асоциативен) списък (по-скоро речник, но PHP го нарича array):$params = array('baz' => 'baba', 'larodi' => 'foo')
; останалата част от URL-а се нарича path: /foo/bar; товаGET
се нарича HTTP Verb (или, още, HTTP method); има няколко:GET
,POST
(най-често използваните) и ощеPUT
,DELETE
,OPTIONS
,HEAD
,PATCH
(по-рядко използвани). Това е FYI. -
На база на path (всъщност, на база на комбинацията path + HTTP verb) и на "маршрутите" (routes), дефинирани в твоето приложение, Symfony взима решение какво да прави с request-а. Ако приложението ти не е дефинирало нито един маршрут, който изглежда, че ще може да обработи /foo/bar, резултатът е грешка 404. Symfony взима отнякъде (или генерира динамично) страница за тази грешка и я праща на клиента.
-
Ако нямаме грешка 404 на предната стъпка, това, което Symfony вече знае, е че за маршрута/URL-а /foo/bar, отговаря класът
FooController
, и по-точно, неговият методbarAction()
(примерно). -
Symfony се подготвя да и изпълнява твоя код от
FooController
. Ето пример как би могло да става това. Това е псевдокод и вероятно не става точно така, но смисълът е такъв:// Създава се нов обект от тип FooController // Забележи, че се прави по един такъв обект за *всеки* нов request $controller = new FooController(); // Тук се подават по някакъв начин параметрите, изкопани в стъпка 3.1. // После може би можеш да ги ползваш в $this->params['foo'], примерно. $controller->setParams($params); // Извиква твоя код, от който се очаква да отговаря за адреса /foo/bar // и взима резултата. $response = $controller->barAction(); // По някакъв начин праща отговора на клиента. Дали е само plain text, // или е някакъв изглед, който е обърнат в HTML, не е толкова важно. sendResponseToClient(prepareResponse($response));
В тази стъпка ставт много неща. По-горе пропускам доста междинен код, но най-общо, нещата изглеждат така.
-