我正在为我的应用程序使用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');
}
}
答案 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');
}
进行预处理的简洁方法是使用中间件。
当一个路由被调用时,会自动注入Request
和Response
个对象(以及请求路由参数,如果有的话),但是当为路由创建一个类时,它不是自动将这些实例注入构造函数,因此它们不可用"突然出现"。
如果你有预处理,我会坚持使用中间件,代码更清晰(虽然这是我的意见)。