Роутинг для одной точки входа

237
19 мая 2018, 03:00

Как сделать для запросов вида:

index.php POST act=add&user_id=1&param1=data1&..&paramN=dataN

Грамотный роутинг? Что здесь будет контроллер, что модель? потому что могут быть и такие строки:

index.php POST act=delete&user_id=1&param1=data1&..&paramN=dataN
index.php POST act=selection&user_id=1&param1=data1&..&paramN=dataN

мне GET вида:controller/model/param1/param2/param3 не нужен.

Answer 1

Ладно, вот смотри когда я смотрел как это работает, делал примерно так

index.php

<?php
function Scan($dir)
{
    if (!preg_match("/\.$/",$dir)){
       if (is_file($dir))  require_once($dir);
        else {
            $d=opendir("$dir");
            while(false !== ($file = readdir($d)))
                Scan("$dir/$file");
            closedir($d);
        }
    }
}
require_once('config.php');
Scan("./classes");
Scan("./controllers");
Scan("./models");
$bootstrap = new Bootstrap;
$controller = $bootstrap->createController();
if($controller) {
  $controller->executeAction();
}

bootstrap class

<?php
/**
 *
 */
class Bootstrap
{
  private $controller;
  private $action;
  private $request;
  function __construct()
  { 
    // разбираешь url
    $this->request = explode('/', mb_substr($_SERVER["REQUEST_URI"], 1)); 
    // смотришь полученные параметры на наличие home page
    if($this->request[0] == '') {
      $this->controller = 'home';
    }
    else {
      $this->controller = $this->request[0];
    }
    if(!isset($this->request[1]) || $this->request[1] == '') {
      $this->action = 'index';
    } else {
      $this->action = $this->request[1];
    }
  }
  public function createController() {
    // проверяешь на наличие того или иного контроллера
    if(class_exists($this->controller) ) {
      $parents = class_parents($this->controller);
      if( in_array("Controller", $parents) ) {
         // здесь уже смотришь на наличие действий
        if( method_exists($this->controller, $this->action ) ) {
          return new $this->controller($this->action, $this->request);
        }
        else {
          echo " <h1>Method does not exist </h1> ";
          return;
        }
      } else {
        echo "<h1>Base controller not found</h1>";
        return;
      }
    } else {
      echo "<h1>Controller class does not found</h1>";
      return;
    }
  }
}

И выходит по два параметра к примеру: user/login, controller:action А action уже сам разбирается, что он будет вытаскивать

На github есть полный код, только без комментариев разбирать сложно https://github.com/KaukinDima/php/tree/master/mvc/MVCmyCRUD

READ ALSO
Как сделать что бы обявления выводились плиткой?

Как сделать что бы обявления выводились плиткой?

Подскажите как сделать что бы обявления выводились плиткой ? Нужно что бы объявления выводились плиткой как на фото номер 2 на фото номер...

194
Доработка Like/Dislike на jQuery

Доработка Like/Dislike на jQuery

Привет нашел в интернете классную вещь, которую хочу поставить для своего простенького самописного сайтаСистема рейтинга лайков дизлайков

331
PHP. Узнать название файла

PHP. Узнать название файла

Есть директория, в ней mp3 файлы, я её сканирую, получаю массив с названием файлов (это файлы mp3, проигрывающиеся плеером JavaScript)Как узнать имя...

252
Настроить домен REACT + PHP

Настроить домен REACT + PHP

Не могу понять, как настроить домен при разработки на ReactУстанавливал, естественно, через react-create-app - http://localhost:3000

250