在路由器类Slim Framework 3中的构造函数中使用Request,Response

时间:2017-01-04 06:34:07

标签: php slim

我正在为我的应用程序使用Slim Framework。我正在使用路线。一切都很好。但是现在我想在Request和Response的构造函数下做一些预处理工作。

因此我不应该对班级的每个功能进行修改。就像在每个函数中获取主机和令牌一样。我正在使用中间件进行许多预处理。但我也想在类构造函数中做一些工作。当我试图在构造函数中访问请求和响应接口时,它显示错误,请告诉我在类构造函数中使用请求和响应的正确方法。我是否必须附加$ app,或者需要使用容器。

如果可以在没有中间件帮助的情况下完成,那对我来说会很棒。

use \Psr\Http\Message\ServerRequestInterface as Request;
use \Psr\Http\Message\ResponseInterface as Response;    
$app->group('/products', function() {
    new \Products($this);
});

我有一个名为Products的课程。

class Products
{
    public function __construct($app)
    {
        $app->map(['GET','POST'], '/createupdate', array($this, 'createupdate'));    
        //I want to use Request and Response here in constructor. But it is showing error. 
        $this->req_data['request_token'] = $request->getAttribute('request_token');
    }
    public function createupdate($request, $response, $args) {      
    //This is working fine.
    $this->req_data['request_token'] = $request->getAttribute('request_token');
    }
}

2 个答案:

答案 0 :(得分:0)

如果你真的想这样做,那么你可以从容器中获取请求/响应对象。

class Products
{
    public function __construct($app)
    {
        $app->map(['GET','POST'], '/createupdate', array($this, 'createupdate'));

        $request = $app->getContainer()->get('request');
        $this->req_data['request_token'] = $request->getAttribute('request_token');     
    }
// [..]
}

但是,这也不会产生太大的影响$this->req_data['request_token']几乎和$request->getAttribute('request_token');一样长,所以你应该在代码中使用它。

注意:我希望你在中间件中设置这个属性,所以它可能在这里不可用,因为首先容器会创建一个新的请求对象,第二个导致中间件不运行时php执行你的构造函数代码。

当你现在仍想在课堂上使用$this->req_data['request_token']时,你应该这样做:

$products = new \Products();

$app->group('/products', function() use ($products) {
    $products->addRoutes($this);
})->add($products); // add the class as middleware as well to set there the class attributes (__invoke function)

class Products
{
    public function addRoutes($app)
    {
        $app->map(['GET','POST'], '/createupdate', array($this, 'createupdate'));
    }

    public function __invoke($request, $response, $next) // this is middleware function
    {
        $this->req_data['request_token'] = $request->getAttribute('request_token');

        return $next($request, $response); // next in this example would be your route function like createupdate()
    }
}

答案 1 :(得分:0)

当然,您将收到错误,$request未定义。

public function __construct($app)
{
    $app->map(['GET','POST'], '/createupdate', array($this, 'createupdate'));    
    // Where does $request comes from?!
    $this->req_data['request_token'] = $request->getAttribute('request_token');
}

进行预处理的简洁方法是使用中间件。

当一个路由被调用时,会自动注入RequestResponse个对象(以及请求路由参数,如果有的话),但是当为路由创建一个类时,它不是自动将这些实例注入构造函数,因此它们不可用"突然出现"。

如果你有预处理,我会坚持使用中间件,代码更清晰(虽然这是我的意见)。