**MVC三個字母的含義:

M:Model 模型,負責數據庫操作。
V:View 視圖,負責調用Model調取數據,再調用模板,展示出最終效果。
C:Controller 控制器,程序的入口,決定改調用哪個View,并告訴View該做什么。
如此說來,程序的執行順序是C-V-M 或 C-M ,和MVC的名字正好相反。**
接上面的過程繼續學習,運行http://localhost:8000/config.php,symfony全檢查我們的php.ini的配置,我們安里面的提示進行修改,以達到安全高效的配置。
我們生成的blog目錄如下圖

#### app目錄
這個目錄是整個框架的運行核心。一些重要的核心文件,如autoload.php,AppKernel等文件都在該目錄中。
它又包括幾個子目錄,也非常重要。
config:這里存放應用所有的配置。在日后討論中,我們會慢慢接觸這些文件。
Resources:這里可以存放應用級別的資源,如模板文件(在views子目錄下)。
bin目錄
console:該文件是SF命令行界面,我們稍后在開發過程中會經常用到這個命令。
#### src目錄
用戶編寫的所有內容都在該目錄下,嚴格的說,是在AppBundle目錄下。根據代碼的用途,AppBundle目錄下又可以分為:
Controller:控制器,即MVC中的C。
Entity:實體,即MVC中的M。
Repository:倉庫,存放實體操作的代碼。
Resources\config:存放當前應用包的配置,如路由,數據庫實體等。
Resources\views:存放模板,即MVC中的V。
Tests:存放單元測試和功能測試代碼。
在項目剛創建完成時,這些目錄(除了Controller)都不存在。我們在日后開發過程中,可以選擇生成。
#### tests目錄
此處存放所有的測試文件,包括單元測試和功能測試。
#### var目錄
該目錄中有三個子目錄。
cache:存放SF編譯用戶代碼和系統代碼后的緩存。根據實際使用情況,又可能會有prod,dev和test子目錄,分別對應生產、開發、測試環境。
logs:存放日志文件,如dev.log對應的是開發環境下的日志文件。
sessions:存放PHP和SF運行時創建的對話信息。
vendor目錄
所有第三方的包和代碼存放在此處。一般情況下我們在此處進行操作。
#### web目錄
這個目錄是SF3應用開放給Web服務器的入口,也就是我們常規情況下訪問http://www.xxx.com時,Web服務器所訪問的根目錄。請不要和我們之前說的“項目根目錄”混淆。
在這個目錄中,有SF3應用的入口文件:app.php(生產模式)和app_dev.php(開發模式)。在實際應用中,我們訪問的是app.php——當然,因為有重寫規則的存在和該目錄下.htaccess文件的配合,我們訪問一個SF應用時,不需要指明app.php,而可以直接用類似http://www.xxx.com/path/to/resource這樣的方式。在開發時,我們更多的是使用app_dev.php,此時我們訪問的URI形如:http://www.xxx.com/app_dev.php/path/to/resource。
打開 app->config->parameters.yml 文件,里面是我們的數據庫及郵件發送配置
如下圖:

上圖的resources目錄下的views是存文view層,即是視圖層,symfony用的是twig的模板,它有自己定義的語法。但最終會被解析成為php。
打開index.html.twig
{% extends 'base.html.twig' %} 這一行表示這一個模板繼承了 base.html.twig
以下為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>
~~~
我們改一下index.html.twig
* * * * *
{% extends 'base.html.twig' %}
{% block body %}
study symfony body
{% endblock %}
{% block title %} study symfony title 部分 {% endblock %}
{% block stylesheets %}
<style>
body { background: #F5F5F5; font: 18px/1.5 sans-serif; }
h1, h2 { line-height: 1.2; margin: 0 0 .5em; }
h1 { font-size: 36px; }
h2 { font-size: 21px; margin-bottom: 1em; }
p { margin: 0 0 1em 0; }
a { color: #0000F0; }
a:hover { text-decoration: none; }
code { background: #F5F5F5; max-width: 100px; padding: 2px 6px; word-wrap: break-word; }
#wrapper { background: #FFF; margin: 1em auto; max-width: 800px; width: 95%; }
#container { padding: 2em; }
#welcome, #status { margin-bottom: 2em; }
#welcome h1 span { display: block; font-size: 75%; }
#icon-status, #icon-book { float: left; height: 64px; margin-right: 1em; margin-top: -4px; width: 64px; }
#icon-book { display: none; }
@media (min-width: 768px) {
#wrapper { width: 80%; margin: 2em auto; }
#icon-book { display: inline-block; }
#status a, #next a { display: block; }
@-webkit-keyframes fade-in { 0% { opacity: 0; } 100% { opacity: 1; } }
@keyframes fade-in { 0% { opacity: 0; } 100% { opacity: 1; } }
.sf-toolbar { opacity: 0; -webkit-animation: fade-in 1s .2s forwards; animation: fade-in 1s .2s forwards;}
}
</style>
{% endblock %}
* * * * *
Twig也可以說是Symfony系列產品中的一個,它的開發者也是Fabien Potencier。
Symfony 3缺省安裝時也會安裝Twig。其官方站點是http://twig.sensiolabs.org/。
Twig非常輕量級,語法也十分簡明。簡單說來,它只有兩種語法:
{{ say something }}表示的是一種輸出;
{% control something %}表示的是一種控制。
它還支持模板的嵌入、擴展、繼承,以及一些所謂的過濾器(比如將一個日期型變量以某種格式輸出)。同時,用戶也可以在SF2中編寫自己的過濾器。
Twig采用obj.member值這樣的方式來訪問傳遞到模板中的變量的屬性、成員。所以,如果我們傳遞一個如下的變量到Twig模板中:
$summary['bc']=100;
$summary['wc']=10000;
在Twig模板中,我們就可以通過這樣的語法來訪問其成員:
{{summary.bc}} {{summary.wc}}
注意:Twig中所有用到的變量、對象都必須顯式賦值。變量的定義可以在Twig內部進行,但更多的時候是應用通過控制器傳遞給模板的。
更多Twig的實際使用我們會在后續文章中講到。
{{XXX}}顯示什么 {% xxx%} 做什么 區別一下。
刷新 http://127.0.0.1:8000/
如下效果:

創業一個controller
AboutController 我們通過DefaultController 復制進行稍微修改
<?php
namespace AppBundle\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
class AboutController extends Controller
{
/**
* @Route("/about", name="About")
*/
public function indexAction(Request $request)
{
die('About controller');
// replace this example code with whatever you need
return $this->render('default/index.html.twig', [
'base_dir' => realpath($this->getParameter('kernel.root_dir').'/..').DIRECTORY_SEPARATOR,
]);
}
}
注意:
/**
* @Route("/about", name="About")
*/
/about是路由
http://127.0.0.1:8000/about 看到運行效果