1. 程式人生 > >第一章:Symfony2和HTTP基本原理

第一章:Symfony2和HTTP基本原理

恭喜你!通過學習Symfony2,你將用你自己的方式開發出更加高效、全面和流行的Web應用(當然,要受到用人單位或同行的歡迎,還是得靠你自己)。Symfony2的存在是為了要解決最根本的問題:即提供一個開發工具,使開發者能以自己的方式更快速地開發出更為健壯的應用程式。Symfony2集成了許多技術的優點,包括工具和概念,你將學到大多數人多年來努力的方向。換句話說,你不只是在學習Symfony2,你還將學習Web基礎原理、最佳開發實踐以及如何使用許多新的、優秀的PHP開發庫。所以,請做好準備!

本章將從解釋Web開發過程中最常接觸的基礎概念開始:HTTP協議。無論技術背景或首選程式語言是什麼,本章的內容對於所有人來說都是必須要了解的。

HTTP很簡單

HTTP(超文字傳輸協議)是一個允許兩個機器相互通訊的文字語言。舉例來說,當你要去 xkcd 網站檢視最新的漫畫時,下列會話(近似地)將在你的瀏覽器和伺服器之間發生:

雖然實際使用的語言將更加正規,但它依然是很簡單的。HTTP定義了這種簡單文字語言的語義和語法。而無論你從事何種的Web開發,你的伺服器總是要理解基於文字的請求,並返回基於文字的響應。

Symfony2是基於現實構建的,無論你是否意識到這一點,HTTP都是你每天所需的。隨著對Symfony2學習的深入,你將學會如何掌握它。

第一步:客戶端傳送一個請求

Web上的每個會話都是從一個請求開始的,這個請求是由客戶端(如:網頁瀏覽器、iPhone應用程式等)建立的一種特殊格式的文字訊息,該格式符合HTTP協議規範。客戶端將該請求傳送到服務端,然後等待服務端響應。

下圖體現的是,瀏覽器與xkcd伺服器之間互動的第一階段(請求):

以HTTP的方式來說,HTTP請求就象下面這個樣子:

GET / HTTP/1.1
Host: xkcd.com
Accept: text/html
User-Agent: Mozilla/5.0 (Macintosh)

這個簡單的訊息準確地描述了客戶端所請求的到底是哪個資源。HTTP請求的第一行是最重要的,它包含了兩項資訊:URI和HTTP方法。

URI(如:/、/contact等)表明了客戶端所請求資源的唯一地址或位置。HTTP方法(如:GET)則是向伺服器說明你想對資源做什麼,HTTP方法是請求的“動詞”,用以定義你對資源的操作:

GET 從伺服器上檢索資源
POST 在伺服器上建立一個資源
UPDATE 更新伺服器上的資源
DELETE 刪除從伺服器上該資源

按照這個規則,你可以傳送一條要求刪除指定博文的請求,如:

DELETE /blog/15 HTTP/1.1

註釋:實際上,HTTP協議裡一共定義了9種HTTP方法,但它們中的大部分並沒有得到廣泛的使用和支援。實際上,許多現代的瀏覽器並不支援PUT和DELETE方法

除了第一行,HTTP請求所包含其他行的資訊被稱為HTTP請求頭,頭資訊還包含:主機、客戶端接受響應的格式、客戶端所用代理的應用程式等。還有許多其它的HTTP請求頭存在,你可以在維基百科的  中找到它們。

第二步:服務端返回響應

服務端得到請求,它就明確地知道客戶端需要哪個資源(通過URI)以及希望對該資源進行什麼操作(通過HTTP方法)。例如,對於一個GET請求,服務端將準備資源,並在HTTP響應中將其返回給客戶端。如,xkcd服務端返回的響應:

 

按照HTTP協議的格式,被返回給客戶端的響應如下所示:

HTTP/1.1 200 OK
Date: Sat, 02 Apr 2011 21:05:05 GMT
Server: lighttpd/1.4.19
Content-Type: text/html
 
<html>
  <!-- HTML for the xkcd comic -->
</html>

