Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用withAttribute的PHP Slim框架请求错误_Php_Slim - Fatal编程技术网

使用withAttribute的PHP Slim框架请求错误

使用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

我只是尝试从middileware身份验证函数传递用户名

$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);