# 創建應用
我們已經進行了大量的準備工作和前導閱讀,目的當然就是為了我們接下來要進行的應用開發。
創建應用需要如下幾個步驟。
## 規劃項目位置
我們之前看到了關于[Vagrant虛擬機的安裝和如何進入虛擬機](https://taylorr.gitbooks.io/building-a-web-site-with-symfony/content/01.03%20install%20ubuntu.html)。
讓我們先登錄到虛擬機,并轉到`/vagrant`目錄。我們之前講過,這個目錄實際上就是我們Windows宿主機中的某個目錄。
這個目錄將成為我們所有項目的存放位置。在該目錄下,各個項目有各自的項目目錄。我們將這個項目目錄稱為某個項目的根目錄。以后的教程中,如果再次提到這個“根目錄”,那就一定是指這個目錄。
## 獲得Symfony的`installer`
~~~
sudo curl -LsS http://symfony.com/installer -o /usr/local/bin/symfony
sudo chmod a+x /usr/local/bin/symfony
~~~
注意:這么做是在`/usr/local/bin`下創建了一個可執行的`symfony`命令。我比較喜歡將這個命令放置在`/vagrant`目錄下。
## 創建應用
假定我們在`/vagrant`目錄,現在用如下的命令創建我們的應用:
~~~
$ symfony new the_new_project_name
~~~
請根據實際情況將`the_new_project_name`替換為更有意義的名字,在我們這本書中,我們用的項目名稱`symfony`。
> 注意:在我們虛擬機中,由于`/vagrant`這個目錄并不是實實在在的Linux系統中的目錄,而是一個Windows系統下映射過去的目錄,上面的命令有可能會執行出錯(取決于你使用的Vagrant版本)。此時,我們可以在對應的Windows目錄中進行如上操作。這樣生成的應用框架是可以在Linux中使用的。 或者,可以參考SF官方文檔中的[方法](http://symfony.com/doc/master/book/installation.html#creating-symfony-applications-without-the-installer),用Composer來創建項目。
這個命令將在`vagrant`目錄下創建一個`symfony`目錄(也就是我們的項目名字),并在該目錄下進行必要的設置,創建一個全新的Symfony應用框架。
現在我們進入`symfony`目錄,也就是“根目錄”中,按照之前“[Composer](https://taylorr.gitbooks.io/building-a-web-site-with-symfony/content/02.04%20composer.html)”一章中的介紹下載`composer.phar`,并執行一次更新。
## 目錄結構說明
一個空空如也的Symfony 3框架約莫有32M,這也是SF3被稱為重量級框架的原因。它的目錄結構如下:

### `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.somewhere.com`時,Web服務器所訪問的根目錄。請不要和我們之前說的“項目根目錄”混淆。
在這個目錄中,有SF3應用的入口文件:`app.php`(生產模式)和`app_dev.php`(開發模式)。在實際應用中,我們訪問的是`app.php`——當然,因為有重寫規則的存在和該目錄下`.htaccess`文件的配合,我們訪問一個SF應用時,不需要指明`app.php`,而可以直接用類似`http://www.somewhere.com/path/to/resource`這樣的方式。在開發時,我們更多的是使用`app_dev.php`,此時我們訪問的URI形如:`http://www.somewhere.com/app_dev.php/path/to/resource`。
## 遠端調試
如果我們現在在Windows宿主機中訪問`http://symfony/app_dev.php`,那么我們會看到一個錯誤信息:
> You are not allowed to access this file. Check app_dev.php for more information.
這是因為`app_dev.php`是個用在開發模式下的文件,缺省時開發環境是不對遠程主機開放的。
既然我們采用目前的Windows+Vagrant的開發方式,我們顯然必須進行遠程開發,所以需要修改一下`app.php`文件:
原來的文件中找到這一段:
~~~
// This check prevents access to debug front controllers that are deployed by accident to production servers.
// Feel free to remove this, extend it, or make something more sophisticated.
if (isset($_SERVER['HTTP_CLIENT_IP'])
|| isset($_SERVER['HTTP_X_FORWARDED_FOR'])
|| !(in_array(@$_SERVER['REMOTE_ADDR'], array('127.0.0.1', 'fe80::1', '::1')) || php_sapi_name() === 'cli-server')
) {
header('HTTP/1.0 403 Forbidden');
exit('You are not allowed to access this file. Check '.basename(__FILE__).' for more information.');
}
~~~
將整個`if`段全部注釋掉。然后再次訪問,我們會看到如下的歡迎界面:

看到這個界面,那么我們的SF應用創建就大功告成。接下來就是真正的開發過程了。
注意:經過修改的這個`app_dev.php`程序可千萬不要放到生產環境中,這會帶來巨大的安全風險。因此,我一般會將這個文件放入版本控制中的被忽略文件列表中(見下一節[建立版本控制](https://taylorr.gitbooks.io/building-a-web-site-with-symfony/content/05.01%20git))。
不過在進入開發之前,我們先要進行代碼倉庫的管理。
- 引言
- 1 LAMP
- 1.1 安裝虛擬機
- 1.2 安裝Vagrant
- 1.3 安裝Ubuntu
- 1.4 安裝Apache 2
- 1.5 安裝PHP
- 1.6 安裝MySQL服務器
- 1.7 最后的微調
- 1.8 設置一個虛擬主機
- 1.9 一個趁手的IDE
- 2 Symfony 3和重要構件
- 2.1 Symfony 3
- 2.2 Doctrine
- 2.3 Twig
- 2.4 Composer
- 3 Symfony重要概念
- 3.1 MVC
- 3.2 Bundle/包
- 3.3 Route/路由
- 3.4 Controller/控制器
- 3.5 Entity/實體
- 3.6 Repository/倉庫
- 3.7 Template/模板
- 3.8 Test/測試
- 4 藏書管理程序的結構
- 5 創建應用
- 5.1 建立版本管理
- 5.2 建立數據庫
- 5.3 應用結構
- 5.4 建立數據庫實體
- 5.5 樣本數據
- 5.6 路由
- 5.7 模板
- 5.8 開始編寫首頁
- 5.9 書籍詳情頁面
- 5.10 書籍列表頁面
- 5.11 書籍搜索
- 6 用戶和后臺
- 7 結語