HTTP響應包含了客戶端所請求的資源(在這個例子裡是HTML),以及與響應相關的資訊。與請求頭類似,第一行也最重要,它給出的是HTTP狀態碼(在 上面的例子裡是200)。狀態碼報告了響應的狀態,如,請求是否成功?是否存在錯誤?不同的狀態碼錶示著成功、錯誤或者通知客戶端需要做其它一些事(如重 定向到另一頁)。完整的列表可以在維基百科的 中找到。

所有這些響應資訊,組成了響應頭。其中一個重要的HTTP響應頭訊息被稱為Content-Type。伺服器上的每個資源都可以以不同的格式返回給客戶端,如HTML、XML或JSON等;通過在Content-Type裡設定如text/html這樣的網際網路媒體型別碼,可以告知客戶端,伺服器給出的響應格式是什麼。常見的媒體型別可以在維基百科的裡找到。

還存在很多其他的HTTP響應頭,其中有些可以起到很重要的作用。比如,某些響應頭可以用來維護HTTP快取。

請求響應和Web開發

“請求-響應”對話是驅動Web上所有通訊的基礎,它是如此的強大和重要,它又是如此的簡單。

最重要的事實是,不管你使用哪種開發語言,構建哪種應用(Web、手機、JSON應用程式介面等),遵循哪種開發理論,應用程式的最終目標總是一致的:理解每個請求,建立並返回相應的響應。

Symfony2就是來完成這一“使命”的:

要更瞭解HTTP協議規範,可以參考  或者  (用更直白明瞭方式的來說明HTTP協議規範)。另外,有一款叫做  的Firefox瀏覽器擴充套件可以用來檢視上網過程中請求、響應頭的內容。

PHP是如何處理請求和返回響應的

那麼,怎麼用PHP來獲知“請求”,並建立“響應”呢?PHP對實際的操作進行了封裝,你要做的,相對還算簡單:

 
<?php
$uri = $_SERVER['REQUEST_URI'];
$foo = $_GET['foo'];
 
header('Content-type: text/html');
echo 'The URI requested is: '.$uri;
echo 'The value of the "foo" parameter is: '.$foo;

雖然看上去有點奇怪,但這一小段程式碼可以從HTTP請求頭裡提取資訊,並依據這些資訊建立了響應內容。你並不需要自己寫程式碼來解析HTML訊息格式,因為PHP為你準備了一系列的全域性變數,如:$_SERVER$_GET,它們包含了關於請求的所有資訊。你還可以通過呼叫header()函式來指定響應頭資訊;或者用echo一類的語句直接輸出響應裡的正文內容。PHP會負責把你指定的所有資訊組成一個有效的HTTP響應,返回給客戶端(注意,中文會經過編碼傳輸)。

 
HTTP/1.1 200 OK
Date: Sat, 03 Apr 2011 02:14:33 GMT
Server: Apache/2.2.17 (Unix)
Content-Type: text/html
 
The URI requested is: /testing?foo=symfony
The value of the "foo" parameter is: symfony

Symfony2中的請求和響應

Symfony2使用兩個類可以非常容易地與請求和響應互動,從而取代原始的PHP方式。Request類是HTTP請求面向物件的簡單表示。有了它,你獲取請求資訊將易如反掌。

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
use Symfony\Component\HttpFoundation\Request; 
 
$request = Request::createFromGlobals(); 
 
// 請求的URI (如:/about) ,沒有任何查詢引數
$request->getPathInfo(); 
 
// 分別檢索GET和POST變數
$request->query->get('foo'); 
$request->request->get('bar'); 
 
// 檢索被foo標識的UploadedFile例項
$request->files->get('foo'); 
 
$request->getMethod();          // GET, POST, PUT, DELETE, HEAD 
$request->getLanguages();       // 客戶端接受語言的陣列
 
use Symfony\Component\HttpFoundation\Request;
 
$request = Request::createFromGlobals();
 
// 請求的URI (如:/about) ,沒有任何查詢引數
$request->getPathInfo();
 
// 分別檢索GET和POST變數
$request->query->get('foo');
$request->request->get('bar', 'default value if bar does not exist');
 
// 檢索伺服器變數
$request->server->get('HTTP_HOST');
 
// 檢索上傳檔案引數
$request->files->get('foo');
 
// 檢索cookie的值
$request->cookies->get('PHPSESSID');
 
