使用PHP中的MVC重定向和链接的问题

时间:2011-07-27 11:31:12

标签: php .htaccess redirect

我尝试进入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> 

这里有两个问题:

  1. IN地址栏中的重复链接再次显示为

    www.site_pat/next_page_controler/next_page_controler/next_page_controler/next_page_controler/next_page_controler/controler_model

  2. 当您尝试使用标头(Location: controler_name)重定向方法controler_model时;什么都没有得到消息或任何只想尝试的东西,但重定向不起作用。

  3. 如何解决问题我猜很多你遇到的这些都是基本的东西,我认为大喊大叫开始使用框架应该了解这些基础知识。

2 个答案:

答案 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的模式确定在哪里发送请求。