我正在尝试构建一个简单的MVC框架,以更好地理解某些概念。我认为要解决的第一件事是处理我应用程序的所有请求的前控制器。
一旦我开始考虑它,我就不确定加载应用程序将使用的类的最佳方法。我当前的思考过程是我的自动加载器应位于前控制器中,因为每个请求都使用它。大多数框架通常将其放在哪里?浏览一些已经建立的框架并没有对我有很大帮助,因为许多功能远远超出了我的需要,使它变得如此复杂,以至于很难理解。
可以在这里找到我要使用的类加载程序https://gist.github.com/221634
只是试图弄清楚如何适当构建和组织一个简单的MVC框架。
您应该将其放在引导程序中。
这就是您可以做到的:
- 将每个HTTP请求强制向您的前控制器,index.php,app.php或您想调用它的方式。
- 前控制器可以定义框架中使用的一些常数,然后包括您的bootstrap.php文件。Bootstrap将启动您的应用程序。
- 现在,我在引导程序中做的第一件事是注册自动加载。这样,我可以轻松地获得 System Router Router类或 System Router Dispatcher类,您可以获得重点。
另外一件事,您甚至可以使用PSR0类加载程序注册应用程序模型文件夹。因此,可以说您的模型文件夹看起来像这样:
application/Models/
- Entities
- Services
Email.php
Cache.php
从您的控制器内部,您可以轻松获得类似的模型
public function someController()
{
$email = new ModelsServicesEmail();
// Do stuff with email service
}
对您的问题的简短答案是,最好的是第一个前控制器,它为您提供了一些"摇摆"空间,然后从那里加载启动应用程序的引导程序,而Bootstrap中的第一件事是需要您的类加载程序,并注册您要通过应用程序使用的库。
然后,您甚至可以为您的应用程序控制器和型号文件夹注册自动加载,并且在即将派遣请求时,在Bootstrap文件的末尾您可以要求这样的控制器:
$app = new '\Application\Controllers\' . $class;
// Dispatch request with call_user_func_array or ReflectionMethod and ReflectionClass
由于自动加载自动加载,因此无需需要控制器类,只需提供正确的名称空间。
很棒的问题,希望这会有所帮助!很高兴看到还有其他人在玩他们的Custome MVC:)
绝对在自举阶段!
自动加载器应成为每个PHP应用程序的一部分,它应该是(其中之一)初始化的第一类/代码。
我的MVC初始化步骤:
- 索引是入口点
- 引导程序用于初始化错误处理,自动加载器和IOC
- 应用程序,主要是MVC应用
- 路由机制
- 控制器
- 模型
- 查看
好吧,问题"它在哪里?"对我来说,提出了两个更精确的问题:
- 存储包含自动加载函数/类定义的文件在哪里?
- 在您的请求中,应在何处将其实例化,配置和允许进行魔术?
第一个问题 - "在哪里放置包含类的文件?" - 可能对您而言并不重要,因为您已经确定了要使用的自动加载类。精确的答案取决于您自己的框架应用程序结构,但是对于外部开发的类,例如您引用的类别,lib
或vendor
目录中的某个地方可能是有道理的。
对于第二个问题 - "在哪里实例化,配置等?" - 答案是:尽早在请求周期中,因此您可以从稍后引用的所有课程中自动加载。实际上,这可能意味着在引导过程中的某个地方。
当然,这通常意味着要加载自动加载器类,您可能必须执行手册require
/include
调用,实例化自动加载器对象,并使用名称空间和路径进行配置。