Slim 3没有回应

时间:2018-03-14 14:12:26

标签: php rest slim slim-3

所以这就是我的第一次:

$app->get('/object/{id:[0-9]+}', function ($request, $response, $args) {    
    $id = (int)$args['id'];
    $this->logger->addInfo('Get Object', array('id' => $id));
    $mapper = new ObjectMapper($this->db);
    $object = $mapper->getObjectById($id);
    return $response->withJson((array)$object);
});

效果很好,并将整个数据库对象输出为一个很好的JSON字符串。

现在我在MVC的基础上重新组织了一切,这是剩下的:

$app->get('/object/{id:[0-9]+}', ObjectController::class . ':show')->setName('object.show');

它也有效,但我没有得到任何输出。如果我在DB Object之前放置一个var_dump,但是如何从中获取JSON String?

控制器

<?php
namespace Mycomp\Controllers\Object;

use \Psr\Http\Message\ServerRequestInterface as Request;
use \Psr\Http\Message\ResponseInterface as Response;
use Interop\Container\ContainerInterface;
use Mycomp\Models\Object;

class ObjectController
{
    protected $validator;
    protected $db;
    protected $auth;
    protected $fractal;

    public function __construct(ContainerInterface $container)
    {
        $this->db = $container->get('db');
        $this->logger = $container->get('logger');
    }

    public function show(Request $request, Response $response, array $args)
    {
        $id = (int)$args['id'];

        $this->logger->addInfo('Get Object', array('id' => $id));

        $object = new Object($this->db);
        return $object->getObjectById($id);
    }
}

2 个答案:

答案 0 :(得分:3)

正如尼玛在评论中所说,你需要返回Response对象

public function show(Request $request, Response $response, array $args)
    ...  
    return $response->withJson($object->getObjectById($id));
}

答案 1 :(得分:0)

为了使Slim向客户端发送HTTP响应,路由回调必须返回Slim可以理解的一些数据。这种数据类型according to Slim documentationPSR 7 Response对象。

这很重要,因为路由回调返回的内容不一定会完全按原样发送给客户端。中间件可能会用它来吸收响应,然后再将其发送给客户端。

为此,将Slim注入到路由回调中的$response对象用于此目的。 Slim还提供了一些辅助方法,例如“ withJson”,以生成具有正确HTTP标头的正确(PSR 7)JSON响应。

因此,正如我在评论中所说,您需要返回响应对象

public function show(Request $request, Response $response, array $args)
    // Prepare what you want to return and
    // Encode output data as JSON and return a proper response using withJson method  
    return $response->withJson($object->getObjectById($id));
}