Я ищу учебник или объяснение, как сделать очень простой php-маршрутизацию.
Например, когда я посещаю ссылку вроде: mywebsite.com/users, я хочу запустить метод get класса маршрута для предоставления данных, так же, как это делает laravel.
Route::get('users', function() { return 'Users!'; });
Может кто-нибудь объяснить, как это сделать или предоставить мне дополнительную информацию?
В своей наиболее общей конфигурации PHP полагается на веб-сервер для выполнения маршрутизации. Это делается путем сопоставления пути запроса к файлу: если вы запрашиваете http://www.example.org/test.php, веб-сервер будет фактически искать файл с именем test.php в предопределенном каталоге.
Есть функция, которая пригодится для нашей цели: многие веб-серверы также позволяют вам звонить по адресу http://www.example.org/test.php/hello, и он все равно будет выполнять test.php. PHP делает дополнительный материал в запрошенном пути доступным через переменную $_SERVER['PATH_INFO']
. В этом случае он будет содержать «/ hello».
Используя это, мы можем построить такой простой маршрутизатор, как это:
<?php // First, let's define our list of routes. // We could put this in a different file and include it in order to separate // logic and configuration. $routes = array( '/' => 'Welcome! This is the main page.', '/hello' => 'Hello, World!', '/users' => 'Users!' ); // This is our router. function router($routes) { // Iterate through a given list of routes. foreach ($routes as $path => $content) { if ($path == $_SERVER['PATH_INFO']) { // If the path matches, display its contents and stop the router. echo $content; return; } } // This can only be reached if none of the routes matched the path. echo 'Sorry! Page not found'; } // Execute the router with our list of routes. router($routes); ?>
Для простоты я не делал маршрутизатор классом. Но отсюда тоже не должно быть проблемой.
Предположим, мы назвали этот файл index.php. Теперь мы можем позвонить по адресу http://www.example.org/index.php/hello, чтобы получить «Hello, World!». сообщение. Или http://www.example.org/index.php/, чтобы получить основную страницу.
«Index.php» в этом URL-адресе по-прежнему уродлив, но мы можем исправить это, используя переписывание URL-адресов. В Apache HTTPD вы помещаете файл .htaccess
в тот же каталог со следующим содержимым:
RewriteEngine on RewriteRule ^(.*)$ index.php/$1
И вот ты! Ваш собственный маршрутизатор с 10 строками логического кода (не считая комментариев и списка маршрутов).
Документация должна помочь – официальные документы http://laravel.com/docs/quick#routing
Отличный видеоролик «Laravel с нуля» здесь – https://laracasts.com/series/laravel-from-scratch (смотрите второй эпизод, который может помочь)
Ну … Есть много рамок в Интернете для php-маршрутизации. Если вы хотите, вы можете попробовать это с https://packagist.org/search/?q=route . Но если честно, если вы из процессуального мира PHP, это может быть проблематично для вас в первый раз.
Если вам нравится, вы можете использовать следующий код, написанный Джесси Бойером, который я использовал для своих собственных проектов. Структура приложения должна следовать:
[Application папка]
<?php /** * @author Jesse Boyer <contact@jream.com> * @copyright Copyright (C), 2011-12 Jesse Boyer * @license GNU General Public License 3 (http://www.gnu.org/licenses/) * Refer to the LICENSE file distributed within the package. * * @link http://jream.com * * @internal Inspired by Klein @ https://github.com/chriso/klein.php */ class Route { /** * @var array $_listUri List of URI's to match against */ private static $_listUri = array(); /** * @var array $_listCall List of closures to call */ private static $_listCall = array(); /** * @var string $_trim Class-wide items to clean */ private static $_trim = '/\^$'; /** * add - Adds a URI and Function to the two lists * * @param string $uri A path such as about/system * @param object $function An anonymous function */ static public function add($uri, $function) { $uri = trim($uri, self::$_trim); self::$_listUri[] = $uri; self::$_listCall[] = $function; } /** * submit - Looks for a match for the URI and runs the related function */ static public function submit() { $uri = isset($_REQUEST['uri']) ? $_REQUEST['uri'] : '/'; $uri = trim($uri, self::$_trim); $replacementValues = array(); /** * List through the stored URI's */ foreach (self::$_listUri as $listKey => $listUri) { /** * See if there is a match */ if (preg_match("#^$listUri$#", $uri)) { /** * Replace the values */ $realUri = explode('/', $uri); $fakeUri = explode('/', $listUri); /** * Gather the .+ values with the real values in the URI */ foreach ($fakeUri as $key => $value) { if ($value == '.+') { $replacementValues[] = $realUri[$key]; } } /** * Pass an array for arguments */ call_user_func_array(self::$_listCall[$listKey], $replacementValues); } } } }
здесь, в 2-й строке, вместо '/ php / cfc /' вам нужно указать имя каталога проекта localhost, например 'Application-folder'
RewriteEngine On RewriteBase /php/cfc/ RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.+)$ index.php?uri=$1 [QSA,L]
В файле index.php вам необходимо написать следующие коды:
<?php include "route.php"; /** * ----------------------------------------------- * PHP Route Things * ----------------------------------------------- */ //define your route. This is main page route. for example www.example.com Route::add('/', function(){ //define which page you want to display while user hit main page. include('myindex.php'); }); // route for www.example.com/join Route::add('/join', function(){ include('join.php'); }); Route::add('/login', function(){ include('login.php'); }); Route::add('/forget', function(){ include('forget.php'); }); Route::add('/logout', function(){ include('logout.php'); }); //method for execution routes Route::submit();
в<?php include "route.php"; /** * ----------------------------------------------- * PHP Route Things * ----------------------------------------------- */ //define your route. This is main page route. for example www.example.com Route::add('/', function(){ //define which page you want to display while user hit main page. include('myindex.php'); }); // route for www.example.com/join Route::add('/join', function(){ include('join.php'); }); Route::add('/login', function(){ include('login.php'); }); Route::add('/forget', function(){ include('forget.php'); }); Route::add('/logout', function(){ include('logout.php'); }); //method for execution routes Route::submit();
в<?php include "route.php"; /** * ----------------------------------------------- * PHP Route Things * ----------------------------------------------- */ //define your route. This is main page route. for example www.example.com Route::add('/', function(){ //define which page you want to display while user hit main page. include('myindex.php'); }); // route for www.example.com/join Route::add('/join', function(){ include('join.php'); }); Route::add('/login', function(){ include('login.php'); }); Route::add('/forget', function(){ include('forget.php'); }); Route::add('/logout', function(){ include('logout.php'); }); //method for execution routes Route::submit();
в<?php include "route.php"; /** * ----------------------------------------------- * PHP Route Things * ----------------------------------------------- */ //define your route. This is main page route. for example www.example.com Route::add('/', function(){ //define which page you want to display while user hit main page. include('myindex.php'); }); // route for www.example.com/join Route::add('/join', function(){ include('join.php'); }); Route::add('/login', function(){ include('login.php'); }); Route::add('/forget', function(){ include('forget.php'); }); Route::add('/logout', function(){ include('logout.php'); }); //method for execution routes Route::submit();
в<?php include "route.php"; /** * ----------------------------------------------- * PHP Route Things * ----------------------------------------------- */ //define your route. This is main page route. for example www.example.com Route::add('/', function(){ //define which page you want to display while user hit main page. include('myindex.php'); }); // route for www.example.com/join Route::add('/join', function(){ include('join.php'); }); Route::add('/login', function(){ include('login.php'); }); Route::add('/forget', function(){ include('forget.php'); }); Route::add('/logout', function(){ include('logout.php'); }); //method for execution routes Route::submit();
в<?php include "route.php"; /** * ----------------------------------------------- * PHP Route Things * ----------------------------------------------- */ //define your route. This is main page route. for example www.example.com Route::add('/', function(){ //define which page you want to display while user hit main page. include('myindex.php'); }); // route for www.example.com/join Route::add('/join', function(){ include('join.php'); }); Route::add('/login', function(){ include('login.php'); }); Route::add('/forget', function(){ include('forget.php'); }); Route::add('/logout', function(){ include('logout.php'); }); //method for execution routes Route::submit();
Это прекрасно работает для меня. Надеюсь, это сработает и для вас …
Счастливое кодирование … 🙂