**MVC三个字母的含义:
![](https://box.kancloud.cn/932328a5d21efd3113d0c217eaf70a3a_690x273.png)
M:Model 模型,负责数据库操作。
V:View 视图,负责调用Model调取数据,再调用模板,展示出最终效果。
C:Controller 控制器,程序的入口,决定改调用哪个View,并告诉View该做什么。
如此说来,程序的执行顺序是C-V-M 或 C-M ,和MVC的名字正好相反。**
接上面的过程继续学习,运行http://localhost:8000/config.php,symfony全检查我们的php.ini的配置,我们安里面的提示进行修改,以达到安全高效的配置。
我们生成的blog目录如下图
![](https://box.kancloud.cn/e87779848417cb274dcbf85a2a169901_337x409.png)
#### 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 文件,里面是我们的数据库及邮件发送配置
如下图:
![](https://box.kancloud.cn/a3ffb9d263bda714622acd6511cae807_994x670.png)
上图的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/
如下效果:
![](https://box.kancloud.cn/f26917f61665d39b053453a0c0abab60_615x604.png)
创业一个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 看到运行效果