首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Aura路由器与Aura调度员

使用Aura路由器与Aura调度员
EN

Stack Overflow用户
提问于 2019-12-26 05:31:25
回答 1查看 243关注 0票数 1

有没有使用Aura路由器和dispatcher的示例/教程?我在文档页面上找到了一个示例代码:

代码语言:javascript
复制
// dispatch the request to the route handler.
// (consider using https://github.com/auraphp/Aura.Dispatcher
// in place of the one callable below.)
$callable = $route->handler;
$response = $callable($request);

// emit the response
foreach ($response->getHeaders() as $name => $values) {
    foreach ($values as $value) {
        header(sprintf('%s: %s', $name, $value), false);
    }
}
http_response_code($response->getStatusCode());
echo $response->getBody();

我想知道如何将Aura调度程序与这个示例代码集成。

第二个问题是,当我们想要使用Aura路由器检索GET请求时,我们使用如下所示:

代码语言:javascript
复制
// add a route to the map, and a handler for it
$map->get('blog.read', '/blog/{id}', function ($request) {
    $id = (int) $request->getAttribute('id');
    $response = new Zend\Diactoros\Response();
    $response->getBody()->write("You asked for blog entry {$id}.");
    return $response;
});

邮政法怎么样?我尝试了以下代码,但它不能以类似的方式检索名字:

代码语言:javascript
复制
$map->post('profile', '/profile', function ($request) {
    $firstname = $request->getAttribute('firstname');

    $response = new Zend\Diactoros\Response();
    $response->getBody()->write("first name is {$firstname}");
    return $response;
});

输出缺少$firstname值:

代码语言:javascript
复制
first name is 
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-27 06:54:59

有多种方法可以使用Aura.Dispatcher。下面提供的例子是一种方法。

代码语言:javascript
复制
$route = $matcher->match($request);

因此,一旦您匹配请求,就可以有一个路由或null。

如果有一条路线,你可以得到$route->handler;。这可以是可调用的,也可以是字符串。

是您的实现告诉了如何调用调度程序。来自https://gist.github.com/harikt/8671136

代码语言:javascript
复制
    <?php
require dirname(__DIR__) . '/vendor/autoload.php';

use Aura\Dispatcher\Dispatcher;
use Aura\Router\RouterContainer;
use Zend\Diactoros\Response;
use Zend\Diactoros\ServerRequest;

class Blog
{   
    public function browse(ServerRequest $request)
    {
        $response = new Response();
        $response->getBody()->write("Browse all posts!");

        return $response;
    }

    public function read(ServerRequest $request, $id)
    {
        $id = (int) $request->getAttribute('id');
        $response = new Response();
        $response->getBody()->write("Read blog entry $id");

        return $response;
    }

    public function edit(ServerRequest $request, $id)
    {
        $response = new Response();
        $response->getBody()->write("Edit blog entry $id");

        return $response;
    }
}

$dispatcher = new Dispatcher;
$dispatcher->setObjectParam('controller');
$dispatcher->setMethodParam('action');
$dispatcher->setObject('blog', new Blog());

$routerContainer = new RouterContainer();
$map = $routerContainer->getMap();

// NB : You can use @ sign as in Laravel. So blog@browse
$map->get('blog.browse', '/blog', 'blog::browse');
$map->get('blog.read', '/blog/{id}', 'blog::read');

$request = Zend\Diactoros\ServerRequestFactory::fromGlobals(
    $_SERVER,
    $_GET,
    $_POST,
    $_COOKIE,
    $_FILES
);
$matcher = $routerContainer->getMatcher();
$route = $matcher->match($request);

if ($route) {
    foreach ($route->attributes as $key => $val) {
        $request = $request->withAttribute($key, $val);
    }
    // Take special attention, how I am using the handler.
    // Do what you want with the handler
    list($controller, $action) = explode('::', $route->handler);

    $params = [
        'controller' => $controller,
        'action' => $action,
        'request' => $request,
        // This is not needed, just showing for demo purpose
        'id' => $request->getAttribute('id'),
    ];

    $response = $dispatcher($params);

    // emit the response
    foreach ($response->getHeaders() as $name => $values) {
        foreach ($values as $value) {
            header(sprintf('%s: %s', $name, $value), false);
        }
    }
    http_response_code($response->getStatusCode());
    echo $response->getBody();
} else {
    echo "No route found";
}

我再说一遍这不是唯一的办法。还有其他更好的方法,如果你真的有兴趣了解更多知识,可以阅读内核

关于你关于从岗位上获得价值的问题。没有别的办法了。路由器不处理POST值。我认为PSR-7可能会在这些领域有所改善:-)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59484197

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档