2016-10-25 5 views
3

Ich kann Antwort Körper in Slim V3 nicht erhalten und es ist immer leer. Mein Code ist:Wie ändere ich den schlanken v3 Response Body vor und nach der Ausführung der Route?

<?php 

use \Psr\Http\Message\ServerRequestInterface as Request; 
use \Psr\Http\Message\ResponseInterface as Response; 
use \Slim\App as Slim; 

require 'vendor/autoload.php'; 

$config['determineRouteBeforeAppMiddleware'] = true; 

$app = new Slim(['settings' => $config]); 

$mw = (function (Request $request, Response $response, callable $next) { 
    $response = $response->withStatus(200)->write(' before '); 
    $response = $next($request, $response); 
    $body = $response->getBody()->getContents(); 
    $response = $response->withJson(array('data' => $body)); // output should be {"data":" Hello, User seq1 seq2 "} 
    return $response; 
}); 

$mw1 = (function (Request $request, Response $response, callable $next) { 
    $response = $next($request, $response); 
    $response = $response->withStatus(200)->write(' seq1 '); 
    return $response; 
}); 

$mw2 = (function (Request $request, Response $response, callable $next) { 
    $response = $next($request, $response); 
    $response->withStatus(200)->write(' seq2 '); 
    return $response; 

}); 

$app->add($mw); 

$app->get('/hello/{name}', function (Request $request, Response $response) { 
    $name = $request->getAttribute('name'); 
    $response->getBody()->write(" Hello, $name "); 
    return $response; 
})->add($mw1)->add($mw2); 

$app->run(); 

Was möchte ich folgendes zu tun ist:

  • Ich will nicht withJson() am Ende jeder Route hinzufügen nur meine Json und Ausgabe codieren Client (Browser). Ich möchte, dass die Middleware dies für mich erledigt, nachdem (jede) Routenausführung endet.
  • Ich möchte den endgültigen Körper bekommen und es einem Array wie $ Daten ['Daten'] = $ Körper und als Json kodieren und die modifizierte Antwort zurückgeben.

P.S. Slim v2 war viel einfacher als Slim v3

+0

$ body = $ response-> getBody() -> getContents(); ... müssen Sie den Körper zurückspulen, bevor Sie den Inhalt bekommen. – geggleto

+0

Dieser $ body = $ response-> getBody() -> getContents(); gibt leere Zeichenfolge. Können Sie ein Beispiel für die Verwendung von Zurückspulen angeben? Ich habe versucht, zurückspulen, aber immer noch ohne Glück ... –

+0

Sie müssen $ response-> getBody() -> rewind(); ... dann hol den Inhalt. – geggleto

Antwort

2

Versuchen Sie, getContents() für __toString() bei der Middleware mw zu ändern. Eine weitere Änderung, die vorgenommen werden sollte, ist unter mw2: Sie müssen die neue Antwort zurückgeben.

Schauen Sie den vollständigen Code:

<?php 

use \Psr\Http\Message\ServerRequestInterface as Request; 
use \Psr\Http\Message\ResponseInterface as Response; 
use \Slim\App as Slim; 

require 'vendor/autoload.php'; 

$config['determineRouteBeforeAppMiddleware'] = true; 

$app = new Slim(['settings' => $config]); 

$mw = (function (Request $request, Response $response, callable $next) { 
    $response = $response->withStatus(200)->write(' before '); 
    $response = $next($request, $response); 
    $body = $response->getBody()->__toString(); 
    $response = $response->withJson(array('data' => $body)); // output should be {"data":" Hello, User seq1 seq2 "} 
    return $response; 
}); 

$mw1 = (function (Request $request, Response $response, callable $next) { 
    $response = $next($request, $response); 
    $response = $response->withStatus(200)->write(' seq1 '); 
    return $response; 
}); 

$mw2 = (function (Request $request, Response $response, callable $next) { 
    $response = $next($request, $response); 
    $response = $response->withStatus(200)->write(' seq2 '); 
    return $response; 

}); 

$app->add($mw); 

$app->get('/hello/{name}', function (Request $request, Response $response) { 
    $name = $request->getAttribute('name'); 
    $response->getBody()->write(" Hello, $name "); 
    return $response; 
})->add($mw1)->add($mw2); 

$app->run(); 

Ich hoffe, dass es Ihnen helfen kann.

PS: Ich ziehe Schlank 3: D

+0

Ich versuchte das gleiche __toString(), aber es funktionierte nicht. Ihr Code hat funktioniert und ich habe endlich erreicht, wonach ich gesucht habe. Danke viel Kumpel ... –

+0

Sie sollten es als Antwort dann markieren – DarkNeuron

1

Sie können auch Inhalte auf diese Weise

Methode # 1

$streamBody = $response->getBody(); 
$streamBody->rewind(); 
$content = $streamBody->getContents(); 

Methode # 2

$streamBody = $response->getBody(); 
$streamBody->rewind(); 
$content = $streamBody->read($streamBody->getSize()); 
0

erhalten Ich bin nicht in der Lage, Antwortkörper in der dünnen v3 zu erhalten und sein immer leeres.

Ich hatte das gleiche Problem und konnte nicht nur herausfinden, warum leere Körperreaktion bin immer, so endete ich json_encode($my_value) zu meiner Rückkehr Variable addieren und das war die Magie. Jetzt kann ich mit dem Kauf eines neuen Hundes fortfahren und wahrscheinlich heiraten. Hoffe, das hilft jemandem.

/** 
* method - GET 
*/ 
$app->get('/posts[/]', function ($request, $response, $args) { 
    $db = new DbHandler(); 
    // fetching all 
    $result = $db->getAllPosts(); 
    return json_encode($result); 
}); 

Und auf der anderen Seite

/** 
    * GetPosts 
    */ 
    public function getAllPosts() { 
    // Instantiate DBH 
    // make a connection to mysql here 
    $db = new PDO_Wrapper(); 
    $db->query("SELECT * FROM all_posts WHERE post_status = :Publish AND post_type = :Post ORDER BY post_date DESC"); 
    $binding_array = array(":Publish" => "publish", ":Post" => "post"); 
    $db->bindArray($binding_array); 
    $results = $db->resultset(); 
    return $results; 
    } 
} 
Verwandte Themen