# MVC 應用(MVC Applications)
在Phalcon,策劃MVC操作背后的全部困難工作通常都可以 通過[Phalcon\\Mvc\\Application](http://docs.iphalcon.cn/api/Phalcon_Mvc_Application.html)做到。這個組件封裝了全部后端所需要的復雜 操作,實例化每一個需要用到的組件并與項目整合在一起,從而使得MVC模式可以如期地運行。
## 單模塊或多模塊應用(Single or Multi Module Applications)
通過這個組件,你可以運行各式各樣的MVC結構:
### 單模塊(Single Module)
單一的MVC應用僅僅包含了一個模塊。可以使用命名空間,但不是必需的。 這樣類型的應用可能會有以下文件目錄結構:
~~~
single/
app/
controllers/
models/
views/
public/
css/
img/
js/
~~~
如果未使用命名空間,以下的啟動文件可用于編排MVC工作流:
~~~
<?php
use Phalcon\Loader;
use Phalcon\Mvc\View;
use Phalcon\Mvc\Application;
use Phalcon\Di\FactoryDefault;
$loader = new Loader();
$loader->registerDirs(
[
"../apps/controllers/",
"../apps/models/",
]
);
$loader->register();
$di = new FactoryDefault();
// 注冊視圖組件
$di->set(
"view",
function () {
$view = new View();
$view->setViewsDir("../apps/views/");
return $view;
}
);
$application = new Application($di);
try {
$response = $application->handle();
$response->send();
} catch (\Exception $e) {
echo $e->getMessage();
}
~~~
如果使用了命名空間,則可以使用以下啟動文件(譯者注:主要區別在于使用$loader的方式):
~~~
<?php
use Phalcon\Loader;
use Phalcon\Mvc\View;
use Phalcon\Mvc\Dispatcher;
use Phalcon\Mvc\Application;
use Phalcon\Di\FactoryDefault;
$loader = new Loader();
// 根據命名空間前綴加載
$loader->registerNamespaces(
[
"Single\\Controllers" => "../apps/controllers/",
"Single\\Models" => "../apps/models/",
]
);
$loader->register();
$di = new FactoryDefault();
// 注冊調度器,并設置控制器的默認命名空間
$di->set(
"dispatcher",
function () {
$dispatcher = new Dispatcher();
$dispatcher->setDefaultNamespace("Single\\Controllers");
return $dispatcher;
}
);
// 注冊視圖組件
$di->set(
"view",
function () {
$view = new View();
$view->setViewsDir("../apps/views/");
return $view;
}
);
$application = new Application($di);
try {
$response = $application->handle();
$response->send();
} catch (\Exception $e) {
echo $e->getMessage();
}
~~~
### 多模塊(Multi Module)
多模塊的應用使用了相同的文檔根目錄但擁有多個模塊。在這種情況下,可以使用以下的文件目錄結構:
~~~
multiple/
apps/
frontend/
controllers/
models/
views/
Module.php
backend/
controllers/
models/
views/
Module.php
public/
css/
img/
js/
~~~
在apps/下的每一個目錄都有自己的MVC結構。Module.php文件代表了各個模塊不同的配置,如自動加載器和自定義服務:
~~~
<?php
namespace Multiple\Backend;
use Phalcon\Loader;
use Phalcon\Mvc\View;
use Phalcon\DiInterface;
use Phalcon\Mvc\Dispatcher;
use Phalcon\Mvc\ModuleDefinitionInterface;
class Module implements ModuleDefinitionInterface
{
/**
* 注冊自定義加載器
*/
public function registerAutoloaders(DiInterface $di = null)
{
$loader = new Loader();
$loader->registerNamespaces(
[
"Multiple\\Backend\\Controllers" => "../apps/backend/controllers/",
"Multiple\\Backend\\Models" => "../apps/backend/models/",
]
);
$loader->register();
}
/**
* 注冊自定義服務
*/
public function registerServices(DiInterface $di)
{
// Registering a dispatcher
$di->set(
"dispatcher",
function () {
$dispatcher = new Dispatcher();
$dispatcher->setDefaultNamespace("Multiple\\Backend\\Controllers");
return $dispatcher;
}
);
// Registering the view component
$di->set(
"view",
function () {
$view = new View();
$view->setViewsDir("../apps/backend/views/");
return $view;
}
);
}
}
~~~
還需要一個指定的啟動文件來加載多模塊的MVC架構:
~~~
<?php
use Phalcon\Mvc\Router;
use Phalcon\Mvc\Application;
use Phalcon\Di\FactoryDefault;
$di = new FactoryDefault();
// 自定義路由
// More information how to set the router up https://docs.phalconphp.com/zh/latest/reference/routing.html
$di->set(
"router",
function () {
$router = new Router();
$router->setDefaultModule("frontend");
$router->add(
"/login",
[
"module" => "backend",
"controller" => "login",
"action" => "index",
]
);
$router->add(
"/admin/products/:action",
[
"module" => "backend",
"controller" => "products",
"action" => 1,
]
);
$router->add(
"/products/:action",
[
"controller" => "products",
"action" => 1,
]
);
return $router;
}
);
// 創建應用
$application = new Application($di);
// 注冊模塊
$application->registerModules(
[
"frontend" => [
"className" => "Multiple\\Frontend\\Module",
"path" => "../apps/frontend/Module.php",
],
"backend" => [
"className" => "Multiple\\Backend\\Module",
"path" => "../apps/backend/Module.php",
]
]
);
// 處理請求
$response = $application->handle();
$response->send();
} catch (\Exception $e) {
echo $e->getMessage();
}
~~~
如果你想在啟動文件保持模塊的配置,你可以使用匿名函數來注冊對應的模塊:
~~~
<?php
use Phalcon\Mvc\View;
// 創建視圖組件
$view = new View();
// 設置視圖組件相關選項
// ...
// Register the installed modules
$application->registerModules(
[
"frontend" => function ($di) use ($view) {
$di->setShared(
"view",
function () use ($view) {
$view->setViewsDir("../apps/frontend/views/");
return $view;
}
);
},
"backend" => function ($di) use ($view) {
$di->setShared(
"view",
function () use ($view) {
$view->setViewsDir("../apps/backend/views/");
return $view;
}
);
}
]
);
~~~
當[Phalcon\\Mvc\\Application](http://docs.iphalcon.cn/api/Phalcon_Mvc_Application.html)有多個模塊注冊時,通常 每個都是需要的,以便每一個被匹配到的路由都能返回一個有效的模塊。每個已經注冊的模塊都有一個相關的類來提供建立和啟動自身的函數。 而每個模塊定義的類都必須實現registerAutoloaders()和registerServices()這兩個方法,這兩個函數會在模塊即被執行時被[Phalcon\\Mvc\\Application](http://docs.iphalcon.cn/api/Phalcon_Mvc_Application.html)調用。
## 應用事件(Application Events)
[Phalcon\\Mvc\\Application](http://docs.iphalcon.cn/api/Phalcon_Mvc_Application.html)可以把事件發送到[EventsManager](http://docs.iphalcon.cn/reference/events.html)(如果它激活的話)。 事件將被當作”application”類型被消費掉。目前已支持的事件如下:
| 事件名稱 | 消費于 |
| --- | --- |
| boot | 當應用處理它首個請求時被執行 |
| beforeStartModule | 在初始化模塊之前,僅當模塊被注冊時 |
| afterStartModule | 在初始化模塊之后,僅當模塊被注冊時 |
| beforeHandleRequest | 在執行分發環前 |
| afterHandleRequest | 在執行分發環后 |
以下示例演示了如何將偵聽器綁定到組件:
~~~
<?php
use Phalcon\Events\Event;
use Phalcon\Events\Manager as EventsManager;
$eventsManager = new EventsManager();
$application->setEventsManager($eventsManager);
$eventsManager->attach(
"application",
function (Event $event, $application) {
// ...
}
);
~~~
## 外部資源(External Resources)
* [Github上的MVC示例](https://github.com/phalcon/mvc)
- 簡介
- 安裝
- 安裝(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