Model-View-Controller (MVC) ,模型-视图-控制器,源于Smalltalk编程语言和Xerox Parc。现在有很多系统是基于MVC架构的,不同的系统MVC的实现也略有不同,但都体现了MVC的精髓,分离数据,业务逻辑和显示逻辑。最常见的PHP MVC框架是这样的 app/code/local/App/Helloworld/Block app/code/local/App/Helloworld/controllers app/code/local/App/Helloworld/etc app/code/local/App/Helloworld/Helper app/code/local/App/Helloworld/Model app/code/local/App/Helloworld/sql 下面是config.xml的内容 PATH: app/code/local/App/Helloworld/etc/config.xml <?xml version="1.0" encoding="UTF-8"?> <config> <modules> <App_Helloworld> <version>0.2.0</version> </App_Helloworld> </modules> </config> 然后我们要创建一个系统配置文件来激活这个模块 PATH: app/etc/modules/App_Helloworld.xml <config> <modules> <App_Helloworld> <active>true</active> <codePool>local</codePool> </App_Helloworld> </modules> </config>
最后,让我们检查一下模块是不是已经被激活 <?xml version="1.0" encoding="UTF-8"?> <config> <modules> <App_Helloworld> <version>0.1.0</version> </App_Helloworld> </modules> <frontend> <routers> <helloworld> <use>standard</use> <args> <module>App_Helloworld</module> <frontName>helloworld</frontName> </args> </helloworld> </routers> </frontend> </config>
在这里,我们有很多新名词要解释。 <frontend> ... <install> <use>standard</use> <args> <module>Mage_Install</module> <frontname>install</frontname> </args> </install> ... </frontend>
】 http://example.com/frontName/actionControllerName/actionMethod/ 所以,当我们在frontname标签里定义了“helloworld”以后,Magento会把如下的URL请求交给我们的模块“App_Helloworld”来处理 http://example.com/helloworld/*
有些人容易把frontname和前端控制器(Front Controller)混淆起来。它们是两个不同的概念,frontname只跟路由相关,学过Zf的人都知道,其实就是个模块名。【注: 根据我们前面讲过的Magento的MVC流程,前端控制器是用来实例化所有路由的,而这里的“frontName”只是路由过程中的一个参数】 app/code/local/App/Helloworld/controllers/IndexController.php 模块的控制器应该放在模块的子目录“controllers”(小写c)里面。这是规定,Magento会在这个目录寻找模块的控制器文件。我们的第一个控制器包含以下内容 class App_Helloworld_IndexController extends Mage_Core_Controller_Front_Action { public function indexAction() { echo 'Hello World!'; } } 清空Magento缓存,请求如下URL http://exmaple.com/helloworld/index/index
如果你看到一个空白页面上面写着“Hello World”,那么恭喜你,你已经成功创建了你的第一个Magento控制器! <module>App_Helloworld</module>
执行控制的名字的构成如下 http://example.com/frontName/actionControllerName/actionMethod/ 所以在我们请求的URL http://exmaple.com/helloworld/index/index 其中“helloworld”是“frontName”,第一个“index”是执行控制器(Action Controller)的名字,第二个“index”是执行方法的名字。对比我们写的执行控制器代码,我们不难发现执行方法的定义是执行方法名字加上“Action”关键字 public function indexAction(){...} Magento根据命名规则找到执行控制器文件并实例化,然后再根据命名规则调用指定的执行方法。如果URL没有给出执行控制器名字或者执行方法,Magento会用默认的“index”来替代,所以下面三个URL是等价的 http://exmaple.com/helloworld/index/index http://exmaple.com/helloworld/index/ http://exmaple.com/helloworld/ 我们再来看一个例子。如果URL如下 http://exmaple.com/checkout/cart/add
Magento的执行步骤如下
public function goodbyeAction() { echo 'Goodbye World!'; } 请求URL
http://example.com/helloworld/index/goodbye 这次你应该看到“Goodbye World!”。因为我们继承了“Mage_Core_Controller_Front_Action”,我们可以使用一些父类已经定义好的方法和变量。比如父类会把URL后面跟的参数转换成key/value的数组。添加如下代码到我们的执行控制器
public function paramsAction() { echo '<dl>'; foreach($this->getRequest()->getParams() as $key=>$value) { echo '<dt><strong>Param: </strong>'.$key.'</dt>'; echo '</dl><dl><strong>Value: </strong>'.$value.'</dl>'; } echo ''; } 请求如下URL
http://example.com/helloworld/index/params?foo=bar&baz=eof 你应该看到如下输出
Param: foo Value: bar Param: baz Value: eof 最后,让我们再写一个执行控制器,用来处理以下URL
http://example.com/helloworld/messages/goodbye 这里的执行控制器名字是“messages”,所以我们要创建如下文件
app/code/local/App/Helloworld/controllers/MessagesController.php 执行控制器的类名应该是
App_Helloworld_MessagesController 添加执行方法
public function goodbyeAction() { echo 'Another Goodbye'; } 好了,Magento的MVC架构大概就是这样了。它比传统的PHP MVC要复杂一点,但是Magento的这个高度灵活的MVC架构能让你创造出几乎所有你能想到的URL结构。
Write the code ,change the world!
(责任编辑:好模板) |