Phalcon的MVC框架解析
1. mvc/simple
从最简单的入手吧. 把一些能及时说明白的东西写在注释里了,需要扩展的知识列在下面。
public/index.php
<?php
$loader = new \Phalcon\Loader(); //反斜杠看着不习惯?请参见下面的[ 名字空间 ]
// 注册自动加载的类目录,为方便使用,在php解析程序启动时直接加载,参见[ 类的预加载 ]
$loader->registerDirs(array('../apps/controllers/', '../apps/models/'));
// Loader也要注册自身
$loader->register();
// 依赖注入器,参见[ 依赖注入 ],在深入到概念中之前,可以理解为构造类对象的地方
$di = new \Phalcon\DI();
// 下面是一些必需的对象
// 路由器: 将URI地址解析成Controller\Action\Params的模块
$di->set('router', 'Phalcon\Mvc\Router');
// 分发器: 利用Router解析得到的信息找到函数并执行
$di->set('dispatcher', 'Phalcon\Mvc\Dispatcher');
// 响应模块: 将执行结果封装成http协议,并发送给浏览器
$di->set('response', 'Phalcon\Http\Response');
// 请求模块: 将到来的http请求封装成对象,在dispatcher发给controller时也会把对象带过去便于访问
$di->set('request', 'Phalcon\Http\Request');
// 视图: 注入视图对象,当dispatcher调用时被访问
$di->set('view', function(){
$view = new \Phalcon\Mvc\View();
$view->setViewsDir('../apps/views/');
return $view;
});
// 数据库对象
$di->set('db', function(){
return new \Phalcon\Db\Adapter\Pdo\Mysql(array(
"host" => "localhost",
"username" => "root",
"password" => "",
"dbname" => "invo"
));
});
// 数据表的元数据 : Memory表示该对象用于临时获取表结构,对象析构后表结构数据清除
$di->set('modelsMetadata', 'Phalcon\Mvc\Model\Metadata\Memory');
// 管理着Model的初始化、对应关系的类
$di->set('modelsManager', 'Phalcon\Mvc\Model\Manager');
try {
//太简单了,一个Application类搞定主逻辑 [ 应用类 ]
$application = new \Phalcon\Mvc\Application();
$application->setDI($di);
echo $application->handle()->getContent();
}
catch(Phalcon\Exception $e){
echo $e->getMessage();
}
注解:
名字空间:
php在5.3.0版本以后开始支持的特性,用于解决两类问题 —— 命名冲突和给类重命名. 使用命名空间:别名/导入
类的预加载:
为了在使用一些类时不用写require或include,可以在php启动时就把一些目录下的类加载进来
依赖注入:
依赖注入是控制反转模式的一种实现。完全得解释依赖注入很难做到,因为这个模式被不同语言,不同框架用到,实现也各不相同。针对于Phalcon,可以看得出依赖注入(DI)模块是个容器,将类的生成方法写到DI容器中, 当有用到依赖时去DI中取出即可。具体DI的作用官方文档写得太好了官方文档
应用类:
封装了一些常用注入的类。当有它在时你可能不知道它做了些什么,除非看一下不用它我们需要做什么。见下面的例子simple-without-application
controllers/ProductsController.php
<?php
// 控制器是用来执行业务逻辑的模块,每个方法叫做一个动作
// URL美化后一般是这样路由的:www.demo.com/controllername/actionname/params
class ProductsController extends \Phalcon\Mvc\Controller {
// action执行的结果使用view渲染,传递变量给对应的view,对应规则靠路径
public function indexAction(){
$this->view->setVar('product', Products::findFirst());
}
}
models/Products.php
<?php
// Phalcon的Model类是用来与数据库打交道的,大多数情况下,一个model对应一张表
// source表示表名,setSource设置,getSource获取
// 默认表名是to_lower(ModelClassName)
class Products extends \Phalcon\Mvc\Model {
// 与controller一样,不建议用__construct,而是initialize
public function initialize(){
$this->setSource('products');
}
}
2. mvc/simple-without-application
只看public/index.php就可以了,其他文件雷同
// 路由器执行handle()
$router = $di->getShared('router');
$router->handle();
// 调度器传入路由器解析得到的controller和action以及参数
$dispatcher = $di->getShared('dispatcher');
$dispatcher->setControllerName($router->getControllerName());
$dispatcher->setActionName($router->getActionName());
$dispatcher->setParams($router->getParams());
// 调度:调用对应的controller::action函数
$dispatcher->dispatch();
// 渲染视图
$view = $di->getShared('view');
$view->start();
$view->render($dispatcher->getControllerName(), $dispatcher->getActionName(), $dispatcher->getParams());
$view->finish();
// 封装返回报文并发送给客户端
$response = $di->getShared('response');
$response->setContent($view->getContent());
$response->sendHeaders();
echo $response->getContent();
这些就是Application的工作,还是有Application省事啊!
3. mvc/single与mvc/single-namespaces
这是两个对比case,意在阐明自定义namespace的用法。从例2中我们看到application负责路由调度和渲染,但是不负责DI注入。在single的例子中,自定义了application,把依赖注入的代码封装进去了,使得主逻辑只剩下非常少的代码
class Application extends \Phalcon\Mvc\Application {
protected function _registerAutoloaders() {
$loader = new \Phalcon\Loader();
$loader->registerDirs(array(
'../apps/controllers/',
'../apps/models/'
));
$loader->register();
}
protected function _registerServices() {
$di = new \Phalcon\DI();
$di->set('router',...);
$di->set('dispatcher',...);
$di->set('response',...);
$di->set('request',...);
$di->set('view',...);
$di->set('db',...);
$di->set('modelsMetadata',..);
$di->set('modelsManager',...);
$this->setDI($di);
}
public function main() {
$this->_registerServices();
$this->_registerAutoloaders();
echo $this->handle()->getContent();
}
}
// 主逻辑
try {
$application = new Application();
$application->main();
}
catch(Phalcon\Exception $e){
echo $e->getMessage();
}
上述代码注册controller和model的class,用的方式是registerDirs。
single-namespaces也同样自动加载自定义的controller和model,用的方式是registerNamespaces。
$loader->registerNamespaces(array(
'Single\Controllers' => '../apps/controllers/',
'Single\Models' => '../apps/models/'
));
上述代码注册controller和model的class,用的方式是registerDirs。
single-namespaces也同样自动加载自定义的controller和model,用的方式是registerNamespaces。
$loader->registerNamespaces(array(
'Single\Controllers' => '../apps/controllers/',
'Single\Models' => '../apps/models/'
));
因为引入了命名空间,使用时也需要显示声明
namespace Single\Controllers;
use Single\Models\Products as Products;
namespace Single\Models;
class Products extends \Phalcon\Mvc\Model {
...
}
4. mvc/single-factory-default
引入了配置项。这里用到了Include()的返回值,还用到了PHP 5.3以后才支持的闭包语法: function () use($config) {...}
参见 :闭包语法详解
Phalcon的MVC框架解析的更多相关文章
- asp.net MVC 框架中控制器里使用Newtonsoft.Json对前端传过来的字符串进行解析
下面我用一个实例来和大家分享一下我的经验,asp.net MVC 框架中控制器里使用Newtonsoft.Json对前端传过来的字符串进行解析. using Newtonsoft.Json; usin ...
- 在ASP.NET MVC 框架中调用 html文件及解析get请求中的参数值
在ASP.NET MVC 框架中调用 html文件: public ActionResult Index() { using (StreamReader sr = new StreamReader(P ...
- Spring 4 官方文档学习(十一)Web MVC 框架之resolving views 解析视图
接前面的Spring 4 官方文档学习(十一)Web MVC 框架,那篇太长,故另起一篇. 针对web应用的所有的MVC框架,都会提供一种呈现views的方式.Spring提供了view resolv ...
- MVC系列——MVC源码学习:打造自己的MVC框架(四:了解神奇的视图引擎)
前言:通过之前的三篇介绍,我们基本上完成了从请求发出到路由匹配.再到控制器的激活,再到Action的执行这些个过程.今天还是趁热打铁,将我们的View也来完善下,也让整个系列相对完整,博主不希望烂尾. ...
- MVC系列——MVC源码学习:打造自己的MVC框架(三:自定义路由规则)
前言:上篇介绍了下自己的MVC框架前两个版本,经过两天的整理,版本三基本已经完成,今天还是发出来供大家参考和学习.虽然微软的Routing功能已经非常强大,完全没有必要再“重复造轮子”了,但博主还是觉 ...
- MVC系列——MVC源码学习:打造自己的MVC框架(二:附源码)
前言:上篇介绍了下 MVC5 的核心原理,整篇文章比较偏理论,所以相对比较枯燥.今天就来根据上篇的理论一步一步进行实践,通过自己写的一个简易MVC框架逐步理解,相信通过这一篇的实践,你会对MVC有一个 ...
- MVC系列——MVC源码学习:打造自己的MVC框架(一:核心原理)
前言:最近一段时间在学习MVC源码,说实话,研读源码真是一个痛苦的过程,好多晦涩的语法搞得人晕晕乎乎.这两天算是理解了一小部分,这里先记录下来,也给需要的园友一个参考,奈何博主技术有限,如有理解不妥之 ...
- Spring MVC篇一、搭建Spring MVC框架
本项目旨在搭建一个简单的Spring MVC框架,了解Spring MVC的基础配置等内容. 一.项目结构 本项目使用idea intellij创建,配合maven管理.整体的目录结构如图: 其中ja ...
- Spring MVC 框架的架包分析,功能作用,优点
由于刚搭建完一个MVC框架,决定分享一下我搭建过程中学习到的一些东西.我觉得不管你是个初级程序员还是高级程序员抑或是软件架构师,在学习和了解一个框架的时候,首先都应该知道的是这个框架的原理和与其有关j ...
随机推荐
- 你的Android不好用,都是因为这几点原因
Android早已是全球最大.用户最多的移动操作系统,不过它离全球最好用还差得很远. 大家随手就能举出些曾经历过的糟心体验,如手机卡顿!电量不禁用!广告弹窗老是出现!不过很少有人会追根寻底的去问为何如 ...
- 转 web前端性能分析--分析篇
通过具体实施后就可以获得第一手的web前端性能的数据了,然后每次新版本都跑,这就会获得大量的数据,为性能分析提供了基础的输入,同时应该还要综合使用多种工具去从不同的方向收集数据:比如showslow同 ...
- 经纬度 lbs 笔记
string Lat = objRequest.HeadLat.ToString(); 纬度 string Lng = objRequest.HeadLng.T ...
- C 标准库IO缓冲区和内核缓冲区的区别
1.C标准库的I/O缓冲区 UNIX的传统 是Everything is a file,键盘.显示器.串口.磁盘等设备在/dev 目录下都有一个特殊的设备文件与之对应,这些设备文件也 ...
- mysql-5.7 Using Asynchronous I/O on Linux详解
一.mysql - innodb 使用异步IO的场景 总的来说innodb 只会对数据文件采用异步IO,为了保存日志是真正被写入到磁盘,innodb不会对日志文件启用异步IO 更新细一步的说,inno ...
- 甲骨文关闭OpenSSO后,OpenAM成为其继续者
消息来源:http://os.51cto.com/art/201003/190108.htm OpenAM主页连接: ht ...
- 安装composer slim(php web api micro services)
1. 安装php7 2. 下载 https://getcomposer.org/composer.phar 3. 开启ssh, 在 php.ini中.extension=C:\Program File ...
- ios 开源免费接口
ios 开源免费接口 国家气象局提供的天气预报接口 接口地址: http://www.weather.com.cn/data/sk/101010100.html http://www.weather. ...
- perl内置特殊变量查询
perl中有许多预定于的内置变量,想$_,$,,$>,等等,基本是记不住全部的用法,如果在因特网查阅,有很麻烦,信息不准啦,说的不细啦,但是,万能的perldoc早就帮我们准备好了. 你需要做的 ...
- FPGA三分频,五分频,奇数分频
我们在做FPGA设计时,有时会用到时钟频率奇数分频的频率,例如笔者FPGA的晶振为50M,当我们需要10M的时钟时,一种方式可以使用DCM或PLL获取,系统会内部分频到10M,但其实VERILOG内部 ...