2015-08-17 17:00:26 -07:00
< ? php
/*
* This file is part of the Symfony package .
*
* ( c ) Fabien Potencier < fabien @ symfony . com >
*
* For the full copyright and license information , please view the LICENSE
* file that was distributed with this source code .
*/
namespace Symfony\Component\HttpFoundation ;
/**
* StreamedResponse represents a streamed HTTP response .
*
* A StreamedResponse uses a callback for its content .
*
* The callback should use the standard PHP functions like echo
2018-11-23 12:29:20 +00:00
* to stream the response back to the client . The flush () function
2015-08-17 17:00:26 -07:00
* can also be used if needed .
*
* @ see flush ()
*
* @ author Fabien Potencier < fabien @ symfony . com >
*/
class StreamedResponse extends Response
{
protected $callback ;
protected $streamed ;
2017-02-02 16:28:38 -08:00
private $headersSent ;
2015-08-17 17:00:26 -07:00
/**
* @ param callable | null $callback A valid PHP callback or null to set it later
* @ param int $status The response status code
* @ param array $headers An array of response headers
*/
2018-11-23 12:29:20 +00:00
public function __construct ( callable $callback = null , $status = 200 , $headers = array ())
2015-08-17 17:00:26 -07:00
{
parent :: __construct ( null , $status , $headers );
if ( null !== $callback ) {
$this -> setCallback ( $callback );
}
$this -> streamed = false ;
2017-02-02 16:28:38 -08:00
$this -> headersSent = false ;
2015-08-17 17:00:26 -07:00
}
/**
2015-10-08 11:40:12 -07:00
* Factory method for chainability .
2015-08-17 17:00:26 -07:00
*
* @ param callable | null $callback A valid PHP callback or null to set it later
* @ param int $status The response status code
* @ param array $headers An array of response headers
*
2017-02-02 16:28:38 -08:00
* @ return static
2015-08-17 17:00:26 -07:00
*/
public static function create ( $callback = null , $status = 200 , $headers = array ())
{
return new static ( $callback , $status , $headers );
}
/**
* Sets the PHP callback associated with this Response .
*
* @ param callable $callback A valid PHP callback
*
2018-11-23 12:29:20 +00:00
* @ return $this
2015-08-17 17:00:26 -07:00
*/
2018-11-23 12:29:20 +00:00
public function setCallback ( callable $callback )
2015-08-17 17:00:26 -07:00
{
$this -> callback = $callback ;
2018-11-23 12:29:20 +00:00
return $this ;
2015-08-17 17:00:26 -07:00
}
2017-02-02 16:28:38 -08:00
/**
* { @ inheritdoc }
*
* This method only sends the headers once .
2018-11-23 12:29:20 +00:00
*
* @ return $this
2017-02-02 16:28:38 -08:00
*/
public function sendHeaders ()
{
if ( $this -> headersSent ) {
2018-11-23 12:29:20 +00:00
return $this ;
2017-02-02 16:28:38 -08:00
}
$this -> headersSent = true ;
2018-11-23 12:29:20 +00:00
return parent :: sendHeaders ();
2017-02-02 16:28:38 -08:00
}
2015-08-17 17:00:26 -07:00
/**
* { @ inheritdoc }
*
* This method only sends the content once .
2018-11-23 12:29:20 +00:00
*
* @ return $this
2015-08-17 17:00:26 -07:00
*/
public function sendContent ()
{
if ( $this -> streamed ) {
2018-11-23 12:29:20 +00:00
return $this ;
2015-08-17 17:00:26 -07:00
}
$this -> streamed = true ;
if ( null === $this -> callback ) {
throw new \LogicException ( 'The Response callback must not be null.' );
}
2018-11-23 12:29:20 +00:00
\call_user_func ( $this -> callback );
return $this ;
2015-08-17 17:00:26 -07:00
}
/**
* { @ inheritdoc }
*
* @ throws \LogicException when the content is not null
2018-11-23 12:29:20 +00:00
*
* @ return $this
2015-08-17 17:00:26 -07:00
*/
public function setContent ( $content )
{
if ( null !== $content ) {
throw new \LogicException ( 'The content cannot be set on a StreamedResponse instance.' );
}
2018-11-23 12:29:20 +00:00
$this -> streamed = true ;
return $this ;
2015-08-17 17:00:26 -07:00
}
/**
* { @ inheritdoc }
*
* @ return false
*/
public function getContent ()
{
return false ;
}
}