PHP函数从路由获取url

时间:2017-06-30 14:47:55

标签: php routes

我有这堂课:

class Route
{
    protected $routes = [
        "view_article" => "view/{articleUrl}",
        "edit_article" => "edit/{articleId}"
    ];
}

如何创建一个返回url替换括号内的内容的函数? 例如,如果我使用此代码:

$route->getUrl('view_article', 'first-article');

它应该返回:view/first-article

3 个答案:

答案 0 :(得分:0)

function getUrl($key, $value){
   $value = preg_replace('/[\[{\(].*[\]}\)]/U' , $value, $this->routes[$key]);
   return $value;
}

答案 1 :(得分:0)

然后你应该创建一个返回变量的函数?

class Route {
    function getUrl($find, $replace) {
        $entry = isset($this->routes[$find]) ? $this->routes[$find]: false; 
        if($entry) {
            return str_replace(sprintf('{%s}', $find), $replace, $entry);
        } else {
            return return false;
        }
    }
}
这样的事情。

答案 2 :(得分:0)

这里有几个解决方案:

下面的

getUrl将接受路由名称作为第一个参数,然后用随后的变量替换任何占位符。不是最好的解决方案 - 您可能有太多或太少的变量。使用IDE时,不会有参数提示。

class Route
{
    protected $routes = [
        "view_article" => "view/{articleUrl}",
        "edit_article" => "edit/{articleId}",
        "view_page" => "view/{articleId}/{pageName}"
    ];

    public function getUrl() {
        $arg_list = func_get_args();
        $route = $this->routes[$arg_list[0]];
        unset($arg_list[0]);
        foreach($arg_list as $arg) {
            $route = preg_replace('/{[^\}]+}/', $arg, $route, 1);
        }
        return $route;
    }
}
$route = new Route();
var_dump($route->getUrl('view_page', '17', 'hello_world')); //'view/17/hello_world'

另一种方法是使用一组参数和str_replace key =>值对:

class Route
{
    protected $routes = [
        "view_article" => "view/{articleUrl}",
        "edit_article" => "edit/{articleId}",
        "view_page" => "view/{articleId}/{pageName}"
    ];

    public function getUrl($routeName, $args) {

        $route = $this->routes[$routeName];
        foreach($args as $key => $value) {
            $route = str_replace(sprintf('{%s}', $key), $value, $route);
        }
        return $route;
    }
}
$route = new Route();
var_dump($route->getUrl('view_page', ['articleId' => 17, 'pageName' => 'hello_world'])); //'view/17/hello_world'

在这两种情况下,请务必包含其他检查(路径存在,所有变量已被替换等)。