php路由的基础[关闭]

Posted

技术标签:

【中文标题】php路由的基础[关闭]【英文标题】:The basics of php routing [closed] 【发布时间】:2014-01-24 12:01:21 【问题描述】:

我正在寻找有关如何进行非常基本的 php 路由的教程或说明。

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

Route::get('users', function()

    return 'Users!';
);

有人可以解释一下如何做到这一点或提供更多信息吗?

【问题讨论】:

绝对最简单的东西可能可行吗?查看路由字符串是否是正在请求的 URL 的子字符串。如果是,请调用该函数。 有很多方法可以做到这一点。如果您希望自动执行此行为,请使用提供它的框架。 PHP 本身并不包含这样的框架。 如果您不熟悉框架,也可以通过 .htaccess 文件来实现。 开源软件的部分好处是您可以阅读源代码... 是的,但是当文档从一种方法跳转到另一种方法时,它有点超出我的想象。 【参考方案1】:

在其最常见的配置中,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 行(不包括 cmets 和路由列表)。

【讨论】:

有一个功能对我们的目的很方便:很多web服务器也允许你调用www.example.org/test.php/hello它仍然会执行test.php这是怎么回事虽然部分已完成,但这是最重要的步骤之一。 开箱即用。只需将带有&lt;?php echo $_SERVER['PATH_INFO']; ?&gt; 的PHP 文件放在某个地方,然后自己尝试一下。【参考方案2】:

嗯...互联网上有很多用于 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

这里在第 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

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

这东西对我来说非常有用。希望它也对你有用......

编码愉快... :)

【讨论】:

【参考方案3】:

嗯,使用原生 PHP 制作 PHP 路由系统是可能的

原生 PHP(无 laravel) .htaccess

这显示了如何在几分钟内设置一个 php 路由系统: https://www.youtube.com/watch?v=ysnW2mRbZjE

【讨论】:

正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center。 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review

以上是关于php路由的基础[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

使用php Laravel控制器和路由器的Function()不存在错误[关闭]

路由器简单的基础实验

Laravel中的路由问题,带有多个控制器和具有相同名称的不同路由[关闭]

路由基础学习笔记之OSPF建立和路由策略

laravel路由基础说明

路由器常用基础操作命令