// 檢索一個http頭是不是規範化
$request->headers->get('host');
$request->headers->get('content_type');
 
$request->getMethod();          // GET, POST, PUT, DELETE, HEAD
$request->getLanguages();       // 一個獲取語言陣列的方法

Request類在後臺所做的大量工作能使你省不少心。如isSecure()方法通過用PHP檢查三個不同的值來確定使用者是否使用了安全連結(通過https)。

ParameterBags 和 Request 類的成員

如上,$_GET 和 $_POST 裡的值可以通過公有成員query和request來訪問。每一個都是 Symfony\Component\HttpFoundation\ParameterBag 類的物件,擁有以下方法: get(), has(), all() 等等。 事實上,上面例子裡提到的公有成員都是ParameterBag的例項。

Request類還有一個公有的 attributes 成員,裡面包含了PHP框架的一些執行資料。Symfony2框架在這個變數裡儲存了當前請求所匹配的URL路由,比如_controller,id(如果你使用了 {id} 萬用字元),甚至當前路由的名稱(_route)。attributes成員實際就是用來儲存和提供與當前請求相關的執行環境資訊。

Symfony2還提供了一個Response類,一個HTTP響應的簡單PHP表示。這允許你使用面向物件的介面去構建返回客戶端所需的響應。

use Symfony\Component\HttpFoundation\Response;
$response = new Response();
 
$response->setContent('<html><body><h1>Hello world!</h1></body></html>');
$response->setStatusCode(Response::HTTP_OK);
$response->headers->set('Content-Type', 'text/html');
 
// prints the HTTP headers followed by the content
$response->send();

symfony新的2.4版:已經支援了引入HTTP狀態程式碼

就算Symfony2再沒提供其它工具,你也已經有了可以輕易訪問請求資訊的工具包和用來建立響應的面向物件介面。即使你學了更多Symfony2的功能,也請牢記,你應用程式的目標始終是解釋請求,並根據你應用程式的邏輯建立相應的響應。

Request類和Response類都是Symfony2中名為HttpFoundation元件的一部分。該元件可以獨立使用,它還提供處理會話和檔案上傳的類。

從請求到響應

同HTTP一樣,Request和Response物件也很簡單。應用程式最複雜的部分是在兩者之間寫些什麼。換句話說,真正的工作來自於編寫解釋請求並建立響應的程式碼。

你的應用程式可能做了諸如傳送電子郵件、處理提交表單、向資料庫寫入資料、渲染HTML頁面和確保內容安全性等諸多事情,但你如何來管理這一切,同時還要保持你程式碼的組織性和可維護性呢?

Symfony2就是用來解決上述問題,而無須讓你因此分心。

前端控制器

傳統方式中構建的應用程式,網站中的每一“頁”都是它自身的物理檔案。

  index.php 
    contact.php 
    blog.php

使用這種方式存在幾個問題:不靈活的URL(你是否可以將blog.php檔案改名為news.php,而無須破壞你所有的連結?)、每個檔案都必須手工包含一些核心檔案集以確保安全性(資料庫連線和網站外觀必須保持一致)。

更好的解決方案是使用前端控制器:單一的PHP檔案,該檔案用來處理進入應用程式的所有請求。例如:

/index.php 執行index.php
/index.php/contact 執行index.php
/index.php/blog 執行index.php

使用Apache的mod_rewrite模組(或其它Web伺服器的相似模組),URL可以很方便地被清理成諸如:/、/contact、/blog 這樣的連結。

現在,所有請求的處理都完全一樣。前端控制器將被始終執行,不同的URL將被內部路由到你應用程式的不同部分,而無須根據不同的URL執行不同的PHP檔案。這樣就解決了前面傳統方式所帶來的問題。幾乎所有現代應用程式都可以做到這一點,其中包括類似WordPress這樣的應用程式。
保持程式碼的組織性
前端控制器又是如何知道哪個頁面要被渲染,如何正確渲染呢?這需要判斷傳入的URI,針對性地呼叫不同的程式碼。這也不是容易的差事:

// index.php
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
 
$request = Request::createFromGlobals();
$path = $request->getPathInfo(); // the URI path being requested
 
