使用withAttribute的PHP Slim框架请求错误
我只是尝试从middileware身份验证函数传递用户名使用withAttribute的PHP Slim框架请求错误,php,slim,Php,Slim,我只是尝试从middileware身份验证函数传递用户名 $request->withAttribute('username','XXXXXX'); return $next($request, $response); 但我无法使用访问此用户名 $request->getAttribute('username'); 我找到了一个解决方案,它只有在我这样添加时才起作用 return $next($request->withAttribute('username','XXXX
$request->withAttribute('username','XXXXXX');
return $next($request, $response);
但我无法使用访问此用户名
$request->getAttribute('username');
我找到了一个解决方案,它只有在我这样添加时才起作用
return $next($request->withAttribute('username','XXXXXX'), $response);
原因是什么?请帮帮我。我需要传递多个参数。我该怎么办?
with attributes
不会更改此
对象的状态
出于测试目的,在slim fork中,将上述代码更改为如下所示
/*
* Slim/Http/Request.php
*/
public function withAttribute($name, $value)
{
$this->attributes->set($name, $value);
return $this;
}
然后返回$next($request,$response)代码>将按预期工作
withAttributes
不会更改此对象的状态
出于测试目的,在slim fork中,将上述代码更改为如下所示
/*
* Slim/Http/Request.php
*/
public function withAttribute($name, $value)
{
$this->attributes->set($name, $value);
return $this;
}
然后返回$next($request,$response)代码>将按预期工作
请求和响应对象是。这意味着withAttribute()
将返回$request
对象的新副本。您需要返回新对象,而不是原始对象
$request = $request->withAttribute('username','XXXXXX');
return $next($request, $response);
请求和响应对象是。这意味着withAttribute()
将返回$request
对象的新副本。您需要返回新对象,而不是原始对象
$request = $request->withAttribute('username','XXXXXX');
return $next($request, $response);
我以前没有使用过slim,但是观察了$request
对象前后的状态,调用withAttribute(arg1,arg2)
。可能$request->withAttribute('foo','bar')返回一个新对象,而不是更改$request
的状态。我以前没有使用slim,但观察$request
对象前后的状态,调用withAttribute(arg1,arg2)
。可能$request->withAttribute('foo','bar')返回一个新对象,而不是更改$request
的状态。这个答案在很多方面都是错误的。您不应该修改框架源代码。因为答案无法识别请求是不可变的,所以被否决,包括一段代码片段,清楚地演示了请求的不可变行为,指向源代码的链接,其中DocBlock描述了请求的不可变性和方法的预期行为,并建议修改核心框架代码(这样做会破坏不变性,不再尊重Psr\Http\Message\ServerRequestInterface接口)。这是一个非常糟糕、无知和危险的建议。Mika Tuupola的答案是正确的,应该是公认的答案。嘿,当然我不建议更改框架核心。我只是想说明事情是如何以及为什么以这种方式工作的,我没有改变任何框架代码。我可以理解这种情况并更改代码,如$request=$request->withAttribute('username','xxx');。然后我可以添加多个参数。这个答案在很多方面都是错误的。您不应该修改框架源代码。因为答案无法识别请求是不可变的,所以被否决,包括一段代码片段,清楚地演示了请求的不可变行为,指向源代码的链接,其中DocBlock描述了请求的不可变性和方法的预期行为,并建议修改核心框架代码(这样做会破坏不变性,不再尊重Psr\Http\Message\ServerRequestInterface接口)。这是一个非常糟糕、无知和危险的建议。Mika Tuupola的答案是正确的,应该是公认的答案。嘿,当然我不建议更改框架核心。我只是想说明事情是如何以及为什么以这种方式工作的,我没有改变任何框架代码。我可以理解这种情况并更改代码,如$request=$request->withAttribute('username','xxx');。然后我可以添加多个参数
$request = $request->withAttribute('username','XXXXXX');
return $next($request, $response);