前端控制器
编辑该页面前端控制器
到目前为止,我们的应用程序是简单的只有一个页面。上一点,让我们发疯说再见并添加另一个页面:
1 2 3 4 5 6 7 8 9 10
/ /框架/ bye.phprequire_once__DIR__。“/供应商/ autoload.php”;使用ob娱乐下载\组件\HttpFoundation\请求;使用ob娱乐下载\组件\HttpFoundation\响应;美元请求=请求::createFromGlobals ();美元响应=新响应(“再见!”);美元响应- >send ();
正如你所看到的,大部分的代码是完全一样的,我们写了第一页。我们提取通用代码,我们可以分享我们所有的页面之间。代码共享听起来像一个好计划创建我们的第一个“真正的”框架!
PHP的方法重构可能会创建一个包含文件:
1 2 3 4 5 6 7 8
/ /框架/ init.phprequire_once__DIR__。“/供应商/ autoload.php”;使用ob娱乐下载\组件\HttpFoundation\请求;使用ob娱乐下载\组件\HttpFoundation\响应;美元请求=请求::createFromGlobals ();美元响应=新反应();
让我们看看在行动:
1 2 3 4 5 6 7
/ /框架/ index . phprequire_once__DIR__。' / init.php ';美元的名字=美元请求- >查询- >get (“名字”,“世界”);美元响应- >setContent (sprintf (“你好% s”,:美元的名字ENT_QUOTES,“utf - 8”)));美元响应- >send ();
“再见”页面:
1 2 3 4 5
/ /框架/ bye.phprequire_once__DIR__。' / init.php ';美元响应- >setContent (“再见!”);美元响应- >send ();
我们确实大部分共享代码进入一个中心位置,但这并不觉得好抽象,不是吗?我们仍然有send ()
所有页面的方法,我们的页面不像模板,我们仍无法正常测试这段代码。
此外,添加一个新页面意味着我们需要创建一个新的PHP脚本,这是接触到最终用户的名称通过URL (http://127.0.0.1:4321 bye.php
)。有一个PHP脚本名称和客户端之间的直接映射的URL。这是因为请求的调度是由web服务器直接。这可能是一个好主意移动这个派遣我们的代码更好的灵活性。这可以通过将所有的客户机请求路由到一个PHP脚本。
提示
揭露一个PHP脚本给最终用户是一个设计模式被称为“前端控制器”。
这种脚本的样子如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21日22日23日
/ /框架/ front.phprequire_once__DIR__。“/供应商/ autoload.php”;使用ob娱乐下载\组件\HttpFoundation\请求;使用ob娱乐下载\组件\HttpFoundation\响应;美元请求=请求::createFromGlobals ();美元响应=新反应();美元地图= (' /你好'= >__DIR__。' / hello.php ',' /再见'= >__DIR__。' / bye.php ',);美元路径=美元请求- >getPathInfo ();如果(收取(美元地图(美元路径))){需要美元地图(美元路径];}其他的{美元响应- >setStatusCode (404年);美元响应- >setContent (“没有找到”);}美元响应- >send ();
例如新hello.php
脚本:
1 2 3
/ /框架/ hello.php美元的名字=美元请求- >查询- >get (“名字”,“世界”);美元响应- >setContent (sprintf (“你好% s”,:美元的名字ENT_QUOTES,“utf - 8”)));
在front.php
脚本,美元的地图
将URL路径与相应的PHP脚本的路径。
作为奖励,如果客户要求的路径中定义的URL映射,我们返回一个定制的404页。你现在控制你的网站。
访问一个页面,你现在必须使用front.php
脚本:
http://127.0.0.1:4321 front.php /喂?名字=法比安
http://127.0.0.1:4321 front.php /再见
/你好
和/再见
是页面路径。
提示
大多数web服务器,比如Apache或nginx能够重写传入的url和删除前端控制器脚本,以便用户能够类型http://127.0.0.1:4321喂?名字=法比安
,看起来好多了。
诀窍是使用要求::getPathInfo ()
方法返回请求的路径通过删除前端控制器脚本名称包括子目录(如果需要——见上图提示)。
提示
你甚至不需要设置一个web服务器来测试代码。相反,代替美元请求=请求:createFromGlobals ();
电话之类的美元请求=请求::创建(' /喂?名=法”);
参数是你想要的URL路径的模拟。
现在,web服务器总是访问相同的脚本(front.php
所有页面的),我们可以安全的代码进一步通过移动web根目录之外的所有其他PHP文件:
1 2 3 4 5 6 7 8 9 10 11
example.com├──作曲家。json├──作曲家。页面锁├──src│└──│├──你好。php│└──再见。php├──供应商│└──自动装载。php└──web└──front.php
现在,配置您的web服务器根目录指向web /
和所有其他文件将不再从客户端访问。
在浏览器中测试您的更改(http://localhost: 4321 /喂?名字=法比安
),运行ob娱乐下载Symfony本地Web服务器:
1
美元ob娱乐下载symfony服务器:开始——端口= 4321 passthru = front.php
请注意
对于这个新结构,您将需要调整一些各种PHP文件路径;这些变化是留给读者作为练习。
重复在每一页的最后一件事就是调用setContent ()
。我们可以将所有页面转换为“模板”,呼应了内容和调用setContent ()
直接从前端控制器脚本:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
/ / example.com/web/front.php/ /……美元路径=美元请求- >getPathInfo ();如果(收取(美元地图(美元路径))){ob_start ();包括美元地图(美元路径];美元响应- >setContent (ob_get_clean ());}其他的{美元响应- >setStatusCode (404年);美元响应- >setContent (“没有找到”);}/ /……
和hello.php
脚本可以被转换成一个模板:
1 2 3 4
< !——example.com/src/pages/hello.php >< ? php美元的名字=美元请求- >查询- >get (“名字”,“世界”)? >你好< ?=:美元的名字ENT_QUOTES,“utf - 8”)? >
我们的第一个版本框架:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21日22日23日24日25
/ / example.com/web/front.phprequire_once__DIR__。“/ . . /供应商/ autoload.php”;使用ob娱乐下载\组件\HttpFoundation\请求;使用ob娱乐下载\组件\HttpFoundation\响应;美元请求=请求::createFromGlobals ();美元响应=新反应();美元地图= (' /你好'= >__DIR__。“/ . . / src /页面/ hello.php”,' /再见'= >__DIR__。“/ . . / src /页面/ bye.php”,);美元路径=美元请求- >getPathInfo ();如果(收取(美元地图(美元路径))){ob_start ();包括美元地图(美元路径];美元响应- >setContent (ob_get_clean ());}其他的{美元响应- >setStatusCode (404年);美元响应- >setContent (“没有找到”);}美元响应- >send ();
添加一个新页面是一个两步的过程:在地图上添加一个条目,创建一个PHP模板src /页面/
。从一个模板,通过请求数据美元的请求
通过变量和调整响应标头美元的反应
变量。
请注意
如果你决定停止在这里,你可以提高你的框架通过提取出URL映射到一个配置文件。