一个精简高效的开源MVC框架!

v1.0.1 2014-06-15 23:45 UTC

This package is not auto-updated.

Last update: 2024-09-28 16:31:02 UTC


README

Build Status

LMMVC 是一个相对较小的PHP MVC库。它允许您根据请求URI将请求路由到控制器以处理请求,这与其他MVC类似。

LMMVC 有什么不同之处?说实话,可能没有多少。尽管已经有数百(或数千,或很多)其他的MVC库,但我主要是为了学习经验而创建了这个库。然而,我计划从现在开始在我的项目中使用它。我认为我会将其开源(MS-RL许可),这样我就可以有一个中心位置来保持它更新。

与其他大多数MVC一样,URL的格式如下

http://www.example.com/controller_name/method_name?id=1&code=abcde

使用LMMVC的默认设置,这将加载一个名为ControllerName的控制器并调用method_name。id和code可以通过$_GET访问,如常规操作。

安装

您可以在我们的发布页面获取最新版本,或者克隆它,甚至可以使用composer。要使用composer通过此包,请将以下内容添加到require中

  "ianaldrighetti/lmmvc": "v1.0"

基本设置

对于基本设置,您可以检查仓库中的/example/目录。在那里有一个示例 .htaccess,示例 index.php 和示例控制器。示例 index.php 介绍了对设置应用程序的人来说有用的基本方法。但是,对于更详细的文档,您可以在下面查看。

使用

您只需创建一个实现 \LmMvc\BaseController 接口的类,如下所示

// All your controllers must belong to the same namespace (at the same level).
// Then you tell LMMVC which namespace to look at using the setNamespace method.
namespace YourControllerNamespace;

use LmMvc\BaseController;

class MyController implements BaseController
{
  /**
   * This is the index of the controller.
   */
  public function index()
  {
  
  }
  
  /**
   * This would be accessible through {your_url}/my_controller/another_page.
   */
  public function another_page()
  {
  
  }
}

这就是您的基本控制器。

注意: LMMVC 不允许用户访问私有、受保护或静态方法。任何要对外部世界可访问的方法 必须 被标记为公共。

方法参数

LMMVC 的一个小巧功能是控制器中的方法可以指定参数,这些参数将从 $_GET 中检索(如果可用)。

例如,一个像这样的方法

public function args($userId, $userName = 'you', array $data)
{
  // *do awesome stuff*
}

上面的方法将会传递 $_GET['userId']$_GET['userName']$_GET['data']。如果没有找到这些参数并且参数设置了默认值,则将传递 null。如果没有找到 $_GET 中的任何变量并且它有默认值,则将传递默认值。

参数可以用数组进行类型提示,如果示例中的 $_GET['data'] 未找到,则提供一个空数组。但是,如果 $_GET['data'] 实际上不是数组,LMMVC 会将其转换为数组($data[0] 条目设置为 $_GET['data'])。

应用程序文档

以下是应用程序类中每个方法的文档。

setControllerCaser

控制器命名规则在 LMMVC 中非常重要。因为 LMMVC 依赖于运行时自动加载来加载控制器,因此控制器名称必须正确命名才能使自动加载正常工作(因为它通常是大小写敏感的)。

要设置控制器命名规则,您可以执行以下操作之一

// Invoke a function name for casing.
$application->setControllerCaser('function_name');

// If you are on the right PHP version, you can do:
$application->setControllerCaser(function($controllerName)
  {
    // *do stuff*
    return $controllerName;
  });

// You can also do classes:
$application->setControllerCaser(array($object, 'methodName'));

// Or a static method in a class:
$application->setController(array('\\Class\\Namespace\\ClassName', 'methodName'));

LMMVC 提供了一个带有静态方法的类,提供了一些常见的控制器名称命名规则。这些都在 \LmMvc\Utility\ControllerCaser 类中

  • lowerCase - 这会将控制器名称转换为小写,基本上没有变化。
  • upperCaseFirst - 这会将名称的第一个字符转换为大写,因此 mycontroller 会变成 Mycontroller。
  • camelCase - 这会将控制器名称转换为驼峰式。这略有不同,因为它要求在要转换为大写的字符之前有一个下划线 (_)。这意味着 my_controller 会变成 myController。
  • camelCaseWithFirstUpper - 与 camelCase 相同,但 my_controller 会变成 MyController(它将控制器名称的第一个字符转换为大写)。

LMMVC 默认使用 ControllerCaser::camelCaseWithFirstUpper。另外,如果您使用驼峰命名法,这意味着实际的控制器名称(即在源文件中 class MyController implements BaseController)不能包含下划线。这是因为它们在解析控制器名称时用来确定要大写的字符。

这些控制器命名规则在控制器名称无法处理的情况下也可能抛出异常。例如,ControllerCaser 中的 camelCase 方法如果在一行中出现多个下划线,则会抛出异常。但如果控制器名称包含控制器类名称无效的字符,则不需要抛出异常,因为它会首先使用 isClassMethodNameValid 方法进行验证。

setExceptionHandler

异常处理器必须是实现了 \LmMvc\ExceptionHandler 类的类的实例。异常处理器用于处理异常,正如其名称所暗示的。这些异常包括 PageNotFoundException、MalformedUriException 和 ControllerException ——这些都是 LMMVC 在某些时候可能抛出的异常。它还必须处理所有其他异常,包括控制器可能抛出的异常。通常,LMMVC 伴随一个默认的异常处理器,名为 \LmMvc\DefaultExceptionHandler。

但是,如果您想使用自定义的处理器,您只需调用

$application->setExceptionHandler($exceptionHandler);
setNamespace

正如多次提到的,LMMVC 依赖于自动加载在运行时加载控制器。为了实现这一点(也就是说,做得正确),您必须告诉 LMMVC 控制器所在的位置,它们的命名空间。这样做如下

$application->setNamespace('\\Your\\Application\\Controller');

这将使 LMMVC 尝试从 \Your\Application\Controller\MyController 自动加载名为 my_controller 的控制器(根据默认的命名规则,它变成 MyController)。

setDefaultController

如果无法从请求 URI(即 /index/somepage)中确定控制器名称,LMMVC 必须知道要使用的默认控制器,如下所示

$application->setDefaultController('default_page');

注意,如上所述,这并不是控制器实现中的实际名称,而是根据所使用的控制器命名规则在 URL 中出现的控制器名称。例如,使用默认控制器命名规则,DefaultPage 应指定为 default_page

run

一切设置完成后,只需调用

$application->run();

这将触发路由,如果设置正确,您的应用程序将工作。就这么简单!

其他方法

Application 类中还有其他公开可访问的方法,但它们只是为了测试目的。您始终可以查看源中对这些其他方法的文档。