我是MVC的新手,我在下面创建了一个路由类,它工作正常,但是当我转到索引页面时,导航锚点href是正确的。但当我移动到其他控制器时,url第一个字符串是url-0,仍然是前一个控制器,它改变了所有导航href地址base + previous controller,例如,如果我在indexController / index上,它将显示所有页面froom数据库。当我想通过导航锚点调用logincontroller时,logincontroller href改变它变成了indecontroller / loginController / login。正确的登录href地址是loginController / login。我的htaccess和路由类在下面。文件夹结构。
mvc app controllers indexcontroller.php userController.php model user.php page.php LIB 核心App.php Controller.php 包括navigation.php style style.css 图片 js javscript 的index.php
我希望有人可以帮助我,我尝试但是很成功但请提前帮助谢谢。
RewriteEngine On
RewriteBase /socialNetwork
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !=/favicon.ico
RewriteRule ^([a-zA-Z0-9\/\-_]+)\.?([a-zA-Z]+)?$ index.php?url=$1&extension=$2 [QSA,L]
class App
{
protected $controller = 'indexController';
protected $method = 'index';
protected $params = array();
public function __construct()
{
$url = $this->parseUrl();
//print_r($url);
if (isset($url[0]))
{
if (file_exists('app/controllers/'.$url[0].'.php'))
{
//$url = ('../app/controllers/'.$url[0].'.php');
$this->controller = $url[0];
//echo ($this->controller);
unset($url[0]);
}
}
require_once('app/controllers/'.$this->controller.'.php');
$this->controller = new $this->controller;
if (isset($url[1]))
{
if (method_exists($this->controller,$url[1]))
{
$this->method = $url[1];
unset($url[1]);
}
}
$this->params = $url ? array_values($url) : array();
call_user_func_array(array($this->controller,$this->method),$this->params);
}
public function parseUrl()
{
if (isset($_GET['url']))
{
return $url =explode('/',filter_var(rtrim($_GET['url'],'/'),FILTER_SANITIZE_URL));
}
}
}
这是我的索引页。
<header>
<img width="960" height="100" src="http://localhost/socialNetwork/images/bgheader.png">
</header>
<?php
include_once("include/navigation.php");?>
<section class="content">
<?php
require_once('app/init.php');
$app = new App;
?>
</section>
答案 0 :(得分:-1)
您的视图文件(html文件)中不应包含相对URL。查看一些常见的类似MVC的PHP框架,如Laravel或Symfony。它们都有方法为您提供完整的合格网址,例如:http://domain.tld/controller/param/ ...而不是/ cobntroller /.../ p>
实现这一点可以解决您的问题。
例如,查看Laravel。它非常容易理解且非常灵活。在那里,您可以使用Redirect::route('your-route-name')
等功能访问所有路线。然后,路由引擎会将其转换为完整的URL!
编辑:更准确地说,laravel根据定义并不是真正的mvc。但在某些部分,它就像一个mvc。
希望这有帮助