4

我正在尝试构建一个简单的 MVC 框架来更好地理解某些概念。我认为需要解决的第一件事是处理我的应用程序的所有请求的前端控制器。

一旦我开始考虑它,我就不确定加载我的应用程序将使用的类的最佳方式。我目前的想法是我的自动加载器应该位于前端控制器中,因为每个请求都使用它。大多数框架通常把它放在哪里?浏览一些已经构建的框架对我没有多大帮助,因为很多功能远远超出了我的需要,使它变得非常复杂以至于难以理解。

我尝试使用的类加载器可以在这里找到https://gist.github.com/221634

只是想弄清楚如何适当地构建和组织一个简单的 MVC 框架。

4

3 回答 3

3

你应该把它放在你的引导文件中。

您可以这样做:

  1. 将每个 HTTP 请求强制发送到您的前端控制器、index.php、app.php 或您想如何调用它。
  2. Front Controller 可以定义框架中使用的一些常量,然后包含您的 Bootstrap.php 文件。Bootstrap 将启动您的应用程序。
  3. 现在,我在 Bootstrap 中做的第一件事就是注册自动加载。这样我可以很容易地得到 \System\Router\Router 类,或 \System\Router\Dispatcher 类,你明白了。

还有一件事,您甚至可以使用 PSR0 类加载器注册您的应用程序模型文件夹。因此,假设您的 Models 文件夹如下所示:

application/Models/
    - Entities
    - Services
        Email.php
        Cache.php

从您的控制器内部,您可以轻松获得这样的模型

public function someController()
{
    $email = new \Models\Services\Email();
    // Do stuff with email service
}     

对您的问题的简短回答是,最好的事情是首先为您提供一些“摆动”空间的前端控制器,然后从那里加载启动您的应用程序的引导程序,引导程序中的第一件事是要求您的类加载器,并通过应用程序注册要使用的库。

然后你甚至可以为你的应用程序 Controllers 和 Models 文件夹注册自动加载,并且在 Bootstrap 文件的末尾,当你要发送请求时,你可以像这样请求 Controller:

$app = new '\\Application\\Controllers\\' . $class;
// Dispatch request with call_user_func_array or ReflectionMethod and ReflectionClass

不需要控制器类,因为它是自动加载的,只需为它提供正确的命名空间。

很好的问题,希望这会有所帮助!很高兴看到其他人在玩他们的客户 MVC :)

于 2012-10-20T15:34:23.067 回答
2

绝对是在引导阶段!

自动加载器应该是每个 PHP 应用程序的一部分,并且它应该是(之一)第一个初始化的类/代码。

我的 MVC 初始化步骤:

  • 索引是入口点
  • 用于初始化错误处理、自动加载器和IoC的引导程序
  • 应用程序,主要是 MVC 应用程序
  • 路由机制
  • 控制器
  • 模型
  • 看法
于 2012-10-18T18:37:13.963 回答
1

那么,问题“它去哪儿了?” 对我来说,提出了两个更精确的问题:

  1. 包含自动加载器函数/类定义的文件存储在哪里?
  2. 在您的请求调度周期中,它应该在哪里被实例化、配置并允许它发挥它的魔力?

第一个问题 - “将包含类的文件放在哪里?” - 可能对您来说不是那么重要,因为您已经确定了要使用的自动加载器类。确切的答案取决于您自己的框架应用程序结构,但对于像您引用的那样的外部开发类,在liborvendor目录中的某个位置可能是有意义的。

对于第二个问题 - “在哪里实例化、配置等?” - 答案是:尽可能早地在请求周期中,这样您就可以获得稍后引用的所有类的自动加载的好处。实际上,这可能意味着在您的引导过程中的某个地方。

当然,这通常意味着为了加载您的自动加载器类,您可能需要手动require/include调用,实例化您的自动加载器对象,并使用命名空间和路径对其进行配置。

于 2012-10-18T18:48:13.300 回答