if (in_array($path, array('', '/'))) {
    $response = new Response('Welcome to the homepage.');
} elseif ($path == '/contact') {
    $response = new Response('Contact us');
} else {
    $response = new Response('Page not found.', Response::HTTP_NOT_FOUND);
}
$response->send();

幸運的是,這正是Symfony2被設計來解決的問題之一。

Symfony2執行流程

讓Symfony2來處理請求,開發工作就會變得簡單很多。Symfony2在每次處理,都會遵循下面的模式:

傳入的請求經路由,會由具體的控制器函式進行處理,並返回Response物件。

你網站的每一頁都被定義在路由配置檔案中,在那裡不同的URL被對映到不同的PHP函式。每個PHP函式(又名 controller)的工作就是得到請求的資訊(也可以使用Symfony2中有許多其它的工具)去建立並返回一個Response物件。

就是這麼簡單,讓我們回顧一下:

1、每個請求執行前端控制器檔案;
2、根據你的路由配置和請求資訊,路由系統決定應該執行哪個PHP函式;
3、正確的PHP函式被執行,在那裡你的程式碼將建立並返回相應的Response物件。

Symfony2處理請求的例項

先不考慮太多的細節,舉一個請求處理例項。假設你要在Symfony2應用裡增加一個/contact頁面。首先,修改路由配置檔案:

contact:
    pattern:  /contact
    defaults: { _controller: AcmeDemoBundle:Main:contact }

這個例子使用 YAML來定義路由的配置,你也可以用XML或PHP來寫。

當有人訪問/contact頁時,該路由條目被匹配,同時執行指定的控制器。

你在  裡將會了解到,AcmeDemoBundle:Main:contact是簡寫法,指向的是MainController類裡的contactAction方法函式。

class MainController
{
    public function contactAction()
    {
        return new Response('<h1>聯絡我們!</h1>');
    }
}

這個控制器非常簡單,僅僅建立了一個內容為HTML“<h1>聯絡我們!</h1>”的Response。參考你可以瞭解到控制器如何渲染模板,從而使你的“表現層”程式碼可以被寫在單獨的模板檔案裡。控制器不需要考慮一些複雜的工作,如:讀寫資料庫,處理由使用者提交的資料,傳送電子郵件等。

Symfony2讓你構建應用,而不是寫工具

現在你知道任何應用的目的都是處理傳入的請求,建立相應的響應。當應用程式的規模逐漸增長,要保持程式碼的結構和易維護性就變得越來越困難。畢竟,有很多事情是你不得不反覆做的:寫資料庫,渲染和重用模板,處理表單提交,傳送電子郵件,驗證使用者的輸入和保證安全性。

好訊息是,這些事情都不是發射神舟飛船,並不特殊。Symfony2提供了你構建應用所需的幾乎全部工具,所以你可以專心於創造應用,而不是“重新發明輪子”。Symfony2還有一點值得表揚,就是你可以選擇是使用整個框架,還是隻使用它部分的功能。

獨立的工具:Symfony2的元件

那Symfony2到底是什麼?首先,Symfony2是一個由20多個獨立的開發庫組成的工具集,你可以在任何PHP專案裡使用這些程式碼。這些開發庫,被稱作Symfony2元件,功能涵蓋了絕大部分的開發需求。舉一些例子:

  •  – 包含Request和 Response相關的類,以及處理會話和檔案上傳的類;
  •  – 強大、快速的URL路由系統,你可以指定對於特定的URI(如:/contact),請求該如何處理(如:執行contactAction()方法);
  • Form – 一個靈活的、全功能的建立表單和處理表單提交的框架;
  • - 建立資料規則,並可以驗證資料(不僅是使用者提交的資料)是否符合所創規則的系統;
  •  – 類的自動載入器,無需在使用PHP類時寫require來包含對應的原始檔;
  •  – 一個渲染模板、處理模板繼承關係(即模板巢狀)和執行其他通用模板任務的工具包;
  •  – 一個功能強大的,能處理應用程式內所有安全任務的庫;
  •  – 一個用來翻譯應用程式內字串的框架。

每一個元件都是獨立的,可用於任何PHP專案中,而不管你是否使用了Symfony2框架。它們的每一個既可以在需要時使用,也可以在必要時被替換。

