2017-02-10 2 views
0

Ich versuche einfach Benutzernamen Funktion middileware AuthPHP Schlanke Rahmen Anfrage mit withAttribute Fehler

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

passieren Aber ich kann nicht diesen Benutzernamen zugreifen

$request->getAttribute('username'); 

mit fand ich eine Lösung, die seine einzige funktionierende wenn ich so füge

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

Was ist der Grund? Bitte hilf mir. Ich muss mehrere Argumente übergeben. Was soll ich machen?

+0

Ich habe nicht schlank vor, aber beobachten Sie den Zustand von $ Request-Objekt vor und nach dem Aufruf von 'withAttribute (arg1, arg2)'. möglicherweise gibt $ request-> withAttribute ('foo', 'bar') ein neues Objekt zurück, anstatt den Status von $ request zu ändern. – marmeladze

Antwort

-1

withAttributes ändert nicht den Zustand von this Objekt.

Excerpt from relevant source code

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

Zu Testzwecken in Ihrer schlanken Gabel, ändern, wie dies oben Code.

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

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

Dann return $next($request, $response); funktionieren wie erwartet.

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

    ?> 

Ergebnis:

object(Book)#1 (2) { 
    ["price"]=> 
    int(25) 
    ["title"]=> 
    string(10) "Peter Pan" 
} 
object(CopyBook)#2 (2) { 
    ["price"]=> 
    NULL 
    ["title"]=> 
    NULL 
} 
+1

Diese Antwort ist in vielerlei Hinsicht falsch. Sie sollten die Framework-Quelle nicht ändern. –

+0

Downvoted, da die Antwort nicht erkennt, dass Request unveränderlich ist, enthält ein Code-Snippet, das eindeutig das unveränderliche Verhalten von Request darstellt, Links zur Quelle, in der der DocBlock die Unveränderbarkeit von Request und das erwartete Verhalten der Methode beschreibt, und empfiehlt, den Framework-Code zu ändern (wodurch die Unveränderbarkeit durchbrochen wird und die Schnittstelle Psr \ Http \ Message \ ServerRequestInterface nicht mehr berücksichtigt wird). Dies ist ein sehr schlechter, uninformierter und gefährlicher Ratschlag. Mika Tuupolas Antwort ist richtig und sollte die akzeptierte Antwort sein. –

+0

Diese Antwort ist so seltsam, ich werde es aufwerten. –

4

Anfrage und Antwort Objekte immutable sind. Dies bedeutet, dass withAttribute() eine neue Kopie des Objekts $request zurückgibt. Sie müssen das neue Objekt nicht das ursprüngliche Objekt zurückgeben.

Verwandte Themen