如何通过php框架中的单个条目脚本呈现控制器操作和视图?

时间:2016-04-23 14:36:51

标签: php symfony yii

例如,在Yii Framework应用程序中,网址采用此格式

www.example.com/index.php?r=foo/bar

将脚本呈现在类actionBar()的{​​{1}}方法中。此外,此类(或其父类)实现了一个FooController方法,该方法可以呈现视图文件。 所有网址都是通过输入脚本render()处理的。

我想写自己的类,可以通过这种方式处理url。 有人可以给我一个非常基本的 ' hello world' 编写这样一个脚本的例子吗?

3 个答案:

答案 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;