# 教程 2:INVO簡介(Tutorial 2: Introducing INVO)
在第二部分,我們將會說明一個完整的應用用來加深Phalcon的開發。 INVO是我們創建的一個程序樣本。INVO是一個簡單的用來允許用戶生成發票的網站,并且可以做其他的任務,比如管理他們的客戶或者產品。你可以從[Github](https://github.com/phalcon/invo)中復制它的代碼。
同樣,INVO使用[Bootstrap](http://getbootstrap.com/)做的前端框架。雖然這個應用不能生成發票,但是它仍然可以作為一個例子來理解框架是如何工作的。
## 項目結構(Project Structure)
一旦你從你的文檔根目錄復制了這個項目,你將會看到以下結構:
~~~
invo/
app/
config/
controllers/
forms/
library/
logs/
models/
plugins/
views/
cache/
volt/
docs/
public/
css/
fonts/
js/
schemas/
~~~
正如你所知道的,Phalcon不會強求應用程序使用特定的文件結構。 這個項目提供了一個簡單的MVC模型和公共文檔根目錄。
一旦你打開瀏覽器輸入[http://localhost/invo](http://localhost/invo)瀏覽應用程序你將會看到下面這樣:

這個應用分為兩部分,一部分是前端,這個是一個公開的部分,瀏覽者可以接收關于INVO的信息,也可以請求聯系人信息。第二部分是后端,一個管理員區域,一個注冊用戶可以管理他/她的產品和客戶。
## 路由(Routing)
INVO使用內置的標準路由.[Router](http://docs.iphalcon.cn/reference/routing.html)組件. 路由符合以下格式:/:controller/:action/:params. 這就意味著第一部分URI是控制器,第二部分是方法,剩余的是參數。
下面的路由/session/register執行的是 SessionController 控制器和它的 registerAction方法。
## 配置(Configuration)
INVO有一個設置應用常規參數的配置文件。這個文件位于 app/config/config.ini,并且他在應用引導文件的最開始就開始加載 (public/index.php):
~~~
<?php
use Phalcon\Config\Adapter\Ini as ConfigIni;
// ...
// 讀取配置
$config = new ConfigIni(
APP_PATH . "app/config/config.ini"
);
~~~
[Phalcon\\Config](http://docs.iphalcon.cn/reference/config.html)允許我們使用面向對象的方式來操作文件。在這個例子中,我們使用ini文件作為配置文件,然而,它對于配置文件有更多的適配支持。這個配置文件包含以下配置:
~~~
[database]
host = localhost
username = root
password = secret
name = invo
[application]
controllersDir = app/controllers/
modelsDir = app/models/
viewsDir = app/views/
pluginsDir = app/plugins/
formsDir = app/forms/
libraryDir = app/library/
baseUri = /invo/
~~~
Phalcon沒有任何提前預約好的慣例配置。節幫助我們組織相應選項. 在這個文件里面有兩個部分被用于后面的”application” 和 “database”.
## 自動加載(Autoloaders)
在啟動文件(public/index.php)的第二部分是自動加載器:
~~~
<?php
/**
* 自動加載配置
*/
require APP_PATH . "app/config/loader.php";
~~~
The autoloader registers a set of directories in which the application will look for the classes that it eventually will need.
~~~
<?php
$loader = new Phalcon\Loader();
// We're a registering a set of directories taken from the configuration file
$loader->registerDirs(
[
APP_PATH . $config->application->controllersDir,
APP_PATH . $config->application->pluginsDir,
APP_PATH . $config->application->libraryDir,
APP_PATH . $config->application->modelsDir,
APP_PATH . $config->application->formsDir,
]
);
$loader->register();
~~~
注意, 以上代碼注冊的目錄是在配置文件中定義的. 唯一沒有注冊的目錄是viewsDir, 因為它包含 HTML + PHP 文件但不是類. 同時, 也要注意我們使用了常量 APP\_PATH, 這個常量在引導文件(public/index.php)中被定義, 允許我們對我們項目的根路徑有一個參考:
~~~
<?php
// ...
define(
"APP_PATH",
realpath("..") . "/"
);
~~~
## 注冊服務(Registering services)
在引導文件中加載的另外一個文件是 (app/config/services.php). 這個文件允許我們組織 INVO 不需要的文件.
~~~
<?php
/**
* 加載應用服務
*/
require APP_PATH . "app/config/services.php";
~~~
服務注冊已經在前面的教程中實現了, 利用一個閉包來實現惰性加載組件:
~~~
<?php
use Phalcon\Mvc\Url as UrlProvider;
// ...
/**
* URL組件被用來生成應用中的各種URL
*/
$di->set(
"url",
function () use ($config) {
$url = new UrlProvider();
$url->setBaseUri(
$config->application->baseUri
);
return $url;
}
);
~~~
稍后我們將會深入討論這個文件.
## 處理請求(Handling the Request)
如果我們忽略文件(public/index.php)的結束, 請求最終會被[Phalcon\\Mvc\\Application](http://docs.iphalcon.cn/api/Phalcon_Mvc_Application.html)處理, 初始化并運行所有必須的代碼來讓程序執行:
~~~
<?php
use Phalcon\Mvc\Application;
// ...
$application = new Application($di);
$response = $application->handle();
$response->send();
~~~
## 依賴注入(Dependency Injection)
看上面代碼的第一行, Application 類的構造方法接受一個`$di`變量作為一個參數. 這個變量的用意是什么呢? Phalcon 是一個高度解耦的框架, 所以我們一個組件來充當膠水來讓每個組件都能正常工作. 這個組件就是[Phalcon\\Di](http://docs.iphalcon.cn/api/Phalcon_Di.html). 這是一個服務容器, 可以執行依賴注入和服務定位, 實例化應用所需要的所有組件.
在容器中有多種注冊服務的方法. 在INVO里, 大部分服務使用匿名函數或者閉包來進行注冊的. 多虧了這個, 對象以惰性的方式被實例化, 減少了應用程序所需要的資源.
例如, 下面摘錄了 Session 服務的注冊. 當應用程序需要訪問Session數據的時候, 匿名函數才會被調用:
~~~
<?php
use Phalcon\Session\Adapter\Files as Session;
// ...
// 在一個組件請求Session服務的時候, 啟動Sesssion
$di->set(
"session",
function () {
$session = new Session();
$session->start();
return $session;
}
);
~~~
這里, 我們可以自動的更改適配器, 執行額外的初始化或者更多. 注意, 這個服務器是使用 “session” 名字進行注冊的. 這是一個慣例, 來允許框架在服務容器中識別正在活動的服務.
一個請求可以使用多個服務和單獨注冊每個服務可以說是一個繁重的任務. 因此, 框架提供了[Phalcon\\Di](http://docs.iphalcon.cn/api/Phalcon_Di.html)的一個變種, 稱作[Phalcon\\Di\\FactoryDefault](http://docs.iphalcon.cn/api/Phalcon_Di_FactoryDefault.html)其任務是注冊所有的服務來提供一個全棧框架.
~~~
<?php
use Phalcon\Di\FactoryDefault;
// ...
// FactoryDefault 依賴注入自動注冊了正確的服務來提供了一個全棧框架
$di = new FactoryDefault();
~~~
它通過框架注冊大部分組件服務作為標準提供. 如果我們需要重寫某些已經定義的服務, 我們僅僅需要重新定義它, 就像上面的 “session” 和 “url”一樣. 這就是變量`$di`存在的原因.
在下一章, 我們將會看到如何在INVO中實施認證和授權.
- 簡介
- 安裝
- 安裝(installlation)
- XAMPP下的安裝
- WAMP下安裝
- Nginx安裝說明
- Apache安裝說明
- Cherokee 安裝說明
- 使用 PHP 內置 web 服務器
- Phalcon 開發工具
- Linux 系統下使用 Phalcon 開發工具
- Mac OS X 系統下使用 Phalcon 開發工具
- Windows 系統下使用 Phalcon 開發工具
- 教程
- 教程 1:讓我們通過例子來學習
- 教程 2:INVO簡介
- 教程 3: 保護INVO
- 教程4: 使用CRUD
- 教程5: 定制INVO
- 教程 6: V?kuró
- 教程 7:創建簡單的 REST API
- 組件
- 依賴注入與服務定位器
- MVC架構
- 使用控制器
- 使用模型
- 模型關系
- 事件與事件管理器
- Behaviors
- 模型元數據
- 事務管理
- 驗證數據完整性
- Workingwith Models
- Phalcon查詢語言
- 緩存對象關系映射
- 對象文檔映射 ODM
- 使用視圖
- 視圖助手
- 資源文件管理
- Volt 模版引擎
- MVC 應用
- 路由
- 調度控制器
- Micro Applications
- 使用命名空間
- 事件管理器
- Request Environmen
- 返回響應
- Cookie 管理
- 生成 URL 和 路徑
- 閃存消息
- 使用 Session 存儲數據
- 過濾與清理
- 上下文編碼
- 驗證Validation
- 表單_Forms
- 讀取配置
- 分頁 Pagination
- 使用緩存提高性能
- 安全
- 加密與解密 Encryption/Decryption
- 訪問控制列表
- 多語言支持
- 類加載器 Class Autoloader
- 日志記錄_Logging
- 注釋解析器 Annotations Parser
- 命令行應用 Command Line Applications
- Images
- 隊列 Queueing
- 數據庫抽象層
- 國際化
- 數據庫遷移
- 調試應用程序
- 單元測試
- 進階技巧與延伸閱讀
- 提高性能:下一步該做什么?
- Dependency Injection Explained
- Understanding How Phalcon Applications Work
- Api
- Abstract class Phalcon\Acl