1.symfony快速入門
仍是先看代碼結構把,這個是拿到代碼的第一印象,
app/:整個應用的配置,模版,translations,這個多是多語言文件什麼,
src/:項目php文件,
vendor/:第三方的依賴文件
web/:站點的入入口路徑,必須在域名後面加上這個目錄才能訪問整個站點,不存在入口文件這一說法。資源文件如css,javascript等靜態文件。還有些前端的控制器什麼的。
在app/目錄下面的AppKernel是主要的入口點,看名字應該叫app核心類,在這個類裏面實現了兩個方法registerBundles(),註冊束,很差翻譯在這個裏面返回
全部的束registerContainerConfiguration(),返回配置文件。自動加載是本身加載類,不須要寫什麼東西。依賴的第三方類放在vendor/目錄下面,也能夠放在其餘的地方。
什麼是束呢?官方解釋是束是symfony裏面最重要的概念,相似與軟件裏面的插件,在symfony裏面全部的事情都是一個束,從框架到模塊。全部寫的東西都以
束的方式呈現。用symfony的概念來說一個束是一些php,javascript,css,image文件,擦,這說的好簡單啊,一個束來實現一個單一的功能,例如論壇,能夠被其餘開發者來使用。
在symfony中束是主體要的概念,能夠靈活地選擇使用那些束,在symfony中AppBundle包含須要的組件。
註冊束,registerBundles方法是用來註冊束的,每一個束是一個包含描述這個束的類。在AppBundle中已經包含了不少和框架相關的束,好比FrameworkBundle,DoctrineBundle,SwiftmailerBundle,AsseticBundle
每一個束均可以單獨配置
使用記號@BUNDLE_NAME/path/to/file從束裏面引用一個文件,例如@BUNDLE_NAME/path/to/file這個將會引用@AppBundle/Controller/DefaultController.php
源代碼中沒有看到這個目錄。使用下面方式引用控制器類中的動做BUNDLE_NAME:CONTROLLER_NAME:ACTION_NAME,實例:AppBundle:Default:index,對應indexAction方法。
在Vendors中包含一些第三方的類庫,這裏的東西最好不要修改,它不被composer管理,這裏包含SwiftMailer類庫,DoctrineORM,Twig模版等等。
Symfony中的緩存和日誌
在symfony中可使用多種格式的配置文件例如:yaml,xml,php等等,symfony中有本身的緩存系統,整個系統只有在第一次請求的時候會從配置文件中讀取
,而後編譯成一個php文件放在app/cache裏面。
在開發環境,symfony在每次修改後自動更新緩存,可是在生產環境,爲了加快速度,咱們須要本身動手刪除緩存文件。在開發的時候可能會有各類各樣
的錯誤,這個時候就須要在app/log目錄中查看日誌文件,對修改bug頗有用。
命令行接口,在app/console目錄下包含一些命令行系統幫助咱們修改應用,可是我沒有看到有這個目錄,命令行?有考慮過從.net轉過來的開發人員麼?
造孽!。
最後,看完入門篇了。javascript
2.symfony視圖簡介
擁抱twing,wting文件是一種可以包含任何文本內容的文件,html,css,javascript,xml,csv。媽蛋啊還有這樣奇葩的文件,乾脆把全部類型的都包含
進來,咱們來看看twing中的分隔符。
{{ ... }}打印變量或者表達式的內容
{% ... %}語句塊,在模版中控制邏輯,好比for,if,等等,媽蛋 用<?php?>你會死嗎?
{# ... #}註釋,奇葩,會翻譯成
在控制器方法中使用render方法來渲染模版,用一個數組來傳遞變量,以下:
$this->render('default/index.html.twig', array(
'variable_name' => 'variable_value',
));
語法比較傻!
傳遞給模版的變量能夠是數組,字符串,對象,wting模版使用.來獲取對象中的屬性,舉例以下:
{# 1. 簡單的變量 #}
{# $this->render('template.html.twig', array('name' => 'Fabien') ) #}
{{ name }}php
{# 2. 數組#}
{# $this->render('template.html.twig', array('user' => array('name' => 'Fabien')) ) #}
{{ user.name }}css
{# 仍是數組 #}
{{ user['name'] }}html
{# 3. 對象#}
{# $this->render('template.html.twig', array('user' => new User('Fabien')) ) #}
{{ user.name }}
{{ user.getName }}前端
{# 仍是對象 #}
{{ user.name() }}
{{ user.getName() }}
裝飾模版
一般在模版中分享通用的元素好比頭,尾,twing用繼承的方式來處理,這個特性能夠用來定義模板中的公共部分和塊,這樣子模版就可使用了。
在下面的例子中index.html.twig模塊繼承base.html.twing模板。java
{# app/Resources/views/default/index.html.twig #}
{% extends 'base.html.twig' %}web
{% block body %}
<h1>Welcome to Symfony!</h1>
{% endblock %}ajax
打開app/Resources/views/base.html.twig這個文件看數據庫
{# app/Resources/views/base.html.twig #}
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>{% block title %}Welcome!{% endblock %}</title>
{% block stylesheets %}{% endblock %}
<link rel="icon" type="image/x-icon" href="{{ asset('favicon.ico') }}" />
</head>
<body>
{% block body %}{% endblock %}
{% block javascripts %}{% endblock %}
</body>
</html>json
block這個標籤告訴模板它的子模板將會繼承這個部分,注意在父模板中叫body那在子模板中也叫body,在上面的例子中子模板替代了父模板中的body
而不是title和javascript等其餘的什麼。
標籤,過濾,方法
twig的最好的特色是標籤,過濾,方法,下面的例子使用這些功能來處理信息,而後輸出。
<h1>{{ article.title|capitalize }}</h1>
<p>{{ article.content|striptags|slice(0, 255) }} ...</p>
<p>Tags: {{ article.tags|sort|join(", ") }}</p>
<p>Activate your account before {{ 'next Monday'|date('M j, Y') }}</p>
在twig文檔中有詳細介紹。
包含其餘的模板
在模板中和其餘模板分享小片斷最好的方式是建立一個新的模板組件,而後在其餘的模板中包含它。
想一想一下咱們要在一個頁面中顯示一些廣告,先來建立一個banner.html.twig組件,以下
{# app/Resources/views/ads/banner.html.twig #}
<div id="ad-banner">
...
</div>
在其餘的頁面中顯示這個廣告組件,使用includ方法,以下
{# app/Resources/views/default/index.html.twig #}
{% extends 'base.html.twig' %} {#這裏繼承父模板#}
{% block body %}
<h1>Welcome to Symfony!</h1>
{{ include('ads/banner.html.twig') }} {#這裏include一個小廣告組件#}
{% endblock %}
植入其餘的控制器,好吧沒見過這個
如何在當前模板中植入其餘的控制器中的內容,想一想一下,在使用ajax,在當前模板中使用其餘模板中的一些變量的時候是頗有用的,我也是這麼想的。
假設咱們建立了一個動做topArticlesAction來顯示熱門文章,若是咱們想在渲染index模板中中的一些html內容來顯示這些熱門文章,使用下面的方法
{# app/Resources/views/index.html.twig #}
{{ render(controller('AppBundle:Default:topArticles')) }}
那這個是否是粒度越小越好呢
這裏的render()方法和controller()方法使用語法AppBundle:Default:topAritcles來引用Default控制器中的topArticle方法
class DefaultController extends Controller
{
public function topArticlesAction()
{
// look for the most popular articles in the database
$articles = ...;
return $this->render('default/top_articles.html.twig', array(
'articles' => $articles,
));
}
// ...
}
建立連接
連接是網站必不可少的元素,除了使用硬編碼url以外path方法能夠根據路由配置生成url,這樣修改路由配置就能夠修改這些連接了,是啊,這個我也知道啊
<a href="{{ path('homepage') }}">Return to homepage</a>
注意這裏的homepage是一個配置好的路由哦,不要搞錯了。還有一個方法url和path很像,可是它是用來產生絕對的url的方法,這個在鏈到外部網站和RSS文件,的時候頗有用哦
引用資源文件:images,javascript,stylesheets
不能想一想網站裏面沒有圖片,javascript,stylesheets這些會是什麼樣子,你不說我也知道啊。symfony中使用asset資源這個單詞來引用資源文件,so easy
<link href="{{ asset('css/blog.css') }}" rel="stylesheet" type="text/css" />
<img src="{{ asset('images/logo.png') }}" />
asset方法在/web路徑下的文件,詳細內容參考其餘,你媽 指針,又見指針!
還有雙花括號和上面的引用變量是同樣的。若是是其餘路徑裏面的呢,你媽,想的還真簡單。
使用asset方法可使得引用資源更加方便,爲啥內,緣由是這樣能夠移動應用下的文件夾到任何路徑,不須要修改模板中的代碼,前提是不移動web裏面的內容,差點被你繞進去,不要讓我覺得能夠移動任何文件,資源文件目錄是不能移動的,固然不用改asset,切!
最後
由於有了繼承父模板extends,塊block,包含其餘小模板include('ads/banner.html.twig'),植入控制器render(controller('AppBundle:Default:topArticles'))因此模板很容易按照邏輯來擴展,是的,我也是這麼認爲的。
3.控制器
控制器能夠作什麼呢,
symfony定義成一種請求-響應框架,當你發送一個請求symfony建立一個Request對象來包裝請求信息,響應是控制器中的動做,響應的結果是html內容。咱們可使用$this->render()方法來返回一個響應結果,也能夠返回一個原始的響應結果,例如return new Response('Welcome to Symfony!');,我擦,我覺得是多高級的東西,不就是一個echo,var_dump麼
路由參數
大多數狀況下URLs裏面都會包含不少請求變量,好比在blog裏面去展現一篇文章,必定會傳一個文章ID之類的參數,系統才知道到底要顯示那一篇文章。在symfony中蠶食被包含在url中好比/blog/read/{article_title}/,這裏的參數名字不能重複,這不廢話。下面在src/AppBundle/Controller/DefaultController.php文件中咱們信添加一個方法helloAction
/**
* @Route("/hello/{name}", name="hello")
*/
public function helloAction($name)
{
return $this->render('default/hello.html.twig', array(
'name' => $name
));
}
而後在瀏覽器的url中輸入http://localhost:8000/hello/fabien,因爲沒有default/html.twig這個模板,返回錯誤。如今建立這個模板app/Resources/views/default/hello.html.twig,以下:
{# app/Resources/views/default/hello.html.twig #}
{% extends 'base.html.twig' %}
{% block body %}
<h1>Hi {{ name }}! Welcome to Symfony!</h1>
{% endblock %}
顯示Hi fabien! Welcome to Symfony!,若是咱們輸入http://localhost:8000/hello/thomas將顯示Hi thomas! Welcome to Symfony!若是輸入
http://localhost:8000/hello這樣的話將會報錯,應爲須要一個那麼參數,這個有點傻逼!
使用格式化輸出
如今web中要求輸出的不只僅是html內容,還有RSS文件的XML,webservice,json等等,symfony可使用_format變量選擇多種輸出,下面的例子中使用html形式輸出,而且給home一個默認值
/**
* @Route("/hello/{name}.{_format}", defaults={"_format"="html"}, name="hello")
*/
public function helloAction($name, $_format)
{
return $this->render('default/hello.'.$_format.'.twig', array(
'name' => $name
));
}
很明顯這裏若是有另一種方式輸出,就要使用另一個模板,在上面的例子中若是咱們設置defaults={"_format"="xml"},可能就要新建一個xml模板了hello.xml.twig,以下
<!-- app/Resources/views/default/hello.xml.twig -->
<hello>
<name>{{ name }}</name>
</hello>
好吧,這裏我知道爲啥用twig當模板了,既能夠做爲html文件,又能夠作xml文件等等。咱們訪問http://localhost:8000/hello/fabien,將會看到html頁面
由於_format的默認值是html,若是咱們訪問http://localhost:8000/hello/fabien.xml,這樣將在瀏覽器中輸出一個xml文件的內容了。
symfony將會自動選擇最合適的內容樣式,在@Route標記中使用requirements來代表支持的樣式,以下:
/**
* @Route("/hello/{name}.{_format}",
* defaults = {"_format"="html"},
* requirements = { "_format" = "html|xml|json" },
* name = "hello"
* )
*/
public function helloAction($name, $_format)
{
return $this->render('default/hello.'.$_format.'.twig', array(
'name' => $name
));
}
這樣的話這個hello動做支持三種形式的url如:/hello/fabien.xml /hello/fabien.json /hello/fabien.html,同時也要建三個模板
重定向
若是想重定向到另一個動做中可使用redirectToRoute()方法以下:
/**
* @Route("/", name="homepage")
*/
public function indexAction()
{
return $this->redirectToRoute('hello', array('name' => 'Fabien'));
}
redirectToRoute()方法能夠跳轉到hello動做並傳遞參數Fabien,我在想若是是其餘的控制器呢,你媽,只說一半啊
顯示錯誤信息
錯誤不可避免,若是是404錯誤,symfony提供一個錯誤頁,以下:
/**
* @Route("/", name="homepage")
*/
public function indexAction()
{
// ...
throw $this->createNotFoundException();
}
505錯誤直接拋出一個異常,symfony會直接跳到505錯誤,
/**
* @Route("/", name="homepage")
*/
public function indexAction()
{
// ...
throw new \Exception('Something went horribly wrong!');
}
你妹 , 裝逼 , 那麼多的異常,你都去定義啊
從請求中獲取信息
有時候控制器須要獲取用戶請求的信息如語言,IP地址,url參數等,這時能夠在動做中添加一個Request類型的參數,名字能夠隨意,同時別忘了添加引用use Symfony\Component\HttpFoundation\Request;,這個是symfony本身定義的一個類型哦,不要搞錯
/**
* @Route("/", name="homepage")
*/
public function indexAction(Request $request)
{
// is it an Ajax request?是不是ajax請求
$isAjax = $request->isXmlHttpRequest();
// what's the preferred language of the user?用戶是什麼語言環境
$language = $request->getPreferredLanguage(array('en', 'fr'));
// get the value of a $_GET parameter獲取$_GET請求
$pageName = $request->query->get('page');
// get the value of a $_POST parameter獲取$_POST請求
$pageName = $request->request->get('page');
}
這寫仍是比較實用的,同時在模板中也可使用app.request變量來獲取這些信息,symfony給咱們提供了這些信息,以下:
{{ app.request.query.get('page') }}
{{ app.request.request.get('page') }}
使用session保存數據
即便HTTP協議沒有國籍的,裏面已經包含了session的定義,symfony仍是提供了一個session對象,在兩個請求之間symfony經過cookie保存session,在控制器中能夠很方便的取到session的值
public function indexAction(Request $request)
{
$session = $request->getSession();
// store an attribute for reuse during a later user request
$session->set('foo', 'bar');
// get the value of a session attribute
$foo = $session->get('foo');
// use a default value if the attribute doesn't exist
$foo = $session->get('foo', 'default_value');
}
還能夠存儲一個閃存,在下一個請求以前刪除這個閃存,這樣在跳到下一個動做以前輸出這個信息,以下:
public function indexAction(Request $request)
{
// ...
// store a message for the very next request
$this->addFlash('notice', 'Congratulations, your action succeeded!');
}
同理在模板中也可使用這個閃存
<div>
{{ app.session.flashbag.get('notice') }}
</div>
4.Symfony和HTTP基礎工具
感謝你可以看到這裏,symfony本意是迴歸本真:開發一個讓咱們更快,建立更具魯棒性的應用。同事symfony努力從你已經瞭如指掌的,習覺得常的技術中汲取最好的部分。經過symfony不只僅學到框架,還會學到不少的web基礎知識。
這一部分咱們解釋symfony的哲學,也是web開發的基礎:HTTP。無論你有任何變成背景和語言基礎,這一張是必看章節。
HTTP很簡單
http是兩臺電腦之間進行通信的一種文本語言,例如咱們在xkcd網站中查看最近的喜劇電影,下面的事情將會發生。個人瀏覽器發出請求->xkcd
服務器接到請求->服務器準備html頁面->服務器將html頁面發到個人瀏覽器。固然實際用到的語言可能要比這個正規,但仍然是很簡單的。HTTP是用來描述的這種文本信息的語言。不論你怎麼樣來構建應用,目標都是來理解這個請求,而後返回文本形式的響應。
symfony從現實生活中構建,無論理是否意識到這都在你身邊發生,經過symfony來學習這些。好吧,帶我裝逼帶我飛。
第一步:客戶端發出請求
web上每個會話都是從一個請求開始,這個請求是經過一個瀏覽器,手機app等經過文本的方式,http格式發送出來,瀏覽器發送出請求,而後就在那等待響應。
一個http-speak實際上長這樣:
GET / HTTP/1.1
Host: xkcd.com
Accept: text/html
User-Agent: Mozilla/5.0 (Macintosh)
這個簡單的消息裏包含了一個請求的全部必須的信息,
第一行是最重要的,它包含兩個信息URI和HTTP請求方法,URI代表請求的地址和咱們想要的資源,http方法定義了你想如何操做資源
GET 從服務器獲取資源
POST 在服務器中建立資源
PUT 向服務器上傳資源
DELETE 刪除服務器上的資源
能夠想一想如何刪除blog上的一篇文章:DELETE /blog/15 HTTP/1.1
實際上HTTP協議中定義了9中HTTP請求方式,只不過不少沒有普遍使用起來,實際上不少的瀏覽器甚至不支持PUT和DELETE方法。除了第一行,其餘行也提供了不少信息,他們合在一塊兒稱做HTTP頭,其餘的信息還包含Host,accept表示接受響應的格式,agent表示客戶用來請求的代理信息
第二步:服務端返回響應
一旦服務器接收到請求,它知道要請求什麼資源(URI),如何操做資源(method)等等。響應的格式以下:
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響應狀態這裏是200,狀態碼傳達了請求返回的信息,請求成功與否,是否有錯,有不一樣的狀態碼,能夠查看響應的http狀態碼。好的我知道!
和HTTP請求差很少的,響應也有一些附帶信息,例如一個HTTP響應頭裏有Content-Type,返回的內容可能以不一樣的狀態例如HTML,XML,JSON,內容類型text/html告訴瀏覽器要返回的是一段html文本。還有不少類型,有些很是強大,有些響應頭能夠建立強大的緩存,我咋不知道呢?
請求,響應和web開發
這個請求響應會話是整個web的基礎,可是它並非很複雜。好吧,下面進入裝逼模式,實際上無論咱們使用何種語言,創建何種應用web,mobile,json api或者開發的邏輯,最終的目標老是理解這種請求,而後返回合適的響應。
symfony努力接近這種事實!
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請求中獲取信息,而後建立一個響應。PHP使用全局變量$_SERVER和$_GET來檢索請求信息。一樣使用header方法來建立一個響應最後輸出響應返回給瀏覽器。
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
symfony裏面的請求響應
symfony經過兩個類提供處理請求響應的方法,Request類是處理請求的一個類,經過下面例子來看這個類有什麼功能:
use Symfony\Component\HttpFoundation\Request;
$request = Request::createFromGlobals();
// the URI being requested (e.g. /about) minus any query parameters,請求路徑,不帶參數
$request->getPathInfo();
// retrieve GET and POST variables respectively 獲取get,post數據
$request->query->get('foo');
$request->request->get('bar', 'default value if bar does not exist');
// retrieve SERVER variables 獲取服務器變量
$request->server->get('HTTP_HOST');
// retrieves an instance of UploadedFile identified by foo 獲取上傳實例
$request->files->get('foo');
// retrieve a COOKIE value 獲取cookie
$request->cookies->get('PHPSESSID');
// retrieve an HTTP request header, with normalized, lowercase keys 使用key獲取請求的頭,
$request->headers->get('host');
$request->headers->get('content_type');
$request->getMethod(); // GET, POST, PUT, DELETE, HEAD 獲取請求的類型
$request->getLanguages(); // an array of languages the client accepts 獲取語言
Request類中有不少功能,細節不用開發者考慮,例如isSecure()方法檢查PHP中三個變量判斷當前請求是否是安全請求HTTPS
參數包和請求屬性
symfony使用query和request來獲取php中$_GET和$_POSR的相關信息,這兩個對象是參數包對象,很好理解,就是獲取各類參數的,都有一些方法get(),has(),all(),等。
Request類裏面還有個公共的屬性attributes,在這個屬性中能夠獲取路由相關的信息,例如_controller,id,甚至是_route。
symfony還有個Response類,這個類中設置響應信息,例子以下:
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中request和response被稱做HttpFundation,這個類徹底能夠從symfony中分離出來用在其餘的框架中,還有處理sessiong的,處理文件的等等其餘的類。好吧 ,我知道,這個多了。
從Request到Response的旅程
像HTTP同樣,request和response很簡單,咱們面臨的重要的任務是在請求和響應之間的處理,換一種說法是咱們真正個工做是編寫代碼來解釋請求,建立響應。好! 這個逼裝的比較牛!
咱們的應用可能會發送郵件,處理權限,把數據保存到數據庫,渲染html等等,如何處理這些複雜的邏輯同事保持代碼可維護性呢?
前端控制器
傳統php應用中每個頁面有一個單獨的php文件。
index.php
contact.php
blog.php
這樣寫有一些問題,處理url的時候不夠靈活,若是把blog.php修改城news.php那就要修改超連接的屬性了,若是不少地方都有這個超連接那就要修改不少的地方了。
若是隻有一個文件來處理這些請求就能夠避免這些麻煩,不見得
/index.php executes index.php
/index.php/contact executes index.php
/index.php/blog executes index.php
symfony中這些前端路由能夠處理不少不一樣請求。前端控制器把不一樣請求分配到不一樣地方,幾乎全部的web應用都有這個功能例如wordpress。
保持調理清晰
使用前端控制器咱們須要算出那些須要處理的代碼,那些須要返回,這須要分析url而後計算出訪問那些代碼而後處理,這個過程可能會比較麻煩
// 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 ('/contact' === $path) {
$response = new Response('Contact us');
} else {
$response = new Response('Page not found.', Response::HTTP_NOT_FOUND);
}
$response->send();
好吧,進入裝逼模式!處理這種請求會很麻煩那,所幸的是symfony就是爲了解決這個問題而設計的。
Symfony應用的運行流程
symfony按照相同的方式處理全部的請求,以下
路由系統解釋請求而後傳遞給控制器中的方法最終返回響應對象
在路由配置文件每個頁面都被匹配到不一樣的php方法上面,這個php方法稱做控制,使用請求中的消息,使用symfony中的工具建立一個響應對象。換句話說控制是如何介紹請求和建立響應。
裝逼好累!咱們來總結一下:
每個請求執行一個前端路由文件
路由系統根據請求路徑和路由配置文件決定那一個php方法會被執行
若是正確的方法被執行,返回合適的響應
symfony請求處理示例
這裏咱們舉一個簡單的例子來看看處理過程,假設有一個/contact頁面,首先在symfony中的路由配置文件中添加一個入口;
YMAL版本的:
# app/config/routing.yml
contact:
path: /contact
defaults: { _controller: AppBundle:Main:contact }
XML版本的:
<!-- app/config/routing.xml -->
<?xml version="1.0" encoding="UTF-8" ?>
<routes xmlns="http://symfony.com/schema/routing"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://symfony.com/schema/routing
http://symfony.com/schema/routing/routing-1.0.xsd">
<route id="contact" path="/contact">
<default key="_controller">AppBundle:Main:contact</default>
</route>
</routes>
PHP版本的:
// app/config/routing.php
use Symfony\Component\Routing\Route;
use Symfony\Component\Routing\RouteCollection;
$collection = new RouteCollection();
$collection->add('contact', new Route('/contact', array(
'_controller' => 'AppBundle:Main:contact',
)));
return $collection;
當咱們請求/contact頁面的時候,匹配成功,執行控制,而後AppBundle:Main:contact這個語法被解釋成指向MainController控制器中的contactAction方法。以下:
// src/AppBundle/Controller/MainController.php
namespace AppBundle\Controller;
use Symfony\Component\HttpFoundation\Response;
class MainController
{
public function contactAction()
{
return new Response('<h1>Contact us!</h1>');
}
}
這是個簡單例子,它只返回一段html,並無渲染某個html文件。
Symfony:專一項目自己,而不是工具
前面講過全部的web應用都是圍繞解釋請求返回響應這一目標的,當項目變大了,組織維護難度增長。咱們會發現相同一個功能是否是地蹦出來,例如鏈接數據庫,渲染模板,處理用戶輸入,發送email,驗證數據等等。
好吧 ,symfony提供不少的工具來處理這些繁瑣的事情,在symfony裏沒有任何東西能夠阻擋你完成這些任務,你只須要了解其中的部分或者全部工具,這就是symfonyframework
獨立的工具箱: Symfony 組件
symfony究竟是什麼呢?首先symfony包含了20多個類庫,可供PHP項目中使用,這些叫symfony組件,舉幾個例子:
HttpFoundation
包含request,response類和一些處理sessiong,文件上傳的類
Routing
處理路由請求的類,能夠將請求匹配到某個動做上
Form
一個建立,處理form請求的類
Validator
建立規則驗證用戶輸入是否合乎要求
Templating
渲染模板的工具集,處理模板繼承及其餘模板任務
Security
處理各類安全請求
Translation
用來翻譯字符串的類
這些組件能夠單獨抽出來放在其餘的php項目中,也能夠在symfony中添加其餘的組件以知足本身的開發需求。
全方位解決方案: Symfony 框架
好了,如今再次問本身一個問題,symfony是什麼,symfony是一個php類庫來解決兩個任務:
1.提供可選擇的組件或者第三方組件例如發送郵件等。
2.提供顯式的配置和一個膠水類來把一些php片斷組合起來
symfony整合各類工具爲開發者提供一致的使用體驗,symfony框架自己就是一個束,能夠被配置和替換。symfony提供強大的工具集,初學者能夠快速上手,高級開發者能夠超常發揮。本節裝逼結束。