我尝试进入MVC但遇到了一个问题,这个问题没有在任何地方解释,它是如何从一个控制器重定向到另一个控制器。
我正在使用以下.htaccess文件:
RewriteEngine On
RewriteCond% {REQUEST_FILENAME}!-F
RewriteCond% {REQUEST_FILENAME}!-D
RewriteRule ^(.*)$ index.php? Url = $ 1 [L, QSA]
在放入其方法和id后直接使用控制器。
所有这些工作都以标准方式访问它们,但是当选择视图以进一步将页面ienata直接用作控制器时。
<a href="next_page_controler"> NEXT_PAGE </ a>
并访问下一个控制器,但是当我想访问方法时必须使用
<a href="next_page_controler/**controler_model**"> NEXT-pAGE_MODEL </ a>
这里有两个问题:
IN地址栏中的重复链接再次显示为
www.site_pat/next_page_controler/next_page_controler/next_page_controler/next_page_controler/next_page_controler/controler_model
当您尝试使用标头(Location: controler_name
)重定向方法controler_model时;什么都没有得到消息或任何只想尝试的东西,但重定向不起作用。
如何解决问题我猜很多你遇到的这些都是基本的东西,我认为大喊大叫开始使用框架应该了解这些基础知识。
答案 0 :(得分:1)
你的htaccess有问题,应该像......
RewriteEngine On
RewriteCond %{REQUEST_FILENAME}!-F
RewriteCond %{REQUEST_FILENAME}!-D
RewriteRule ^(.*)$ index.php/$1 [L, QSA]
答案 1 :(得分:1)
更新:
@prodigitalson你能给我一个例子
因此,一个超级简单的示例可能类似于以下代码。我从来没有真正从sractch编写路由器,因为我通常使用一个框架,所以你可能需要这个不包含的soem功能......路由是一个相当复杂的事情,取决于你想要它的可恢复性。我会推荐一些不同的php框架如何做好示例。
// define routes as a regular expression to match
$routes = array(
'default' => array(
'url' => '#^/categories/(?P<category_slug>\w*(/.*)?$#',
'controller' => 'CategoryController'
)
)
);
// request - you should probably encapsulate this in a model
$request = array();
// loop through routes and see if we have a match
foreach($routes as $route){
// on the first match we assign variables to the request and then
// stop processing the routes
if(preg_match($route['url'], $_SERVER['REQUEST_URI'], $params)){
$request['controller'] = $route['controller'];
$request['params'] = $params;
$request['uri'] = $_SERVER['REQUEST_URI'];
break;
}
}
// check that we found a match
if(!empty($request)){
// dispatch the request to the proper controller
$controllerClass = $request['controller'];
$controller = new $controllerClass();
// because we used named subpatterns int he regex above we can access parameters
// inside the CategoryController::execute() with $request['params']['category_slug']
$response = $controller->execute($request);
} else {
// send 404
}
// in this example $controller->execute() returns the compiled HTML to render, but
// but in most systems ive used it returns a View object, or the name of the template to
// to be rendered - whatever happens here this is where you send your response
print $response;
exit(0);
你不应该从.htaccess实现你的控制器路由。你应该简单地将除静态资产之外的所有请求都转到index.php。然后在php端你根据url的模式确定在哪里发送请求。