需要Url Slug的功能

时间:2019-06-22 22:47:55

标签: php

现在,iam学习如何制作MVC框架,并且iam被困在路由中。我不知道如何制造弹头。

开头的数组看起来像这样


[
    "_name" => "admin",
    "_path" => "/admin/edit/{id}",
    "_controller" => "AdminController@editAction",
    "_method" => "GET"

]

当这样调用Url时:http://localhost/admin/edit/1

Array看起来像这样


[
    "_name" => "admin",
    "_path" => "/admin/edit/{id}",
    "_controller" => "AdminController@editAction",
    "_method" => "GET",
    "_params" => [
           "id" => 1
     ]

]

现在,我要检查_path的一部分是否等于请求的网址,然后获取Slug并将其发送给RouteCollection类


public static function match($uri)  {
        $hasPath = false;
        $route = RouteCollection::getRoute();
        foreach($route as $i):
            if(strpos($i['_path'], $uri) !== false):
                preg_replace_callback("#\{(\w++)(<.*?>)?(\?[^\}]*+)?\}#", function($mm) {                           
                    RouteCollection::setParams($mm[1], ???); // $mm[1] = placeholder without {}
                }, $i['_path']);
            endif;
        endforeach;
    }

但是我怎么能说(管理/编辑)后面的所有内容都显示为正确的子弹

1 个答案:

答案 0 :(得分:0)

我想我找到了解决此代码问题的方法,可以将段塞及其值保存在路由数组中


public static function generate($uri) {

        $routes = RouteCollection::getRoute();
        self::$uri = $uri;
        self::$breakedParam = explode("-", $uri);    

        self::$name = explode("/", self::$breakedParam[0]);

        if($uri == "/"):
            self::$name = "app";
        else:
            self::$name = self::$name[1];
        endif;

        if(\array_key_exists(self::$name, $routes)):
            $routeUri = explode("-", $routes[self::$name]['_path']);
            // Check for slug   
            \preg_replace_callback("#\{(\w++)(<.*?>)?(\?[^\}]*+)?\}#", function($m){
                    //Check if breakedParam has the Key and add value to Array
                    if(\array_key_exists(self::$integer, self::$breakedParam)):
                        self::$params[$m[1]] = self::$breakedParam[self::$integer];

                        self::$integer++;
                        RouteCollection::setParams(self::$name, self::$params);
                    endif;
            }, $routes[self::$name]["_path"]);
        else:
            echo "existirt nicht";
        endif;
    }

这不是我相信的完美方式,但它现在可以正常使用

如果您有更好的方法向思想家开放