我已经按照youtube播放列表构建了一个基于PHP的简单MVC框架,这里是我跟随的播放列表的link。
这是我的应用程序结构的图像 enter image description here
我已将应用程序连接到MySql数据库,一切正常,但现在我正在尝试使用友好的URL。
目前,我的网址如下所示:
mywebsite.com/home/listings/
这很好,因为此链接适用于静态页面,但我希望动态网址相同,例如:
当前网址:mywebsite.com/home/listings/apart?id=10
到网址:mywebsite.com/home/listings/apart/id/10
我在htaccss中尝试了很多方法,但是一旦重写了URL,数据就不会从数据库中提取出来而且我只得到一个空页。
当前.htaccess代码(位于公用文件夹中的代码):
Options -MultiViews
RewriteEngine On
RewriteBase /public
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.+)$ index.php?url=$1 [QSA,L]
我尝试了很多方法和规则但没有工作。
我不确定我提供的详细信息是否足够清晰,我很困惑,因为我将很多教程组合在一起来创建这个应用程序。
App.php代码:
<?php
class App{
protected $controller = 'home';
protected $method = 'index';
protected $params = [];
public function __construct(){
$url = $this->parseUrl();
if(file_exists('../app/controllers/' . $url[0] . '.php')){
$this->controller = $url[0];
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) : [];
call_user_func_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));
echo $url;
}
}
}
?>
controller.php代码:
<?php
class Controller{
public function model($model){
require_once '../app/models/' . $model . '.php';
return new $model();
}
public function view($view, $data = []){
require_once '../app/views/' . $view . '.php';
}
}
?>
控制器代码:
<?php
class home extends Controller{
public function index(){
$this->view('home/index');
}
public function listings(){
$this->view('home/listings');
}
public function property(){
$this->view('home/property');
}
}
?>
该项目在线,如果有兴趣帮助我解决此问题,我可以给予完全访问权。
答案 0 :(得分:1)
在app.php的call_user_func_array()
中,您已经尝试将参数传递给被调用的Controller方法。你只需要方法来获得参数。
请注意,你需要在你的args上进行一些验证,因为任何人都可以在那里放任何东西。
我能给出的绝对最简单的答案形式:
public function listings($type = '', $field = null, $value = null){
$viewParams = [];
// build model (much of this should be in controller.php)
// only allow known types
if (in_array($type, ['apartment','house']) {
$model = $this->model($type);
// again, only certain fields (this should be handled in model.php)
if (in_array($field, ['id','allowedField']) {
// this is where things can get REALLY dicey.
// you'll need to sanitize the value, AND make sure the data-type is compatible with the field
$modelData = $model->findAndLoadData([$field => $value]);
$viewParams['type'] = $type;
$viewParams[$type] = $modelData;
}
}
$this->view('home/listings', $viewParams);
}
请记住以下警告: