使用withAttribute错误的PHP Slim Framework请求

我只是尝试从middileware auth函数传递用户名</ p>

  $ request-&gt; withAttribute('username','XXXXXX'); 
return $ next($ request,$ response);
</ code> </ pre>

但我无法访问 此用户名使用</ p>

  $ request-&gt; getAttribute('username'); 
</ code> </ pre>

我找到了解决方案 只有当我这样添加</ p>

 返回$ next($ request-&gt; withAttribute('username','XXXXXX'),$ response); 
< / code> </ pre>

是什么原因? 请帮我。 我需要传递多个参数传递。 我该怎么办?</ p>
</ div>

展开原文

原文

I am just try to pass username from middileware auth function

$request->withAttribute('username','XXXXXX');
return $next($request, $response);

But i cannot access this username using

$request->getAttribute('username');

I found a solution that its working only when i add like this

 return $next($request->withAttribute('username','XXXXXX'), $response);

What is the reason? Please help me. I need to pass multiple arguments pass. What should i do?

dongyong1897
dongyong1897 我之前没有使用过slim,但是在调用withAttribute(arg1,arg2)之前和之后观察$request对象的状态。可能$request->withAttribute('foo','bar')返回一个新对象,而不是改变$request的状态。
3 年多之前 回复

2个回答

withAttributes does not change the state of this object.

Excerpt from relevant source code

public function withAttribute($name, $value)
{
    $clone = clone $this; 
    $clone->attributes->set($name, $value);
    return $clone;
}

For testing purposes, in your slim fork, change above code as this.

/* 
* Slim/Http/Request.php 
*/
public function withAttribute($name, $value)
{

    $this->attributes->set($name, $value);
    return $this;
}

Then return $next($request, $response); will work as you expected.

Demo code for inspection

<?php 
 /* code taken from - https://www.tutorialspoint.com/php/php_object_oriented.htm*/
 class Book {

      var $price;
      var $title;


      function setPrice($par){
         $this->price = $par;
      }

      function getPrice(){
         return $this->price;
      }

      function setTitle($par){
         $this->title = $par;
      }

      function getTitle(){
         return $this->title;
      }
   }

    class CopyBook {

      var $price;
      var $title;

      function setPrice($par){
         $clone = clone $this;
         $clone->price = $par;
      }

      function getPrice(){
         return $this->price;
      }

      function setTitle($par){
         $clone = clone $this;
         $clone->title = $par;
      }

      function getTitle(){
         return $this->title;
      }
   }

   $pp = new Book;
   $pp->setTitle('Perter Pan');
   $pp->setPrice(25);

   $cpp = new CopyBook;

   $cpp->setTitle('Peter Pan');
   $cpp->setPrice(25);

   var_dump($pp);
   var_dump($cpp);

   ?>

Result:

 object(Book)#1 (2) {
  ["price"]=>
  int(25)
  ["title"]=>
  string(10) "Peter Pan"
}
object(CopyBook)#2 (2) {
  ["price"]=>
  NULL
  ["title"]=>
  NULL
}
drvvepadi289421028
drvvepadi289421028 我没有更改任何框架代码。 我可以理解这种情况并更改代码,例如$ request = $ request-> withAttribute('username','xxx');. 然后我可以添加多个参数
3 年多之前 回复
douhu2890
douhu2890 嘿,当然我不建议改变框架核心。 我只是想证明事情是如何以及为什么这样运作的。
3 年多之前 回复
dongtuo4132
dongtuo4132 这个答案很奇怪,我会赞成它。
3 年多之前 回复
dongshao1981
dongshao1981 Downvoted,因为答案未能识别Request是不可变的,包括一个清楚地演示Request的不可变行为的代码片段,指向DocBlock描述Request的不变性以及方法的预期行为的源的链接,并建议修改核心框架代码( 通过这样做,打破了不变性,不再尊重Psr \ Http \ Message \ ServerRequestInterface接口)。 这是非常糟糕,不知情和危险的建议。 Mika Tuupola的回答是正确的,应该是公认的答案。
3 年多之前 回复
dongsuoying9059
dongsuoying9059 这个答案在很多方面都是错误的。 您不应该修改框架源。
3 年多之前 回复



请求和响应对象是不可变的。 这意味着 withAttribute()</ code>将返回 $ request </ code>对象的新副本。 您需要返回新对象而不是原始对象。</ p>

  $ request = $ request-&gt; withAttribute('username','XXXXXX'); 
return $ next( $ request,$ response);
</ code> </ pre>
</ div>

展开原文

原文

Request and Response objects are immutable. This means withAttribute() will return a new copy of the $request object. You need to return the new object not the original one.

$request = $request->withAttribute('username','XXXXXX');
return $next($request, $response);

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