完整的解決方案:Symfony2框架

那麼,什麼Symfony2框架呢?Symfony2框架是個PHP庫,它實現兩個功能:

  1. 提供經選擇的元件(如:Symfony2元件)和第三方庫(如:用Swiftmailer傳送電子郵件);
  2. 提供合理的配置以及將這一切都粘合起來的“膠水”庫。

這個框架的目標是整合許多獨立的工具,以期給開發人員一致的體驗。甚至就連Symfony2框架本身也是一個Bundle(類似外掛),在必要時也可以被重新配置甚至替換掉。

Symfony2為快速開發應用程式提供了強大的工具集,普通使用者可以通過Symfony2的發行版(預設提供了合理的專案架構)迅速上手,對於更高階的使用者而言,只有想不到,沒有做不到(The sky is the limit.)。

相關推薦

第一Symfony2HTTP基本原理

恭喜你!通過學習Symfony2,你將用你自己的方式開發出更加高效、全面和流行的Web應用(當然,要受到用人單位或同行的歡迎,還是得靠你自己)。Symfony2的存在是為了要解決最根本的問題:即提供一個開發工具,使開發者能以自己的方式更快速地開發出更為健壯的應用程式。Symfony2集成了許多技術的優點,包括

scons使用者指南第一編譯安裝SCons

