Skip to content

Instantly share code, notes, and snippets.

@mitio
Last active August 29, 2015 14:13
Show Gist options
  • Save mitio/a93e28e888980d1405ac to your computer and use it in GitHub Desktop.
Save mitio/a93e28e888980d1405ac to your computer and use it in GitHub Desktop.

ето ти crash course как предполагам, че работи symfony (базирано на опита ми с Rails, от който всички копират):

  1. идва заявка от потребител/браузър за даден адрес: http://example.com/foo/bar?baz=baba&larodi=foo

  2. заявката минава през някакъв уеб сървър; примерно, Apache или Nginx и според настройките на уеб сървъра, се решава какво да стане с нея; обикновено, ако е за съществуващ статичен файл (картинка, CSS файл, JS файл и т.н.), файлът се праща на клиента и толкова; ако не е за съществуващ файл, обикновено се препраща на някакъв PHP код; да кажем, на твоето Symfony приложение

  3. Symfony получава препратената заявка и решава какво да я прави; вижда, че тя е GET /foo/bar?baz=baba&larodi=foo. Прави следните стъпки:

    1. Разпарчатосва 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.

    2. На база на path (всъщност, на база на комбинацията path + HTTP verb) и на "маршрутите" (routes), дефинирани в твоето приложение, Symfony взима решение какво да прави с request-а. Ако приложението ти не е дефинирало нито един маршрут, който изглежда, че ще може да обработи /foo/bar, резултатът е грешка 404. Symfony взима отнякъде (или генерира динамично) страница за тази грешка и я праща на клиента.

    3. Ако нямаме грешка 404 на предната стъпка, това, което Symfony вече знае, е че за маршрута/URL-а /foo/bar, отговаря класът FooController, и по-точно, неговият метод barAction() (примерно).

    4. 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));

      В тази стъпка ставт много неща. По-горе пропускам доста междинен код, но най-общо, нещата изглеждат така.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment