如何获取URI的特定部分?
How to get specific part of URI?
标题有点误导。让我用一个例子更好地解释:
假设我有这样一个 URI:localhost/api/user/method/5
。
URI 由以下部分组成:
[0]
=> localhost: 服务器基本路径
[1]
=> api: 应用程序基路径
[2]
=> user: 表示用户控制器
[3]
=> getUser: 表示方法getUser
[4]
=> 5: 是参数
我想做的是创建 user.php
文件控制器中可用的 class User
实例,调用 [=] 中可用的函数 getUser
27=]控制器并传递参数5
。所以应该是这样的(示例代码):
$Class = ucfirst("user");
// create an instance
$ctr = new $Class();
// and call the requested function
$ctr->$func(); //$func should be valorized with getUser in this case
现在我已经创建了一个 class 这是一个简单的 router
系统。
<?php
class Route
{
/**
* @var array $_listUri List of URI's to match against
*/
private $_listUri = array();
/**
* @var array $_listCall List of closures to call
*/
private $_listCall = array();
/**
* @var string $_trim Class-wide items to clean
*/
private $_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
*/
public function add($uri, $function)
{
$uri = trim($uri, $this->_trim);
$this->_listUri[] = $uri;
$this->_listCall[] = $function;
}
// submit - Looks for a match for the URI and runs the related function
public function submit()
{
$uri = isset($_REQUEST['uri']) ? $_REQUEST['uri'] : '/';
$uri = trim($uri, $this->_trim);
$replacementValues = array();
// List through the stored URI's
foreach ($this->_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($this->_listCall[$listKey], $replacementValues);
}
}
}
}
我想要实现的是将基本url路径作为[2] => user
并将其保存为控制器,[3] index
应该用作在控制器上指示的功能, 而 [4] index
应该是参数,注意: [4] index
可以是一个可选参数。实际上 class 简单的工作如下:
$route->add('/user/.+', function($name) {
echo "Name $name";
});
$route->submit();
因此,如果用户在浏览器中插入此 URI:
localhost/api/user/5
将打印:
Name 5
如何实现上面解释的逻辑?
更新 - 使用一些参数调用函数
$controller = $realUri[0]; 'Contains the controller to load
$func = $this->_listCall[$listKey]; 'contains the function to load
include dirname(dirname(__DIR__)) . "/application/controllers/" .
$controller . ".php" ;
$Class = ucfirst($controller);
$ctr = new $Class();
//$ctr->$func($replacementValues);
变量$replacementValues
是这样的:
array(2) { [0]=> string(1) "5" [1]=> string(1) "9" }
并包含在url中传递的所有参数:
localhost/api/user/method/5/9
那么如何将所有这些参数传递给函数$func()
?
$url = "http://localhost:80/api/user/method/5";
$parsedUrl = parse_url($url);
var_dump($parsedUrl);
将打印
array(4) {
["scheme"]=>
string(4) "http"
["host"]=>
string(9) "localhost"
["port"]=>
int(80)
["path"]=>
string(18) "/api/user/method/5"
}
现在按照你的意愿分解你的路径非常简单:
if (!empty($parsedUrl['path'])) {
$patg = explode('/',$parsedUrl['path']);
}
标题有点误导。让我用一个例子更好地解释:
假设我有这样一个 URI:localhost/api/user/method/5
。
URI 由以下部分组成:
[0]
=> localhost: 服务器基本路径
[1]
=> api: 应用程序基路径
[2]
=> user: 表示用户控制器
[3]
=> getUser: 表示方法getUser
[4]
=> 5: 是参数
我想做的是创建 user.php
文件控制器中可用的 class User
实例,调用 [=] 中可用的函数 getUser
27=]控制器并传递参数5
。所以应该是这样的(示例代码):
$Class = ucfirst("user");
// create an instance
$ctr = new $Class();
// and call the requested function
$ctr->$func(); //$func should be valorized with getUser in this case
现在我已经创建了一个 class 这是一个简单的 router
系统。
<?php
class Route
{
/**
* @var array $_listUri List of URI's to match against
*/
private $_listUri = array();
/**
* @var array $_listCall List of closures to call
*/
private $_listCall = array();
/**
* @var string $_trim Class-wide items to clean
*/
private $_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
*/
public function add($uri, $function)
{
$uri = trim($uri, $this->_trim);
$this->_listUri[] = $uri;
$this->_listCall[] = $function;
}
// submit - Looks for a match for the URI and runs the related function
public function submit()
{
$uri = isset($_REQUEST['uri']) ? $_REQUEST['uri'] : '/';
$uri = trim($uri, $this->_trim);
$replacementValues = array();
// List through the stored URI's
foreach ($this->_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($this->_listCall[$listKey], $replacementValues);
}
}
}
}
我想要实现的是将基本url路径作为[2] => user
并将其保存为控制器,[3] index
应该用作在控制器上指示的功能, 而 [4] index
应该是参数,注意: [4] index
可以是一个可选参数。实际上 class 简单的工作如下:
$route->add('/user/.+', function($name) {
echo "Name $name";
});
$route->submit();
因此,如果用户在浏览器中插入此 URI:
localhost/api/user/5
将打印:
Name 5
如何实现上面解释的逻辑?
更新 - 使用一些参数调用函数
$controller = $realUri[0]; 'Contains the controller to load
$func = $this->_listCall[$listKey]; 'contains the function to load
include dirname(dirname(__DIR__)) . "/application/controllers/" .
$controller . ".php" ;
$Class = ucfirst($controller);
$ctr = new $Class();
//$ctr->$func($replacementValues);
变量$replacementValues
是这样的:
array(2) { [0]=> string(1) "5" [1]=> string(1) "9" }
并包含在url中传递的所有参数:
localhost/api/user/method/5/9
那么如何将所有这些参数传递给函数$func()
?
$url = "http://localhost:80/api/user/method/5";
$parsedUrl = parse_url($url);
var_dump($parsedUrl);
将打印
array(4) {
["scheme"]=>
string(4) "http"
["host"]=>
string(9) "localhost"
["port"]=>
int(80)
["path"]=>
string(18) "/api/user/method/5"
}
现在按照你的意愿分解你的路径非常简单:
if (!empty($parsedUrl['path'])) {
$patg = explode('/',$parsedUrl['path']);
}