symfony學習筆記1—簡介
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轉過來的開發人員么?
造孽!。
最后,看完入門篇了。
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') }}" />
</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') }}">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提供強大的工具集,初學者可以快速上手,高級開發者可以超常發揮。
本節裝逼結束。
作者:Tyler Ning
出處:http://www.rzrgm.cn/tylerdonet/
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,如有問題,請微信聯系冬天里的一把火
浙公網安備 33010602011771號