Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为自己的PHP框架制作自己的参数解析器_Php_Web Services_Rest_Symfony_Symfony Http Foundation - Fatal编程技术网

为自己的PHP框架制作自己的参数解析器

为自己的PHP框架制作自己的参数解析器,php,web-services,rest,symfony,symfony-http-foundation,Php,Web Services,Rest,Symfony,Symfony Http Foundation,我决定为PHP制作自己的迷你框架,我将在现实生活中使用它,为社交应用程序创建Web服务 我开始学习Fabien Povertier的指南,在Symfony的组件之上创建您自己的框架-。 我非常喜欢他的类加载器和http基础库,并决定将它们集成起来 我阅读了整个教程,但我决定停止集成Symfony的组件,直到教程的第5部分,在第5部分中,他开始使用Symfony http内核、路由匹配器和控制器解析器(不包括这些) 有我的框架的前端控制器和路由映射器文件存在问题 php(前端控制器) 我现在想知道

我决定为PHP制作自己的迷你框架,我将在现实生活中使用它,为社交应用程序创建Web服务

我开始学习Fabien Povertier的指南,在Symfony的组件之上创建您自己的框架-。 我非常喜欢他的类加载器和http基础库,并决定将它们集成起来

我阅读了整个教程,但我决定停止集成Symfony的组件,直到教程的第5部分,在第5部分中,他开始使用Symfony http内核、路由匹配器和控制器解析器(不包括这些)

有我的框架的前端控制器和路由映射器文件存在问题

php(前端控制器)

我现在想知道的是,在不进一步使用Symfony的组件的情况下,我该如何做这样的事情:

在我的路由文件中,我想添加一个类似“/hello”的URL,其中包含Controller-hello Controller和参数name、age、gender,这些参数将对应于浏览器中的请求GET www.base/hello/samuel/11/male

在HelloController中有一个索引($name,$age,$gender){…}。我曾尝试查看Symfony的源代码,但到目前为止我一直没有找到它(我花了很多时间浏览库的源代码)。我将进一步模块化和分离前控制器和控制器的功能,但我想把它写下来


啊,还有关于进一步构建我的框架的任何建议都是受欢迎的(我正在为一个类似REST的web服务创建一个框架,它需要具有可扩展性和快速性,并且每秒可能处理数万个请求)。

您必须为路由定义正则表达式,并将它们与请求相匹配,如果您想知道Symfony如何将自己的路由格式(例如:“/path/to/{id}”转换为正则表达式,请参阅::compilePattern。这超出了这个问题的范围,我不会提供任何代码

示例路由的正则表达式类似于
^/hello/(\w*)/(\d*)/(\w*)/$
,它将匹配“/hello/any string/any number/any string/”,例如:
/hello/samuel/11/male
(不要忘记
^
$
,它们匹配字符串的开头和结尾)

您必须为每个路由提供一个正则表达式,并对所有路由执行
preg_匹配(rawurldecode($request->getPathInfo(),$regex/*如前面创建的那样*/,$matches)
,而不是
isset($sitemap[$path])
如果返回false,则路由不匹配。否则,必须获取控制器的参数,如下所示:

preg_match(rawurldecode($request->getPathInfo(), $regex /* as created earlier*/, $matches)
$args = array();
// we omit the first element of $matches, since it's the full string for the match
for($i = 1; $i < count($matches); $i++){
  $args[] = $matches[$i];
}
preg_match(rawurldecode($request->getPathInfo(),$regex/*如前面创建的*/,$matches)
$args=array();
//我们省略$matches的第一个元素,因为它是匹配的完整字符串
对于($i=1;$i
现在,您可以将
$args
与默认参数合并并调用控制器



请参阅::matchCollection(),了解Symfony如何根据正则表达式匹配每个路由,以及如何构造参数。

我想添加一些附加信息。在Symfony中,您可以将请求的参数获取到方法参数中:

public function fooAction($bar);
在这种情况下,它会在
$request->attributes
中查找带有
条的键。如果该值存在,它会将该值注入到您的操作中。在Symfony 3.0及更低版本中,这是通过完成的。从Symfony 3.1开始,您将能够实现或扩展一个


使用
ArgumentResolver
意味着您可以轻松地将自己的功能添加到解析中。

感谢您提供了这个详细的答案。这正是我所需要的!非常欢迎您。希望您能如愿。
preg_match(rawurldecode($request->getPathInfo(), $regex /* as created earlier*/, $matches)
$args = array();
// we omit the first element of $matches, since it's the full string for the match
for($i = 1; $i < count($matches); $i++){
  $args[] = $matches[$i];
}
public function fooAction($bar);