目錄
1.symfony快速入門
2.symfony視圖簡介
3.控制器簡介
4.Symfony和HTTP基礎工具
裝逼好累!我們來總結一下:
全方位解決方案: Symfony 架構
1.symfony快速入門
symfony應用代碼結構如下:
app/:整個應用的配置,模版,translations。
src/:項目php檔案。
vendor/:第三方的依賴檔案。
web/:站點的入口路徑,必須在域名後面加上這個目錄才能通路整個站點,不存在入口檔案這一說法。包含資源檔案如css,javascript等靜态檔案,還有些前端的控制器什麼的。
在app/目錄下的AppKernel.php檔案,是整個應用的入口。在這個類裡面實作了兩個方法,registerBundles()注冊束,傳回所有注冊的bundles,registerContainerConfiguration()注冊容器配置,傳回配置檔案。
什麼是bundles束呢?官方解釋是束是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,對應DefaultController的indexAction方法。
在Vendors中包含一些第三方的類庫,這裡的東西最好不要修改,這些類庫是通過composer來管理的,這裡包含SwiftMailer類庫,DoctrineORM,Twig模版等等。
symfony中有自己的緩存系統,整個系統隻有在第一次請求的時候會從配置檔案中讀取,然後編譯成一個php檔案放在app/cache裡面。在開發環境,symfony在每次修改後自動更新緩存。但是在生産環境,每次修改後需手動删除緩存檔案。在開發的時候可能會有各種各樣的錯誤,這個時候就需要在app/log目錄中檢視日志檔案,對修改bug很有用。
指令行接口,在app/console目錄下包含一些指令行系統幫助我們修改應用。
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 }}
{# 2. 數組#}
{# $this->render('template.html.twig', array('user' => array('name' => 'Fabien')) ) #}
{{ user.name }}
{# 還是數組 #}
{{ user['name'] }}
{# 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模闆。
{# app/Resources/views/default/index.html.twig #}
{% extends 'base.html.twig' %}
{% block body %}
<h1>Welcome to Symfony!</h1>
{% endblock %}
打開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') }}" target="_blank" rel="external nofollow" />
</head>
<body>
{% block body %}{% endblock %}
{% block javascripts %}{% endblock %}
</body>
</html>
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') }}" target="_blank" rel="external nofollow" >Return to homepage</a>
注意這裡的homepage是一個配置好的路由哦,不要搞錯了。還有一個方法url和path很像,但是它是用來産生絕對的url的方法,這個在鍊到外部網站和RSS檔案,的時候很有用哦
引用資源檔案:images,javascript,stylesheets
不能想想網站裡面沒有圖檔,javascript,stylesheets這些會是什麼樣子,你不說我也知道啊。symfony中使用asset資源這個單詞來引用資源檔案,so easy
<link href="{{ asset('css/blog.css') }}" target="_blank" rel="external nofollow" 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
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一個預設值
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來表明支援的樣式,如下:
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()方法如下:
public function indexAction()
{
return $this->redirectToRoute('hello', array('name' => 'Fabien'));
}
redirectToRoute()方法可以跳轉到hello動作并傳遞參數Fabien,我在想如果是其他的控制器呢,你媽,隻說一半啊
顯示錯誤資訊
錯誤不可避免,如果是404錯誤,symfony提供一個錯誤頁,如下:
public function indexAction()
{
// ...
throw $this->createNotFoundException();
}
505錯誤直接抛出一個異常,symfony會直接跳到505錯誤,
public function indexAction()
{
// ...
throw new \Exception('Something went horribly wrong!');
}
你妹 , 裝逼 , 那麼多的異常,你都去定義啊
從請求中擷取資訊
有時候控制器需要擷取使用者請求的資訊如語言,IP位址,url參數等,這時可以在動作中添加一個Request類型的參數,名字可以随意,同時别忘了添加引用use Symfony\Component\HttpFoundation\Request;,這個是symfony自己定義的一個類型哦,不要搞錯
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提供強大的工具集,初學者可以快速上手,進階開發者可以超常發揮。
摘自:https://blog.csdn.net/lee_sire/article/details/50155629