# 在Symfony中創建第一個頁面
創建頁面,無論是HTML還是JSON,都僅僅只有兩步:
創建路由:路由就是指向控制器和頁面的URL(比如,`/about`)
創建一個控制器:控制器就是您創建頁面的PHP函數。您搜集請求信息,并產生Symfony `Response`對象,它可以處理HTML內容,JSON字符串,甚至是二進制文件,譬如一個圖片文件或者PDF文件。
# 創建頁面:路由和控制器
在繼續之前,請確保您已經閱讀了[安裝](243916)章節,并且可以在瀏覽器中訪問您的Symfony項目。
假設您想創建一個頁面,`/lucky/number`,它將會生成一個幸運數字(當然是隨機的),并且打印它。那么,創建一個“控制器類”和一個“控制器”方法用來當有人訪問`/lucky/number`時執行您的業務需求。
~~~
// 編輯的文件是:src/AppBundle/Controller/LuckyController.php
namespace AppBundle\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Component\HttpFoundation\Response;
class LuckyController
{
/**
* @Route("/lucky/number")
*/
public function numberAction()
{
$number = mt_rand(0, 100);
return new Response(
'<html><body>Lucky number: '.$number.'</body></html>'
);
}
}
~~~
在解釋代碼之前,請測試它。如果您使用PHP內置Web服務器,請訪問以下URL:
http://localhost:8000/app_dev.php/lucky/number
如果您使用的是內置的PHP Web服務器,那么URL中的app_dev.php可以省略。
如果您在瀏覽器中看到一個幸運數字,恭喜您。但高興之余,請想想它是如何運行的?還記得創建頁面的兩個步驟嗎?
1. 創建路由:`numberAction`方法上的`@Route`就是路由,它定義了這個頁面的URL模式。您將在[路由](244172)了解到更多關于路由的知識,包括如何創建可變URL。
2. 創建控制器:路由下邊的方法-`numberAction()`就是控制器。它是您創建頁面,最終返回一個`Response`對象的地方。您將在[控制器](244173)章節中學到更多關于控制器的細節,包括如何返回JSON數據。
# Web Debug工具
如果您的頁面工作良好,那么您會在瀏覽器底部看到一個工具條。他被稱為Web Debug工具條:您的調試好幫手。您將會學到更多有關它的知識,但現在請移動鼠標,點擊不同圖標來獲取關于路由、性能、日志等等調試信息。
# 渲染模板(使用服務容器)
如果控制器返回的是HTML,那您可能像渲染一個模板。幸運的是Symfony整合了`Twig`,一個易學、強大的,事實上相當有趣的一個模板語言。
首先,請確保`LuckyController`繼承自Symfony的基類`Controller`
~~~
// 編輯的文件是 src/AppBundle/Controller/LuckyController.php
// ...
// --> add this new use statement
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
class LuckyController extends Controller
{
// ...
}
~~~
現在就可以使用render()方法來渲染一個模板,給它我們生成的幸運數字變量,這樣我們就可以渲染頁面了。
~~~
// 編輯的文件是 src/AppBundle/Controller/LuckyController.php
// ...
class LuckyController extends Controller
{
/**
* @Route("/lucky/number")
*/
public function numberAction()
{
$number = mt_rand(0, 100);
return $this->render('lucky/number.html.twig', array(
'number' => $number,
));
}
}
~~~
最后,模板文件應該放在`app/Resources/views`目錄中。在`app/Resources/views/lucky`目錄下創建一個名為`number.html.twig`的新文件。
~~~
{# app/Resources/views/lucky/number.html.twig #}
<h1>Your lucky number is {{ number }}</h1>
~~~
在`Twig`中,`{{ number }}` 語法是用來輸出變量的。刷新瀏覽器來獲取您新的幸運數字。
http://localhost:8000/lucky/number
在[創建和使用模板](244174)章節中,您將學到關于Twig的一切:如何循環,渲染其他模板,掌握它強大的布局集成系統。
# 項目結構一覽
重大新聞!您已經在項目兩個最重要的目錄下工作了:
`app/`
包含了譬如配置和模板這類東西。基本上凡是不是PHP代碼的東西都在這兒。
`src/`
您PHP代碼所在地。
99%的時間里,您將會工作在`src/`(PHP文件)或者是`app/`(其他文件)。隨著閱讀的深入,您將學到它們都能做什么。
那么,項目其他目錄是做什么?
`bin/`
著名的bin/console文件就在這里(其他相對不太重要的執行文件)。
`tests/`
應用自動測試目錄(比如單元測試)。
`var/`
用來存儲自動創建的文件。比如緩存文件(`/var/cache/`),日志文件(`var/logs/`)和session文件(`/var/sessions/`)。
`vendor/`
第三方類庫放在這里!他們是通過Composer包管理器下載到這里的。
`web/`
這是項目的文檔根目錄:請將公眾文件放在這里(比如:CSS,JS和圖片)
# Bundles和配置
您的Symfony應用包含了一組預安裝的Bundles,像`FrameworkBundle`和`TwigBundle`。Bundles和插件的理念很類似,但有個很重要的不同:所有Symfony應用的功能都來自Bundles。
Bundles是通過app/AppKernel.php(app/目錄下少有的PHP文件)注冊的。每個Bundles都為您提供了大量的*工具*,有時被稱為*服務*。
~~~
class AppKernel extends Kernel
{
public function registerBundles()
{
$bundles = array(
new Symfony\Bundle\FrameworkBundle\FrameworkBundle(),
new Symfony\Bundle\TwigBundle\TwigBundle(),
// ...
);
// ...
return $bundles;
}
// ...
}
~~~
例如,`TwigBundle`就是負責為您的應用添加Twig工具的。
事實上,您可以下載和添加更多第三方Bundles到您的應用來獲取更多的工具。假設您需要分頁列表功能,Symfony中有很多這樣的三方Bundles。
您可以通過`app/config/config.yml`文件來控制自己的Bundles行為。其他的細節,比如環境和參數將會在[配置](244175)章節中討論。