Лучший способ объяснить это с помощью примеров, так что вот пример моей собственной реализации приложения PHP-MVC. Обязательно обратите особое внимание на функцию Hook::run
, которая обрабатывает аргументы для загрузки элемента управления.
index.php:
<?php
class Hook {
const default_controller = 'home';
const default_method = 'main';
const system_dir = 'system/';
static function control ($name, $method, $parameter) {
self::req(Hook::system_dir.$name.'.php'); // Include the control file
if (method_exists('Control', $method)) { // For my implementation, I can all control classes "Control" since we should only have one at a time
if (method_exists('Control', 'autoload')) call_user_func(array('Control', 'autoload')); // This is extremely useful for having a function to execute everytime a particular control is loaded
return call_user_func(array('Control', $method), $parameter); // Our page is actually a method
}
throw new NotFound($_GET['arg']); // Appear page.com/control/method does not exist, so give a 404
}
static function param ($str, $limit = NULL) { // Just a wrapper for a common explode function
return (
$limit
? explode('/', rtrim($str, '/'), $limit)
: explode('/', rtrim($str, '/'))
);
}
static function req ($path) { // Helper class to require/include a file
if (is_readable($path)) return require_once($path); // Make sure it exists
throw new NotFound($path); // Throw our 404 exeception if it doesn't
}
static function run() {
list($name, $method, $parameter) = ( // This implementaion expects up to three arguements
isset($_GET['arg'])
? self::param($_GET['arg'], 3) + array(self::default_controller, self::default_method, NULL) // + array allows to set for default params
: array(self::default_controller, self::default_method, NULL) // simply use default params
);
return self::control($name, $method, $parameter); // Out control loader
}
}
class AuthFail extends Exception {}
class UnexpectedError extends Exception {}
class NotFound extends Exception {}
try {
Hook::run();
}
catch (AuthFail $exception) { // Makes it posssible to throw an exception when the user needs to login
// Put login page here
die('Auth failed');
}
catch (UnexpectedError $exception) { // Easy way out for error handling
// Put error page here
die('Error page');
}
catch (NotFound $exception) { // Throw when you can't load a control or give an appearance of 404
die('404 not found');
}
система / home.php:
<?php
class Control {
private function __construct () {}
static function autoload () { // Executed every time home is loaded
echo "<pre>Home autoload\n";
}
static function main ($param='') { // This is our page
// Extra parameters may be delimited with slashes
echo "Home main, params: ".$param;
}
static function other ($param='') { // Another page
echo "Home other, params:\n";
$param = Hook::param($param);
print_r($param);
}
}
.htaccess:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule ^(.+)$ index.php?arg=$1 [QSA,L]
С помощью этого файла htaccess мы можем загрузить элемент home.php, используя localhost/home/main
. Без этого наши URL выглядели бы как localhost/index?args=home/main
.
Демонстрационный скриншот 1 (localhost / simple_mvc / home / main / args1 / args2 / args3):
Вы не всегда знаете, сколько аргументов ожидает конкретный метод управления, поэтому я считаю, что лучше всего передать один аргумент, ограниченный косой чертой. Если метод управления ожидает более одного аргумента, вы можете использовать предоставленную функцию Hook::param
для дальнейшей оценки.
Демонстрационный скриншот 2 (localhost / simple_mvc / home / other / args1 / args2 / args3):
Чтобы ответить на ваш вопрос:
Ключевым файлом, который действительно помогает ответить на ваш вопрос, является файл .htaccess
, который превращает localhost/these/types/of/urls
в нечто вроде localhost/index.php?args=these/types/of/urls
. Это тогда позволяет вам разделить аргументы, используя explode($_GET['args'], '/');
.
БОЛЬШОЙ видеоурок на эту тему здесь . Это действительно помогает многое объяснить.
Я внес некоторые изменения в home.php и index.php с последним редактированием