65.9K
CodeProject 正在变化。 阅读更多。
Home

MicroMVC - 一个简单的 PHP 框架

starIconstarIconstarIconstarIconstarIcon

5.00/5 (4投票s)

2014年6月18日

CPOL

4分钟阅读

viewsIcon

25568

downloadIcon

514

又一个 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\StaticRouteSystem\Rotuing\DynamicRouteStaticRoute 将 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() 方法时对其进行迭代。如前所述,也存在 DynamicRouteDynamicRoutes 更加灵活,允许您使用正则表达式进行映射。下面的示例展示了如何映射任何以文本“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”。如果返回一个对象,则该对象必须实现一个返回 stringpublic 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 日:初始版本
© . All rights reserved.