MicroMVC - 一个简单的 PHP 框架





5.00/5 (4投票s)
又一个 PHP MVC 框架。
引言
这篇文章最初已经编写完成。不幸的是,出现了一个错误导致文章被删除。这是一篇很长的文章,需要一些时间才能重新编写,所以请原谅我让这篇文章保持简短。
MVC 模式是开发 Web 应用程序的常用模式。 PHP 有大量的开源 MVC 框架,有助于简化开发。在处理较小的项目时,我倾向于不使用任何 MVC 框架,仅仅是为了保持较小的代码库。我经常发现自己开发一个小型 MVC 框架来加快请求的调度。本文介绍了一个轻量级的 MVC 框架,可以用作引导程序。附加的项目包括以下目录结构
- Application
- 系统
- index.php
- .htaccess
Application 目录包含控制器和视图文件。 System 文件夹包含框架类。 index.php 是主要入口点,并充当引导程序。
使用框架
请求的执行从 index.php 文件开始,该文件创建一个新的 System\Application 实例。
require 'System/Application.php';
try{
$app = new \System\Application(dirname(__FILE__));
$app->addRoute('custom route', new \System\Routing\DynamicRoute
('/^article/', 'Article', 'view'));
$app->run();
}catch(Exception $e){
System\Debug::report($e);
}
必须使用一个指定应用程序根路径的参数来实例化 System\Application
类。它尝试使用命名空间自动加载其他类。然后,System\Application
类实例化一个 System\Routing\UriRoute
,这是默认的路由机制。UriRoute
获取请求 URI 并将其分解为段。从这些段中,它确定控制器/操作名称。还有另外两种路由类型,System\Routing\StaticRoute
和 System\Rotuing\DynamicRoute
。 StaticRoute
将 URI 重新映射到控制器/操作名称。当您想将诸如 domain.com/aboutus.html 之类的 URL 重新映射到 controller/action
时,这非常有用。
$app = new \System\Application(dirname(__FILE__));
$app->addRoute('static route',
new \System\Routing\StaticRoute('aboutus.html', 'Home', 'aboutus'));
$app->run();
Application
类公开了一个 addRoute()
方法,用于添加自定义路由。此方法接受两个参数。第一个是路由名称,用于简单地引用该路由。第二个是路由实例。请注意,在上面的示例代码中,已经添加了一个 StaticRoute
。此路由被放入一个集合中,并在执行 Application->run()
方法时对其进行迭代。如前所述,也存在 DynamicRoute
。 DynamicRoutes
更加灵活,允许您使用正则表达式进行映射。下面的示例展示了如何映射任何以文本“article
”开头的 URI。
$app = new \System\Application(dirname(__FILE__));
$app->addRoute('custom route', new \System\Routing\DynamicRoute
('/^article/', 'Article', 'view'));
....
如前所述,路由被放入一个集合中。要添加的最后一个路由是第一个要执行的路由。注意; 默认的 UriRoute
也在集合中,并且由于它是 Application
类添加的第一个路由,因此它是要执行的最后一个路由。这确保了如果您的自定义路由不匹配,则将使用 UriRoute
。所有路由类都继承自 System\Routing\Route
。您可以通过从此类继承并实现 abstract
方法 execute()
来创建自己的路由。 execute()
方法应返回一个布尔值,指示路由是否有效。
应用程序生命周期在执行 run()
方法时开始。 run()
方法将迭代路由集合中的路由。如果已匹配路由,则确定控制器/操作名称并调度控制器。控制器必须继承自 System\Controller
。实例化控制器时,会调用多个方法。第一个是 init()
方法,它初始化控制器。此方法的作用类似于类构造函数。下一个方法是 load()
方法。此方法旨在被覆盖。它提供了一种执行所有操作的公共代码的方法。下一个方法是 action 方法。 Action 方法必须返回 action 结果。 action 结果可以是标量、数组或对象。如果返回一个数组,框架会将该数组编码为 JSON 并将其发送到浏览器。内容类型也将更改为“application/json
”。如果返回一个对象,则该对象必须实现一个返回 string
的 public render()
方法。另一个 action 结果是 View
。视图不会显式返回。如果要返回视图,则必须在 Views 目录中创建视图,然后使用控制器的 view()
方法返回该视图,如下面的示例代码所示
public function index(){
// Returns a php template
return $this->view();
}
默认情况下,在没有参数的情况下调用 view()
方法将返回一个带有 action 名称的视图。如果要返回不同的视图,可以将它指定为 view()
方法的参数,如下所示
public function index(){
// Returns a php template
return $this->view('another_view');
}
请注意,不包括文件扩展名。
从控制器到视图的数据通过 ViewBag
传递。 System\Controller
类公开了一个 protected
属性 "viewBag
"。此 viewBag
只是一个数组的包装器。您可以使用下面的代码将数据设置到 viewBag
中
$this->viewBag->message = "Hello World".
我将更新这篇文章,提供更多详细信息。现在,附加的示例应用程序包含一个默认控制器,它将使您了解框架的工作方式。
历史
- 2014 年 6 月 18 日:初始版本