Php 控制器之间的切换(MVC)
我试图理解并找出一种在自定义框架中的控制器之间切换的好方法。下面的例子就是我目前所想的,为了演示的目的而简化了,但是如果有更好的方法,我真的非常感谢一些专家的建议Php 控制器之间的切换(MVC),php,oop,model-view-controller,Php,Oop,Model View Controller,我试图理解并找出一种在自定义框架中的控制器之间切换的好方法。下面的例子就是我目前所想的,为了演示的目的而简化了,但是如果有更好的方法,我真的非常感谢一些专家的建议 class BaseController() { function __construct() { $this->model = new ModelFactory(); $this->view = new View(); if(isset($_SERVER['QUE
class BaseController() {
function __construct() {
$this->model = new ModelFactory();
$this->view = new View();
if(isset($_SERVER['QUERY_STRING'])) {
list($controller, $action) = explode('=', $_SERVER['QUERY_STRING']);
self::process($controller);
}
}
public function process($controller) {
switch($controller) {
case 'user':
$user = new UserController($action);
break;
case 'forum':
$forum = new ForumController($action);
break;
default:
// use base controller
switch($action) {
case 'contact':
$this->view->load($action);
break;
}
}
}
}
// inside UserController.php
switch($action) {
case 'register':
break;
case 'login':
break;
}
// inside ForumController.php
switch($action) {
case 'new_thread':
break;
case 'edit_post':
break;
}
这确实是一个部分答案,希望能给你一些好的建议。我相信有人会有更好的答案
BaseController
可能命名错误。您所拥有的使它看起来更像一个控制器工厂,而不是所有其他控制器类可能派生的基础控制器。看起来这更像是一个“路由”类,所以你应该考虑给它一个更合适的名字来命名它的工作。IController
或类似的东西。这将在下一步中使用
b) 您必须满足于使用字符串作为类名创建对象。IE$controllerObject=new$controller()代码>在“路由”处理程序类中。原因是要运行的控制器和操作名称直接来自请求URL。有很多方法可以给这部分加上别名,但这完全是另一个问题。不要忘记验证和/或白名单这些从客户端传入的“控制器”类名。要验证:请使用PHP函数class\u exists($controller)
,如果true
,请检查以确保controller类使用PHP内置的class\u implements($controller)
实现IController
。只有这样,您才能执行$controllerObject=new$controller()
以实际创建控制器对象
然后,您的“路由”过程
方法变得更像(请记住,这是一个非常简化的示例):
c) 不要让您的控制器声明任何方法(即使用$action
的值命名),您不希望客户端直接使用上述设计模式执行。希望您的框架用户也能理解这一点。只要确保正确地记录这在内部是如何工作的,以使您的框架用户知道
当然还有更多的方法,但这取决于你——框架设计师。此外,行动应该对使用什么“视图”拥有最终决定权。如果操作没有明确说明要使用的视图,则可以设置默认值。但是,这又是另一个问题。你真的应该从阅读MVC的实际内容开始。我建议从福勒的开始。因为有一件事是非常确定的——你所拥有的不是它 看起来,您所命名的
BaseController
,实际上是在处理路由问题。它是用户的请求URL,并根据您从该URL检索到的内容包含一个文件。这既不是面向对象编程,也不是过程编程。你所拥有的被称为
为了避免这种疯狂,您应该创建一个单独的类,为您的应用程序实现路由机制。根据您用上述结构提取的数据,您应该启动特定的控制器实例,并对其调用一个方法
比如:
$request = new Request('QUERY_STRING');
$router = new Router;
$router->import('/path/to/routing/config.file');
$router->route( $request );
$klass = $request->getParameter('controller');
if (class_exists( $controller ))
{
$command = $request->getMethod() . $request->getParameter('action');
}
else
{
$klass = 'Error';
$command = 'getMessage';
}
$controller = new $klass;
$controller->{$command}( $request );
这当然是一个极其简化的版本。MVC模式旨在为大型项目带来一些秩序。如果你用它来创建一个简单的博客/名片网站,那就太过分了(假设页面没有增长)
p.S.您可能会发现以下链接对您的学习很有用:,和
你打算允许你的框架用户实现带有自定义操作的自定义控制器吗?@bob the destroyer如果这会使代码更通用,我想会的,那么是的。重命名类+1。假设控制器有一个父基类,那么名称的选择就更好了。
$request = new Request('QUERY_STRING');
$router = new Router;
$router->import('/path/to/routing/config.file');
$router->route( $request );
$klass = $request->getParameter('controller');
if (class_exists( $controller ))
{
$command = $request->getMethod() . $request->getParameter('action');
}
else
{
$klass = 'Error';
$command = 'getMessage';
}
$controller = new $klass;
$controller->{$command}( $request );