最近出於對Symfony的關注在網上閒逛時不時會留意Symfony的文章尤其是中文方面的前段時間拜讀了一餅兄的《Symfony入門》一文覺得比官網上的例子涉及面更廣便做了轉載今日有暇細讀卻發現一餅兄只是大體對Symfony做了介紹如果參照該文來入門的話卻是存在很大的問題於是便有了這一篇文章
下載
首先是下載Symfony這個簡單到 或者本站下載本人由於使用的是Ubuntu系統所以下了個tgz的然後解壓到/var/www目錄中
tar zxvf Symfony_Standard_Vendors_###tgz C /var/www
上面的###是指版本號我下的時候是BETA
當解壓之後Symfony的目錄如下
/var/www/ < Web根目錄
Symfony/ < Symfony解壓目錄
app/ < 存放symfony的核心文件的目錄
cache/ < 存放緩存文件的目錄
config/ < 存放應用程序全局配置的目錄
logs/ < 存放日志的目錄
src/ < 應用程序源代碼
vendor/ < 供應商或第三方的模組和插件
web/ < Web入口
appphp < 生產環境下的前端控制器
如果你需要安裝(如果你下載的是without vendor版本)或更新vendor(第三方)內容時可以使用
cd /var/www/Symfony
php bin/vendors install
配置
Symfony的配置很簡單只需要在浏覽器中輸入
http://localhost/Symfony/web/configphp
然後按照提示來進行就可以了其中值得注意的就是app/cache和app/logs目錄的權限問題由於我是在Ubuntu下安裝的所以可以使用(其中firehare是我的用戶名兄弟們在這裡可以用你的用戶名代替)
#為了保險起見
rm rf app/cache/*
rm rf app/logs/*
#設置ACL
sudo setfacl R m u:wwwdata:rwx m u:firehare:rwx app/cache app/logs
sudo setfacl dR m u:wwwdata:rwx m u:firehare:rwx app/cache app/logs
如果系統不支持setfacl命令的話要檢查個地方
setfacl是否已經安裝如果沒有的話可以通過以下命令安裝(在Ubuntu 中好象已經缺省安裝了包為叫acl)
sudo aptget install setfacl
如果setfacl已經安裝那麼請查看/etc/fstab文件看看是否添加了acl選項
# /var was on /dev/sda during installation
UUID=cccbabaf /var ext defaultsacl
然後根據頁面提示填寫數據庫名等信息再將這些信息拷到/var/www/Symfony/app/config/parametersini文件中如下所示
; These parameters can be imported into other config files
; by enclosing the key with % (like %database_user%)
; Comments start with ; as in phpini
[parameters]
database_driver="pdo_mysql"
database_host="localhost"
database_name="symfony"
database_user="symfony"
database_password="symfony"
mailer_transport="smtp"
mailer_host="localhost"
mailer_user=""
mailer_password=""
locale="zh_CN"
secret="feeccbddddcdbf"
如果全部OK的話在你浏覽器中輸入下列地址時你將得到一個Demo頁
http://localhost/Symfony/web/app_devphp
編程
創建Bundle
首先創建一個Bundle
php app/console gen:bundle "AcmeHelloBundle" src
為了確保Acme名稱空間可以被自動加載請在你的app/autoloadphp文件添加下列語句
$loader>registerNamespaces(array(
//
//添加自定義的名稱空間
Acme => __DIR__//src
//
));
最後是將該Bundle注冊到Symfony中請在你的app/AppKernelphp文件中添加下列語句
// app/AppKernelphp
public function registerBundles()
{
$bundles = array(
//
new AcmeHelloBundleAcmeHelloBundle()
);
//
return $bundles;
}
創建路由
路由可以創建在app/config/routingyml中但為了有個好的編程習慣和代碼組織可以將它放在所建Bundle目錄中的Resources/config/routingyml中而在app/config/routingyml中只保留到該路由文件的引用如下所示
# app/config/routingyml
homepage:
pattern: /
defaults: { _controller: FrameworkBundle:Default:index }
hello:
resource: "@AcmeHelloBundle/Resources/config/routingyml"
而真正的路由則寫在src/Acme/HelloBundle/Resources/config/routingyml路由文件中如下所示
# src/Acme/HelloBundle/Resources/config/routingyml
hello:
pattern: /hello/{name}
defaults: { _controller: AcmeHelloBundle:Hello:index name:pu }
創建控制器
控制器的名字一定得是HelloControllerphp原因很簡單因為你路由已經把控制器的名字給定下來了在上面路由文件中的第行和第行中的控制器都是以AcmeHelloBundle:Hello開頭的其中AcmeHelloBundle表示Bundle名而Hello則表示控制器名所以控制器必須是HelloControllerphpController名綴是命名約定而至於後面的index和say則是控制器類中的方法下面就定義了index方法當然方法名為indexAction這個也是命名約定
// src/Acme/HelloBundle/Controller/HelloControllerphp
namespace AcmeHelloBundleController;
use SymfonyComponentHttpFoundationResponse;
class HelloController
{
public function indexAction($name)
{
return new Response(<html><body>Hello $name!</body></html>);
}
}
這樣當我們在浏覽器中輸入
http://localhost/hello/index/World
就會顯示Hello World!這樣的字樣
創建模板
為了能夠重用布局文件中的區塊可以使用模板來代替控制器中的HTML語句首先創建頁面布局文件
{# app/Resources/views/layouthtmltwig #}
<!DOCTYPE html>
<html>
<head>
<meta httpequiv="ContentType" content="text/html; charset=utf" />
<title>{% block title %}Hello Application{% endblock %}</title>
</head>
<body>
{% block body %}{% endblock %}
</body>
</html>
注意該文件位於app/Resources/views/目錄中作用范圍是整個應用程序的全局模板文件在該文件中定義了兩個區塊title和body接下來就是創建一個專用於Hello控制器的模板如下所示
{# src/Acme/HelloBundle/Resources/views/Hello/indexhtmltwig #}
{% extends ::layouthtmltwig %}
{% block body %}
Hello {{ name }}!
{% endblock %}
在該文件中它繼承了全局模板並且定義了區塊body這樣就覆寫了全局模板中的body區塊如果系統在渲染到該模板時會將區塊body覆寫全局模板的區塊body再進行渲染
最後將控制器中的HTML語句改成渲染上述模板即可
// src/Acme/HelloBundle/Controller/HelloControllerphp
namespace AcmeHelloBundleController;
use SymfonyBundleFrameworkBundleControllerController;
class HelloController extends Controller
{
public function indexAction($name)
{
return $this>render(AcmeHelloBundle:Hello:indexhtmltwig array(name => $name));
}
}
打完收功!我們已經創建了一個典型的Symfony程序如果兄弟們有什麼疑問的話可以下面的評論中直接提
本文出自 “野火兔的窩” 博客請務必保留此出處
From:http://tw.wingwit.com/Article/program/PHP/201311/21317.html