💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
说明:本篇学习笔记是学习http://www.chrisyue.com/symfony-in-action-day-3.html 记录的,作者用的是symfony2.7-的版本,本篇用的是symfony3的版本。 用 KnpPaginatorBundle 实现翻页 我们已经创建好了新闻的首页。今天我们来实现添加新闻并且显示新闻的功能,并且学会使用 [Composer](http://getcomposer.org) 添加第三方 Bundle 来加速开发。 创建业务数据模型 新闻数据算是我们业务模型里必不可少的模型之一。根据我们之前对需求的分析,我们可以很容易想到,新闻模型News需要的属性: 标题属性 文本属性 接下来,我们要在 AppBundle 里创建它,但是这些数据还需要一个持久层来保存数据,例如之前配置的 Mysql。目前流行的开发方式,无论是 Java 还是 ROR,都会使用 ORM 将数据库字段和类属性关联起来。 Symfony 框架本身并不包含 ORM 工具(严格意义上来说,Symfony 框架,即 FrameworkBundle,不包含 ORM,安全组件,模板引擎,日志工具,邮件组件等一系列工具),只不过 Symfony installer 将一些推荐的,Web 开发常用的工具,都默认安装了。如果你已经知道如何用 Mysql 来存储/获取数据,也不一定非要用 ORM。这里我们为了快速开发,也为了省一些精力,就使用默认提供的 Doctrine2 ORM,它会给我们的开发带来许多便利。 注:ORM(Object Relational Mapping)用元数据来描述对象映射细节 决定了使用 Doctrine2,我们除了定义好 News 类,还需要写配置文件,让 Doctrine2 ORM 将 News 类同数据库某个表关联起来。听起来要做的工作不少,不过且慢,DoctrineBundle 里自带的代码生成工具能让我们的开发再快一点点: `$php bin/console doctrine generate:entity ` ![](https://box.kancloud.cn/7c8d895eba60ee7b70b588b85b97c393_1134x502.png) 此时会有欢迎提示出现,并且让你输入一个模型的“短名字”,为什么说是要输入短名字?News 并不是全名,全名应该是包含命名空间的,比如我们的 News 全名应该是 AppBundle\Entity\News,Entity 是什么?Entity 只是一个习惯性叫法。在 Doctrine2 的世界里,只要是 ORM 过的模型,都叫 Entity(除此之外还有用 MongoDB 作为存储方案的 ODM,ODM 过的模型习惯称之为 Document)。 后面我们就按照他们的提示,分别输入 ![](https://box.kancloud.cn/96b7c34c5e5fe1de2477fb5956ba6abc_1658x1442.png) 刷新 src/AppBundle 目录, 多了两个 目录,Entity,Repository, 包含了两个文件:News.php 和 NewsRepository.php。 ![](https://box.kancloud.cn/49263f199527517e4b002248ba9a762d_586x390.png) 打开 News.php 我们可以看到,News 类已经生成好了,并且还有用注解格式写的 ORM 配置。我的建议是可以用生成代码工具尽量用,一是快,二是不容易写错字。 此时,我们就可以用 DoctrineBundle 的数据库操作工具来生成数据的数据库和表了: `$php bin/console doctrine:database:create` Created database `symfonynews` for connection named default $php bin/console doctrine:schema:create ATTENTION: This operation should not be executed in a production environment. Creating database schema... Database schema created successfully! ![](https://box.kancloud.cn/2838780d021da65b55925a52d35b01ab_1070x360.png) 数据库创建好之后,我们应该创建“新建新闻”页和“新闻详情”页、以及更新我们之前写的“新闻首页”。不过且慢,DoctrineBundle 不仅仅能生成 Entity,它还能根据 Entity 直接生成相关的 Controller!这里我们先把之前的 NewsController 类文件删掉。然后使用下面命令: `$php bin/console doctrine:generate:crud` ![](https://box.kancloud.cn/c21d8ea5960497dfaa9371224d42ffa8_1196x608.png) ![](https://box.kancloud.cn/c5ba8d2b50b3be46cbd0be13e2032047_1326x840.png) ![](https://box.kancloud.cn/00dc547545c3eaac431f1d77470fad38_1238x856.png) 我们会发现,被删除的 NewsController 又被重新生成,并且多了好多代码。先不管每个控制器方法里写了啥,我们先检查路由配置。我们会发现,一切都很好,除了首页的路由名字从以前的 news_index 变成了 news,此时我们可以将 news 改回 news_index,也可以考虑将之前的 news_index 定为 news。我们这里选择后者,毕竟已经为我们定义了一套规则,并且也不赖,何必再去折腾别的命名方式?还好代码也不多,目前我们只用把首页模板 default/index.html.twig 里的 news_index 改成 news 就行了。 因为 ![](https://box.kancloud.cn/28c172be5231c9f123672f7cdc1cb94d_1370x538.png) base.html.twig里的news_index改为news. doctrine:genearte:crud 做的事情就比较多了,它不仅生成了控制器,所有的模板文件也都生成了,并且还生成了表单类。我们先不管表单类,先访问新闻首页 /news/ 试试,没有意外的话,你们可以看到一个从新建、显示、编辑、删除都完全可用的新闻功能。 - 先搁笔于此。忙些工作再来继续。