說明:本篇學習筆記是學習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 `

此時會有歡迎提示出現,并且讓你輸入一個模型的“短名字”,為什么說是要輸入短名字?News 并不是全名,全名應該是包含命名空間的,比如我們的 News 全名應該是 AppBundle\Entity\News,Entity 是什么?Entity 只是一個習慣性叫法。在 Doctrine2 的世界里,只要是 ORM 過的模型,都叫 Entity(除此之外還有用 MongoDB 作為存儲方案的 ODM,ODM 過的模型習慣稱之為 Document)。
后面我們就按照他們的提示,分別輸入

刷新 src/AppBundle 目錄,
多了兩個 目錄,Entity,Repository,
包含了兩個文件:News.php 和 NewsRepository.php。

打開 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!

數據庫創建好之后,我們應該創建“新建新聞”頁和“新聞詳情”頁、以及更新我們之前寫的“新聞首頁”。不過且慢,DoctrineBundle 不僅僅能生成 Entity,它還能根據 Entity 直接生成相關的 Controller!這里我們先把之前的 NewsController 類文件刪掉。然后使用下面命令:
`$php bin/console doctrine:generate:crud`



我們會發現,被刪除的 NewsController 又被重新生成,并且多了好多代碼。先不管每個控制器方法里寫了啥,我們先檢查路由配置。我們會發現,一切都很好,除了首頁的路由名字從以前的 news_index 變成了 news,此時我們可以將 news 改回 news_index,也可以考慮將之前的 news_index 定為 news。我們這里選擇后者,畢竟已經為我們定義了一套規則,并且也不賴,何必再去折騰別的命名方式?還好代碼也不多,目前我們只用把首頁模板 default/index.html.twig 里的 news_index 改成 news 就行了。
因為

base.html.twig里的news_index改為news.
doctrine:genearte:crud 做的事情就比較多了,它不僅生成了控制器,所有的模板文件也都生成了,并且還生成了表單類。我們先不管表單類,先訪問新聞首頁 /news/ 試試,沒有意外的話,你們可以看到一個從新建、顯示、編輯、刪除都完全可用的新聞功能。
- 先擱筆于此。忙些工作再來繼續。