PHP MVC结构和动态URL重写

时间:2017-09-28 21:38:48

标签: php

我已经按照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');
    }
  }
 ?>

该项目在线,如果有兴趣帮助我解决此问题,我可以给予完全访问权。

1 个答案:

答案 0 :(得分:1)

控制器方法需要args。应用程序调用需要特定的参数。

在app.php的call_user_func_array()中,您已经尝试将参数传递给被调用的Controller方法。你只需要方法来获得参数。

请注意,你需要在你的args上进行一些验证,因为任何人都可以在那里放任何东西。

我能给出的绝对最简单的答案形式:

/app/controllers/home.php

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);
}

请记住以下警告:

  • 有很多方法可以构建它,这里的逻辑可以在app,基本控制器或模型中。
  • 消化$ value,或者建立你的模型,这无关紧要。
  • 你仍然需要找到一种方法在视图中使用这些参数。