如果Python沒有安裝,你會看到一條錯誤訊息比如“command not found”(在UNIX或Linux裡)或"python is not recognized as an internal or external command, operable program or batch file"(在W

微信入門開發(java)----第一access_tokenopenid的獲取

我是一個java程式設計師,一直以來做的都是Web專案。有一段時間,公司業務比較多。導致負責公司公眾號維護的專案組同事都去幫忙了,所有我就暫時負責一段時間公司的公眾號的二次開發。之前做過支付寶的開發。在接觸微信開發之後,發現微信開發裡面的限制很多。相比較支付寶

《數學之美》--第一文字語言 vs 數字信息

數學之美 png 利用 記錄 image math 解碼 進制 ogr PDF下載 第一章 文字和語言 vs 數字和信息 數字、文字和自然語言一樣,都是信息的載體,它們之間原本有著天然的聯系。語言和數學的產生都是為了同一個目的—記錄和傳播信息。但是,直到半個多世紀前香農博士

2017-01-23 新一代視訊壓縮碼標準-H.264_AVC第一 緒論、第二 數字視訊、第三 視訊壓縮編碼的基本原理

2017-01-23 新一代視訊壓縮碼標準-H.264_AVC:第一章 緒論、第二章數字視訊、第三章視訊壓縮編碼的基本原理 第一章緒論     1.1 緒論.資訊化與視訊通訊         1.1.1 緒論.資訊化與視訊通訊.什麼是資訊            

LabWindows/CVI第一基本規則

sta 控制 nbsp std class 整型 turn col 浮點型 一、 #include<stdio.h> //頭文件,#號是預處理指令,standard input output header的縮寫。 void main()

計算機組成原理_第一計算機系統概論

匯編 概念 抽象 特性 解釋 及其 高級語言 語言 設備 第一章:計算機系統概論 1.1  計算機系統簡介 問題1:現代計算機系統由那兩部分組成? 現代計算機的多態性 CPS:信息物理系統 HPC:高速計算機,天河2號,Titan(Cray公司的,科磊公司) TF:TFlo

<python3-cookbook>第一數據結構算法

tool 排序類 集合 必須 類型 數通 個數 自己 def 第一章:數據結構和算法 介紹:這本書是高級用法,不是小白使用書目的:寫作目的是記錄下自己學習這本書的過程以及收獲 1.1解壓序列賦值給多個變量: 問題:現在有一個包含 N 個元素的元組或者是序列,怎樣將它裏

第一程序設計C語言

統一 c程序 集合 out 包含 有一個 機器 文件名 部分 一、什麽是計算機程序? 所謂程序就是一組計算機能識別和執行的指令。計算機的一切操作都是由程序控制的,本質是程序的機器,程序和指令是計算機系統最基本的概念。 二、什麽是計算機語言? 人和計算機交流信息要

第一Python資料結構演算法

第一章:Python資料結構和演算法 Python 提供了大量的內建資料結構,包括列表,集合以及字典。大多數情況下使用這些資料結構是很簡單的。 但是,我們也會經常碰到到諸如查詢,排序和過濾等等這些普遍存在的問題。 因此,這一章的目的就是討論這些比較常見的問題和演算法。 另外,我們也會

1.1 《演算法》第一之導論基本程式設計模型

文章目錄 《演算法》全書組織結構 概述 演算法 基礎程式設計模型 Java程式基本結構 原始資料型別和表示式 表示式 程式碼的簡便寫法 靜態方法 方法性質 遞迴(

C#程式設計基礎第一C#.NET框架、VS軟體基本使用、編寫第一個C#程式

1、.NET平臺和C#語言 .NET 是微軟公司推出的平臺開發環境 C#(C Sharp)是一種強大的、面向物件的程式開發語言,是專為 .NET 開發而設計出的語言。 2002年微軟釋出了.NET框架的第一個版本,是一種比MFC和COM程式設計技術更一致面向物件的環境。

HTTP圖解讀書筆記(第一 瞭解web網路基礎)

一、TCP/IP概念 TCP/IP是網際網路相關聯的協議集合的總稱,協議中存在各式各樣的內容。從電纜的規格到 IP 地址的選定方法、尋找異地使用者的方法、雙方建立通訊的順序,以及 Web 頁面顯示需要處理的步驟,等等。 二、TCP/IP的分層管理 分為四層:應用層、網路層、傳輸層、資料鏈

《計算機網路-自頂向下方法原書第六版》~~~~~第一計算機網路因特網

1.1 什麼是因特網 1.1.1 具體構成描述 1. 端系統(主機):資料的傳送或接受的終端。 2. 通訊鏈路:資料傳輸的媒介。 3. 分組:資料在鏈路中傳輸的一種封裝格式。 4. 路由器:負責轉發資料,用於網路核心中。 5. 鏈路層交換機:負責轉發資料,用於接入

ASP.NET Core微服務 on K8S(Jessetalk)(第一詳解基本物件及服務發現)(持續更新)

課程連結:http://video.jessetalk.cn/course/explore 良心課程,大家一起來學習哈! 任務1:課程介紹 任務2:Labels and Selectors 所有資源物件(包括Pod, Service, Namespace, Volume)都可以打

深入理解JVM虛擬機器2JVM垃圾回收基本原理演算法

JVM GC基本原理與GC演算法  Java的記憶體分配與回收全部由JVM垃圾回收程序自動完成。與C語言不同,Java開發者不需要自己編寫程式碼實現垃圾回收。這是Java深受大家歡迎的眾多特性之一,能夠幫助程式設計師更好地編寫Java程式。  下面四篇教程是瞭解Jav

全國計算機等級考試二級教程--python語言程式設計(2018年版)第一程式設計基本方法

宣告:本篇文章只是個人知識盲區、知識弱點、重點部分的歸納總結,望各位大佬不喜勿噴。梳理順序是按照書籍的實際順序梳理,轉載請註明出處。 作者:sumjess   一、python簡介: 1、python的誕生      創始人:Guido

深入探索Android熱修復技術原理讀書筆記——第一熱修復技術介紹

第一章 熱修復技術介紹 1.1 什麼是熱修復 傳統開發流程: 重寫釋出版本代價太高 使用者下載安裝成本太高 bug修復不及時,使用者體驗差 有許多開發者找到了合適的解決辦法,比如: 經常變更的業務用H5獨立出來,但是增加

開發藝術探索——第一Activity的生命週期啟動模式

目錄 1.1 Activity 的生命週期和啟動模式 1.1.1 典型情況下的生命週期分析 1.1.2 異常情況下的生命寧週期分析 1.2 Activity 的啟動模式 1.2.1 Activity 的 LaunchMode 1.2.2 Activity 的Flags

第一STM32MxCube 基本使用方法

    今天是2018年5月29日,大學馬上畢業,在公司實習快半年多了,搞嵌入式開發,學習了很多技術,積累了很多經驗。今天開始分別總結一下。希望給後來者一些經驗,少走一些彎路,也作為日後學習、回顧的資料。今天第一講將STM32STM32MxCube 基本使用。stm32cub