说明:本篇学习笔记是学习http://www.chrisyue.com/symfony-in-action-day-2.html 记录的,作者用的是symfony2.7-的版本,本篇用的是symfony3的版本。
我们已经成功初始化一个 Symfony 项目,今天我们将在此基础上继续添砖加瓦
在此之前,我们先明确一下我们要实现什么功能,在开始开展具体的代码工作前先明确自己的目标是一个节省时间的好习惯。我们的需求如下:
用户可以使用新浪微博或者 QQ 帐号登录。
用户可以投稿,需要填写的内容为“标题”+“正文”
用户可以对某篇文章进行评论
在以上的基础上,我们继续具体化我们的需求:
用户的内容都将使用 markdown 格式
评论内容不可超过 140 个字
新闻内容不可超过 5000 个字
标题内容不可超过 70 个字
好,到这里我们的需求已经很明确了,虽然简单得似乎不可能会有人用的样子~
修改配置文件
直接修改 app/config/parameter.yml
![](https://box.kancloud.cn/12ce5936b6d87833f2226147d87c909d_996x460.png)
symfony2可以点击“configure”按钮进行修改。
清理不需要的文件和代码
首先需要清理的是 app/AppKernel.php 文件。在这里首先说一个 Symfony 世界里的“术语”:
什么是 Bundle
我认为 Bundle并没有明确的定义,一般来说,如果某几个功能,相互之间有关联,并且相互影响,或者都属于某一类功能,这些功能就可以捆绑在一起成为一个 Bundle。Bundle 是一个目录,里面包含了此 Bundle 的相关代码以及配置文件。“Bundle”本来就有“一捆”的意思。比如 Symfony 自带演示项目 Acme,就是一个 Bundle 的例子。在 AcmeDemoBundle 里的所有代码,都是为了演示用的,所以大家可以随意删除此 Bundle 而不用担心会影响现有的项目。但为了大家的入门速度以及不把大家搞晕,这里先不多说了。
现在打开 app/AppKernel.php
symfony3没有Acme相关的,symfony2有,请参照最上面的链接。
要想首页能够被访问,我们得在 routing***.yml 里添加有关首页的配置。
由于首页是无论开发环境还是生产环境都需要访问的,我们就把配置写在 routing.yml 里好了,注意之前说过 routing_dev.yml 已经包含了 routing.yml 了。
我们打开 app/config/routing.yml文件,可以看到已经有如下内容:
![](https://box.kancloud.cn/d21a3e3f4c0efaaac8ffa994dcc45ebe_752x174.png)
我们打开 @AppBundle/Controller/ 里随便什么文件,看看注解格式到底是个啥。
![](https://box.kancloud.cn/ed3b3b8521187671d5dd425c6410cd86_1582x404.png)
再访问首页,就出现一个写了Homepage!!!的页面。
这是写在:
app/Resources/views/base.html.twig
![](https://box.kancloud.cn/f858d2a5a3a4d5b887fb42ae6fcfb00f_1890x676.png)
看有一行Homepage
为了方便开发新闻模板,我们先给首页加一个链接 /news
我们可以直接将 Homepage. 替换成 <a href="/news">新闻</a>。但是这样做有一个不好的地方:如果想改路径,比如改成 /新闻,那么每个连接到“新闻”的 href="/news" 都需要改一遍。Symfony 以及 Laravel 或者 ROR 等现代框架,几乎都支持“双向路由”,即在路径和对应的控制器方法之间,再加一个路由名。此路由名可对应一个路径,又对应一个控制器方法。前端模板里不再直接写路径,而是写路由名:
` <a href="{{path('news_index')}}">新闻</a>`
以后想修改路径,都只用改一下配置文件即可。
修改好以上代码,再访问首页,又会出现以下错误:
An exception has been thrown during the rendering of a template ("Unable to generate a URL for the named route "news_index" as such route does not exist.").
意思是,目前还没有一个叫 news 的路由规则。OK 我们现在来创建它:
我们把新闻相关的路径都放在 AppBundle\Controller\NewsController 类里:
~~~
namespace AppBundle\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
class NewsController extends Controller
{
/**
* @Route("/", name="news_index")
*/
public function indexAction()
{
return $this->render('news/index.html.twig');
}
}
~~~
并且为其创建模板文件 app/Resources/views/news/index.html.twig,目前就是空文件就行。
此时再刷新首页,错误消失。并且“新闻“已经可以点击。
创建文件时需要大家注意的是,一定要确认代码的文件的编码格式是 UTF-8,否则会出现不可预料的字符乱码问题。