Как получить аргументы функции из параметров url - nginx переписывает? - PullRequest
0 голосов
/ 24 октября 2018

Я хочу перестроить свои PHP-скрипты на основе объектов в простой фреймворк и почитать некоторые уроки, чтобы извлечь из них уроки.На данный момент я застрял в части, как передать параметры из URL в аргументы функции ( аналогично здесь )

Передача контроллера и метода работает нормально, но первый аргумент (идентификатор в моемcase) не будет передано - по правильному индексу - с моим кодом из URL-адресов, таких как:

url: https: // Domain/controller/method/params

Это то, что я должен получить информацию от URL:

 public function __construct(){
  //print_r($this->getUrl());

  $url = $this->getUrl();

  // Look in controllers for first value
  if(file_exists('../app/controllers/' . ucwords($url[1]). '.php')){

  // If exists, set as controller
  $this->currentController = ucwords($url[1]);

  // Unset 0 Index
  unset($url[1]);
  }

  // Require the controller
  require_once '../app/controllers/'. $this->currentController . '.php';

  // Instantiate controller class
  $this->currentController = new $this->currentController;

  // Check for second part of url
  if(isset($url[2])){
    // Check to see if method exists in controller
    if(method_exists($this->currentController, $url[2])){
      $this->currentMethod = $url[2];
      // Unset 2 index
      unset($url[2]);
    }
  }

  // Get params
  $this->params = $url ? array_values($url) : [];

  // Call a callback with array of params
 call_user_func_array([$this->currentController, $this->currentMethod], $this->params);
}

public function getUrl(){
  if(isset($_GET['url'])){
    $url = rtrim($_GET['url'], '/');
    $url = filter_var($url, FILTER_SANITIZE_URL);
    $url = explode('/', $url);
    return $url;
  }
}

Как яПонимаю, что вся магия происходит здесь:

call_user_func_array([$this->currentController, $this->currentMethod], $this->params);

Но если я попытаюсь повторить аргумент в функции контроллера, он будет пуст:

public function test($id){
  echo $id;
}

Что работает, но первоеАргумент из URL здесь передается как $ id2:

public function test($id, $id2){
  echo "First:";
  echo $id; //empty
  echo "Second:";
  echo $id2; //(ID) 1
}
Url: https:// Domain/controller/test/1

Так что, я думаю, это может быть связано с правилом перезаписи nginx и результатом get_url.Относительно структуры папок, я протестировал некоторые правила nginx, чтобы получить тот же результат, что и в версии htaccess apache, но он все же другой.Поэтому для передачи контроллера и методов мне уже пришлось устанавливать индекс массива +1 (см. Код выше).

print_r($this->getUrl()); 
Result: Array ( [0] => [1] => controller [2] => test [3] => 1 )

Index [0] исходит из структуры dir и перехватывает папку public.В версии htaccess apache эта папка не перехватывается в массиве url ... Так может ли это быть причиной моей проблемы?

Структура каталогов:

web (server doc root)
- public (public folder after using rewrites)
- app

htaccess - это то же самоекак здесь .В дополнение к подобным правилам результат на nginx всегда одинаков.Это мое используемое правило на данный момент:

location /{FOLDER} {
client_max_body_size 100M;
root {DOCROOT}/{FOLDER}public;
index  index.php;

try_files $uri $uri/ /{FOLDER}index.php?url=$uri&$args;

location ~ \.php$ {
try_files $uri =404;
include /etc/nginx/fastcgi_params;
{FASTCGIPASS}
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
#fastcgi_param PATH_INFO $fastcgi_script_name;
fastcgi_intercept_errors on;

fastcgi_param HTTP_AUTHORIZATION $http_authorization;

}
}

Но, возможно, проблема не связана с правилами nginx.Я застрял здесь, как я уже сказал ...

Спасибо!

1 Ответ

0 голосов
/ 25 октября 2018

Похоже, это исправлено:

// Unset 0 Index
  unset($url[0]);
  unset($url[1]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...