symfony的url paser如何运作?

时间:2016-10-15 18:54:53

标签: symfony routing

有人可以解释一下吗? 我的意思是symfony如何知道这个网址/blogs/blog-title = /blogs/{title} 它是如何解析routing.yml中的网址并发现blog-title是网址的动态参数!!

2 个答案:

答案 0 :(得分:2)

这确实需要几步。我写了一些示例代码,只是解释了一下。 不是功能代码

首先要将路径分解为片段:

data = [{"thisFieldname":"item-company-   1","thisFieldHTML":"\n\t\t\t\t\t<div class=\"new-company-field field-item\">\n\t\t\t\t\t\t<div class=\"fake-data\">\n\t\t\t\t\t\t\tCompany\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t<div class=\"ui-resizable-handle ui-resizable-e\" style=\"z-index: 90; display: block;\"></div><div class=\"ui-resizable-handle ui-resizable-s\" style=\"z-index: 90; display: block;\"></div><div class=\"ui-resizable-handle ui-resizable-se ui-icon ui-icon-gripsmall-diagonal-se\" style=\"z-index: 90; display: block;\"></div>","dataFieldName":"item-company-1","locationIndex":"0","locationLeft":"427.891px","locationTop":"88.5625px","itemWidth":"100px","itemHeight":"34px","fieldRole":"","fieldDefault":"","fieldTooltip":"","fieldValidationRule":"","fieldValidationCharSet":"","fieldValidationDateFormat":"","fieldDisplayFormat":"","fieldValidationCountry":"","fieldValidationMaxLen":"","fieldValidationMinVal":"","fieldValidationMaxVal":"","fieldValidationRegExp":"","fieldValidationFormula":"","fieldValidationErrMsg":"","valid":"","condition-field":"","condition-type":"","condition-value-select":"","fontName":"","fontSize":"","fontAlign":"","fieldColorPicker":"","fieldRequired":"false","fieldReadOnly":"false","fieldMasked":"false","fieldMultiline":"false"}];



data = JSON.parse(JSON.stringify([{"thisFieldname":"item-company-   1","thisFieldHTML":"\n\t\t\t\t\t<div class=\"new-company-field field-item\">\n\t\t\t\t\t\t<div class=\"fake-data\">\n\t\t\t\t\t\t\tCompany\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t<div class=\"ui-resizable-handle ui-resizable-e\" style=\"z-index: 90; display: block;\"></div><div class=\"ui-resizable-handle ui-resizable-s\" style=\"z-index: 90; display: block;\"></div><div class=\"ui-resizable-handle ui-resizable-se ui-icon ui-icon-gripsmall-diagonal-se\" style=\"z-index: 90; display: block;\"></div>","dataFieldName":"item-company-1","locationIndex":"0","locationLeft":"427.891px","locationTop":"88.5625px","itemWidth":"100px","itemHeight":"34px","fieldRole":"","fieldDefault":"","fieldTooltip":"","fieldValidationRule":"","fieldValidationCharSet":"","fieldValidationDateFormat":"","fieldDisplayFormat":"","fieldValidationCountry":"","fieldValidationMaxLen":"","fieldValidationMinVal":"","fieldValidationMaxVal":"","fieldValidationRegExp":"","fieldValidationFormula":"","fieldValidationErrMsg":"","valid":"","condition-field":"","condition-type":"","condition-value-select":"","fontName":"","fontSize":"","fontAlign":"","fieldColorPicker":"","fieldRequired":"false","fieldReadOnly":"false","fieldMasked":"false","fieldMultiline":"false"}]));

$ _SERVER超全局附带的REQUEST_URI也是如此:

$route = '/blogs/{title}';
$routeArray = explode('/', $route);

现在我们必须按元素比较两个数组的元素:

$requestArray = explode('/', $_SERVER['REQUEST_URI']);
如果'blogs'以'{'开头,或者'blogs'与'blogs'相同,

首次运行for循环进行比较。

如果'{title}'以'{'开头,或者'{title}'与'blog-title'相同,

for循环的第二次运行会进行比较。

除此之外,Symfony路由器还会检查REQUEST_METHOD是否有效。例如GET,POST,PUT,DELETE。

答案 1 :(得分:0)

Hi Slimen我希望我的回答能帮到你:

执行此任务的是路由器组件。

当您尝试访问应用程序的网页时:

内核要求路由器组件解析routing.yml文件。因此,路由器将尝试将当前URL与routing.yml中定义的路由匹配。

当路由器匹配routing.yml中的路由定义时,他将尝试查找此路由的参数(...要执行的控制器以及要执行的控制器的参数(如newsId或userId等参数)等))。

当路由器解析了routing.yml中的路由定义时,他会将收集的信息提供给内核。

现在内核知道要执行哪个控制器以及给该控制器提供哪些参数。