CakePHP 3 - obiekt Response

W tym artykule przyjrzymy się bliżej obiektowi Response w CakePHP. Cake\Http\Response to domyślna klasa odpowiedzi w CakePHP. Hermetyzuje szereg funkcjonalności do generowania odpowiedzi HTTP w aplikacji. Response zapewnia interfejs do wykonywania zadań związanych z odpowiedziami, takich jak: wysyłanie nagłówków do przekierowań, wysyłanie nagłówków typów zawartości, wysyłanie dowolnego nagłówka, wysyłanie treści odpowiedzi.

Obsługa typów zawartości
Można kontrolować Content-Type odpowiedzi aplikacji za pomocą metody withType(). Jeśli Twoja aplikacja musi radzić sobie z typami treści, które nie są wbudowane w Response, możesz je również zamapować za pomocą type():
// dodanie typu v-card
$this->response->type(['vcf' => 'text/v-card']);

// Ustawienie Content-Type na v-card.
$this->response = $this->response->withType('vcf');
Zwykle będziesz chciał mapować dodatkowe typy zawartości w wywołaniu zwrotnym beforeFilter() kontrolera, aby móc korzystać z funkcji automatycznego przełączania widoku elementu RequestHandlerComponent, jeśli jest używany w aplikacji. Jeśli chcesz wysłać plik jako odpowiedź do przeglądarki możesz to zrobić w następujący sposób (używając funkcji withFile).
public function sendFile($id)
{
    $file = $this->Attachments->getFile($id);
    $response = $this->response->withFile($file['path']);

    return $response;
}
Jeśli chcesz, możesz również wymusić pobranie pliku zamiast wyświetlania go w przeglądarce, określając opcje.
$response = $this->response->withFile(
    $file['path'],
    ['download' => true, 'name' => 'lorem_ipsum']
);
Można również wysłać ciąg znaków jako plik. Spójrz na przykład.
public function sendIcs()
{
    $icsString = $this->Calendars->generateIcs();
    $response = $this->response;
    $response = $response->withStringBody($icsString);
    $response = $response->withType('ics');
    $response = $response->withDownload('filename_for_download.ics');

    return $response;
}
Ustawienie nagłówków
Ustawianie nagłówków odbywa się za pomocą metody withHeader().
$response = $response->withHeader('X-Extra', 'My header');

// Ustawienie wiele nagłówków
$response = $response->withHeader('X-Extra', 'My header')->withHeader('Location', 'http://example.com');

// dodanie wartości do istniejącego nagłówka
$response = $response->withAddedHeader('Set-Cookie', 'remember_me=1');
Nagłówki nie są wysyłane, gdy są ustawione. Zamiast tego są one wstrzymane do momentu wyemitowania odpowiedzi przez Cake\Http\Server. Aby ustawić ciąg znaków jako treść odpowiedzi należy użyć poniższego kodu.
$response = $response->withStringBody('My Body');

// odpowiedź json
$response = $response->withType('application/json')->withStringBody(json_encode(['Foo' => 'bar']));
Więcej na temat obiektu Response można znaleźć w dokumentacji.