ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
**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 看到运行效果