php路由的基础知识

时间:2014-01-06 22:57:05

标签: php laravel url-routing laravel-routing

我正在寻找关于如何进行非常基本的php路由的教程或解释。

例如,当我访问以下链接时:mywebsite.com/users我想运行路由类的get方法来提供数据,就像laravel一样。

Route::get('users', function()
{
    return 'Users!';
});

有人可以解释如何执行此操作或向我提供更多信息吗?

3 个答案:

答案 0 :(得分:2)

在最常见的配置中,PHP依靠Web服务器来进行路由。这是通过将请求路径映射到文件来完成的:如果您请求www.example.org/test.php,Web服务器实际上将在预定义的目录中查找名为test.php的文件。

有一个功能可以用于我们的目的:许多Web服务器还允许您调用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。我们现在可以打电话给www.example.org/index.php/hello,以获得一个不错的“Hello,World!”信息。或www.example.org/index.php/获取主页。

该URL中的“index.php”仍然很难看,但我们可以通过使用URL重写来解决这个问题。在Apache HTTPD中,您可以将.htaccess文件放在同一目录中,其中包含以下内容:

RewriteEngine on
RewriteRule ^(.*)$ index.php/$1

你有!你自己的路由器,有10行以下的逻辑代码(不包括注释和路由列表)。

答案 1 :(得分:0)

文档应该有所帮助 - 官方文档http://laravel.com/docs/quick#routing

Excelent“Laravel from scratch”视频指南 - https://laracasts.com/series/laravel-from-scratch(观看可能有帮助的第二集)

答案 2 :(得分:0)

嗯......互联网上有很多用于php路由的框架。如果您愿意,可以尝试https://packagist.org/search/?q=route。但说实话,如果你来自程序化的PHP世界,那么你第一次可能会遇到问题。

如果您愿意,可以使用Jesse Boyer编写的以下代码,这些代码用于我自己的项目。您的应用程序结构应遵循 -

[应用程序文件夹]

  • 的index.php
  • 的.htaccess
  • route.php

route.php

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

        }

    }

}

的.htaccess

这里是第二行,而不是&#39; / php / cfc /&#39;您需要放置localhost项目目录名称,例如&#39; Application-folder&#39;

RewriteEngine On
RewriteBase /php/cfc/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^(.+)$ index.php?uri=$1 [QSA,L]

的index.php

在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();

这件事对我来说很完美。希望它也适合你......

快乐编码...... :)