【发布时间】:2017-11-10 03:01:18
【问题描述】:
我开始尝试自己的 MVC。
我的目标只是实现控制器模型和视图并将它们关联起来,但不幸的是,它朝着(小)框架方向发展。
我在根文件夹中有一个基本的 index.php,它负责路由。 (确定应该创建哪个控制器,将在新创建的控制器实例上调用哪个函数等)
我直接从 url 解析控制器、函数和变量(就像 codeigniter 正在做的那样) ex :http://baseurl/index.php{router} /User{controller}/get{function to be called}/1{variable-0}/desc{variable-1} 而不是使用 get 方法来识别它们(如 ?c=mainController&f=function_to_be_call)。
我的问题是(基于我在做什么),是否有另一种(更好的方法)来实现相同的结果?
编辑:
示例请求:http://localhost:8080/ut/User/getUser/1
输出:array(3) { ["controller"]=> string(4) "User" ["function"]=> string(7) "getUser" ["variables"]=> array(1) { [2] => 字符串(1) "1" } }
感谢您的关注。
<?php
namespace System;
class UrlParser
{
public static function parseRequest(string $url):?array
{
//default destination if nothing matches
$destination = '404';//self::$routes['index'];
//the order: controller to be loaded, function to be called and parameters etc...
$hierarchical_call = array();
//remove www : [I know its not generic]
//TODO: check base url if it contains www, don't remove www
$url = str_replace('www', '', $url);
// check for a trailer slash, if not add it
$url = substr($url, strlen($url) - 1, 1) === '/' ? $url : $url . '/';
// split url into base url and rest
$url_parts = explode(baseurl, $url);
//url has more content
if (count($url_parts) > 1) {
$rest_url = $url_parts[1];
/*add leading slash for regex, it is easier to get the string between two slashed insteadof [A-Z]*/
$rest_url = substr($rest_url, 0, 1) === '/' ? $rest_url : '/' . $rest_url;
/*
* use regex to get the first part which is between / and /
* if it is index.php than check if url parts has any other request
*/
$pattern = '/[a-zA-Z0-9_\.]+/';
preg_match_all($pattern, $rest_url, $request_parts, PREG_SET_ORDER);
/*
* PREG_PATTERN_ORDER
* Orders results so that $matches[0] is an array of full pattern matches,
* $matches[1] is an array of strings matched by the first parenthesized subpattern, and so on.
*/
for ($i = 0; $i < count($request_parts); $i += 1) {
//the requested file is determined add the remaining parts to it
if (strlen($request_parts[$i][0]) > 0 && $request_parts[$i][0] !== 'index.php') {
$hierarchical_call[] = $request_parts[$i][0];
}
}
}
return $hierarchical_call;
}
}
【问题讨论】:
标签: php url-routing