例如,在Yii Framework应用程序中,网址采用此格式
www.example.com/index.php?r=foo/bar
将脚本呈现在类actionBar()
的{{1}}方法中。此外,此类(或其父类)实现了一个FooController
方法,该方法可以呈现视图文件。
所有网址都是通过输入脚本render()
处理的。
我想写自己的类,可以通过这种方式处理url。 有人可以给我一个非常基本的 ' hello world' 编写这样一个脚本的例子吗?
答案 0 :(得分:1)
这是我最近为朋友教授框架如何工作时所做的事情。这是一个基本示例,但它演示了容器如何工作,如何处理路由器,为控制器提供请求和响应以及处理重定向等。
<?php
require 'autoload.php';
$container = [];
$container['controller.elephant'] = function() {
return new Controller\Elephant();
};
$routes = [];
$routes['/babar'] = 'controller.elephant:babar';
$routes['/celeste'] = 'controller.elephant:celeste';
$request = new Request();
if (!isset($routes[$request->path()])) {
http_response_code(404);
exit;
}
$route = $routes[$request->path()];
list($class, $method) = explode(':', $route);
$controller = $container[$class]();
$response = $controller->{$method}($request, new Response());
if ($response->isRedirect()) {
http_response_code($response->status());
header('Location: '.$response->destination());
} else {
echo $response->content();
}
exit;
我不会包含更多内容(尽管还有其他文件),因为它会不必要地回答问题(如果你愿意,可以通过其他方式发送给你)。
我强烈建议您查看Slim Framework代码,因为它是一个基本上就是这样的微框架。
答案 1 :(得分:1)
我会试一试:
// index.php
$r = $_REQUEST['r']; // 'foo/bar'
$rParts = explode('/',$r);
$foo = $rParts[0];
$bar = $rParts[1];
$controller = new $foo; // foo
echo $controller->$bar();
答案 2 :(得分:0)
在Symfony文档中,您有此页面:http://symfony.com/doc/current/components/http_kernel/introduction.html
它解释了请求的生命周期如何,它只是一个流程图。
但是它会给你一个关于你应该如何建立自己的非常好的想法
如果你对基于url的内容更感兴趣,你应该阅读symfony中的RoutingComponent
http://symfony.com/doc/current/components/routing/introduction.html
http://symfony.com/doc/current/components/routing/hostname_pattern.html
但是如果你想编写自己的类,你应该使用像正则表达式组这样的东西,你可以检测到由以下分隔的url部分:&#39; /&#39;然后你以某种方式将网址映射到控制器,即关联数组&#39; Hash&#39;
someurl.com/someController/someAction
$mappings = [
...
'someController' => 'The\Controller\Class'
]
$controller = new $mappings[$urlControllerPart]();
$response = $controller->{$urlActionPart}($request);
return $response;