提到模型-视图-控制器这种MVC架构,要追溯到Smalltalk编程语言和Xerox Parc。从那个时候开始,就有许多系统将自己描述为MVC架构。这些系统虽然在某些地方有细微差别,但都实现了数据层,逻辑层和前段表现代码的分离。
大部分的PHP MVC框架都拥有以下基本特征,
相对于“一个PHP文件对应一个页面”来说,这种MVC架构是个巨大的进步。然后对于一些软件工程师来说,它依然是个丑陋的架构。他们经常抱怨说,
比如说,
Magento团队创建了一个更为抽象的MVC模式,大概的运行过程是,
万俟飞整理收集:Magento开发文档(三):Magento控制器
我们会在整个教程中介绍上面的所有部分,本章主要涉及到到前端控制器->路由->动作控制器环节。
又到Hello World了,你懂的。这一节主要任务是
首先,我们先为该模块创建好目录结构:
app/code/local/Magentotutorial/Helloworld/Block
app/code/local/Magentotutorial/Helloworld/controllers
app/code/local/Magentotutorial/Helloworld/etc
app/code/local/Magentotutorial/Helloworld/Helper
app/code/local/Magentotutorial/Helloworld/Model
app/code/local/Magentotutorial/Helloworld/sql
然后为这个模块创建配置文件,配置该配置文件路径位于,
app/code/local/Magentotutorial/Helloworld/etc/config.xml
并放入下列代码,
01
02
03
04
05
06
07
|
<
config
>
<
modules
>
<
Magentotutorial_Helloworld
>
<
version
>0.1.0</
version
>
</
Magentototurial_helloworld
>
</
modules
>
</
config
>
|
和之前一样,需要创建一个文件激活该模块,该文件路径位于,
app/etc/modules/Magentotutorial_Helloworld.xml
放入如下代码,
01
02
03
04
05
06
07
08
|
<
config
>
<
modules
>
<
Magentotutorial_Helloworld
>
<
active
>true</
active
>
<
codePool
>local</
codePool
>
</
Magentototurial_helloworld
>
</
modules
>
</
config
>
|
最后,检查下我们是否成功建立Hello Wolrd模块并激活。
接着,我们开始配置路由规则,路由会将请求的URL地址分发到一个控制器和它的方法上。不像其它约定型的PHP MVC框架,在Magento中,你需要明确的在全局配置文件中配置路由规则,来告诉URL地址如何匹配对应的控制器和方法。
在config.xml文件中,加入下列代码,
01
02
03
04
05
06
07
08
09
10
11
|
<
frontend
>
<
routers
>
<
helloworld
>
<
use
>standard</
use
>
<
args
>
<
module
>Magentototurial_Helloworld</
module
>
<
frontName
>helloworld</
frontName
>
</
args
>
</
helloworld
>
</
routers
>
</
frontend
>
|
这块代码里边牵涉到很多术语,接下来一一解析。
<frontend>是什么?
该标签涉及到Magento的一个术语Area。可以将Areas视为一些独立的Magento应用。“frontend” Area是Magento购物车应用的前端表现。”admin” Area是后端管理员应用。”install” Area是用来安装Magento的应用。
为什么配置一个模块的路由要使用复数<routers>呢?
引用一句Phil Karlton关于计算机科学的著名论断:
There are only two hard things in Computer Science: cache invalidation and naming things
意思是说计算机科学中最棘手的两件事就是缓存验证和命名。和许多大型系统一样,Magento同样受到命名的困扰。在全局配置文件书中,可以看到许多这种甚至是丑陋的命名方式。<routers>便是其中之一。该标签通常会包括关于路由规则的配置信息,有时候又会包含实际的路由对象的配置信息。这种命名方式初看起来有些不爽,但是随着你对于Magento系统的深入学习,你会逐渐改变对它的看法。
<frontName>是什么?
当路由器解析URL时,会将URL分为以下几个部分,
http://www.moqifei.com/frontName/actionControllerName/actionMethod/
通过在<frontName>标签中定义”helloworld”值,Magento就能够响应所有以下列URL访问的地址
http://www.moqifei.com/helloworld/*
很多刚刚接触Magento的开发者都会将frontName与Magento的前端控制器对象搞混淆。实际上它们完全不是一回事。frontName只属于路由。
<helloworld>标签的作用?
该标签必须是当前模块名的小写形式。我们创建的模块是Helloworld,所以该标签应该是<helloworld>。可能你会注意到<frontName>标签中的值也于模块名一致。这个其实是一个不成为的规定,并非是必须一致的。在你的自定义模块中,最好使用模块名与命名空间的组合来命名,以避免命名冲突。
<module>Magentotutorial_Helloworld</module>
该标签的值必须是模块的全名,包含package/namespace名。该配置让系统能够正确定位到控制器文件。
完成配置文件之后,接下来需要做的就是创建控制器文件及类。在以下路径创建该类,
app/code/local/Magentotutorial/Helloworld/controllers/IndexController.php
包含以下内容,
01
02
03
04
05
|
class
Magentotutorial_Helloworld_IndexController
extends
Mage_Core_Controller_Front_Action {
public
function
indexAction() {
echo
'Hello Index'
;
}
}
|
清空缓存,访问下列地址,
http://www.moqifei.com/helloworld/index/index
也可以访问以下地址,
http://www.moqifei.com/helloworld/index/index
http://www.moqifei.com/helloworld/
如果没有出错的话,页面中应该能显示”Hello World”。恭喜你,你已经成功搞定了第一个Magento控制器。
动作控制器文件路径
控制器应该放在模块的controllers文件夹中,系统会自动在这个路径中寻找控制器。
动作控制器命名方式
还记得在config.xml配置文件中的<module>标签吗?
01
|
<
module
>Magentotutorial_Helloworld</
module
>
|
动作控制器的命名应该遵循以下规则,
所有的Magento控制器都是继承自Mage_Core_Controller_Front_Action类。
index/index路径
上文中提到过,Magento的URL地址按照以下规则进行路由解析,
http://www.moqifei.com/frontName/actionControllerName/actionMethod/
那么在下面这个地址中,
http://www.moqifei.com/helloworld/index/index
URI中的”helloworld”是frontName,后面两个index分别是调用的控制器及方法名,即调用helloworld模块中的IndexController控制器中的indexAction方法。
如果URL地址中缺少控制器及方法部分,Magento默认使用index,所以下面地址访问的页面是相同的。
http://www.moqifei.com/helloworld/index
http://www.moqifei.com/helloworld
如果访问的URL地址如下,
http://www.moqifei.com/checkout/cart/add
Magento会做如下操作,
控制器路径
让我们试着添加一个非默认方法到控制器中,添加如下代码到IndexController.php
01
02
03
|
public
function
goodbyeAction() {
echo
'Goodbye World'
;
}
|
然后访问下面的URL地址:
http://www.moqifei.com/helloworld/index/goodbye
IndexController继承自Mage_Core_Controller_Front_Action类,有很多方法可以直接使用。例如,除上述URI中提到的三部分之外,其它部分会自动传给一个键值对数组。添加如下代码到IndexController中。
01
02
03
04
05
06
07
08
|
public
function
paramsAction() {
echo
'<dl>'
;
foreach
(
$this
->getRequest()->getParams()
as
$key
=>
$value
) {
echo
'<dt><strong>Param: </strong>'
.
$key
.
'</dt>'
;
echo
'<dt><strong>Value: </strong>'
.
$value
.
'</dt>'
;
}
echo
'</dl>'
;
}
|
完成之后访问下面的URL地址
http://www.moqifei.com/helloworld/index/params?foo=bar&baz=eof
一切正常的话,页面中会显示该URL地址中的参数。最后,对于下面这个URL地址,系统应该如何响应呢?
http://www.moqifei.com/helloworld/messages/goodbye
该URL中,控制器的名字是messages,所以我们需要创建一个MessagesController控制器,在以下路径创建该文件
app/code/local/Magentotutorial/Helloworld/controllers/MessagesController.php
接着在该控制器中添加goodbyeAction()方法
01
02
03
|
public
function
goodbyeAction() {
echo
'Another Goodbye'
;
}
|
关于Magento控制器的介绍已经完成了。虽然看起来比其他的PHP MVC框架要复杂许多,它的高度可扩展性却允许你创建任何你想要的URL结构。