CakePHP 3 - obiekt Request

Obiekty Request i Response dotyczą żądań i odpowiedzi HTTP. Obiekt żądania (Request) w CakePHP umożliwia introspekcję przychodzącego żądania, podczas gdy obiekt odpowiedzi (Response) na łatwe tworzenie odpowiedzi HTTP z poziomu kontrolerów. W tym artykule skupię się na obiekcie Request, w następnym na Response. Domyślnie żądanie jest dostępne jako $this->request w kontrolerach, widokach, cellach i helperach.

Spójrzmy na poniższy przykład. Dzięki getParam() możemy pobrać różne parametry routingu np. nazwę kontrolera.
$controllerName = $this->request->getParam('controller');
Aby uzyskać wszystkie parametry routingu jako tablicę, użyj metody getAttribute().
$parameters = $this->request->getAttribute('params');
Dostęp do przekazanych argumentów również uzyskamy w obiekcie żądania.
$passedArgs = $this->request->getParam('pass');
Istnieje kilka przydatnych parametrów, których CakePHP używa wewnętrznie, wszystkie znajdują się również w parametrach routingu:
$pluginName = $this->request->getParam('plugin');
$controllerName = $this->request->getParam('controller');
$prefixName = $this->request->getParam('prefix');
Parametry query można odczytać za pomocą metody getQuery(). Jeśli chcesz uzyskać wszystkie parametry query użyj getQueryParams().
// URL /users/index?page=1&sort=name
$page = $this->request->getQuery('sort');

$allQueryParams = $this->request->getQueryParams();
Wszystkie dane POST są dostępne za pomocą metody getData().
$title = $this->request->getData('MyModel.title');
Klucze, które nie istnieją, zwrócą wartość null. Dostęp do przesłanych plików można również uzyskać poprzez dane treści żądania, używając metody getData() opisanej powyżej. ServerRequest::env() jest opakowaniem dla funkcji globalnej env() i działa jako getter/setter dla zmiennych środowiskowych bez konieczności modyfikowania wartości globalnych $_SERVER i $_ENV. Spójrz na poniższy przykład.
$host = $this->request->env('HTTP_HOST');

$this->request->env('REQUEST_METHOD', 'POST');
Aby uzyskać dostęp do wszystkich zmiennych środowiskowych możemy użyć metody getServerParams() obiektu request. Obiekt Request zawiera również przydatne informacje o ścieżkach w aplikacji. Atrybuty base i webroot są przydatne do generowania adresów URL i określania, czy aplikacja znajduje się w podkatalogu. Atrybuty, których możesz użyć, to:
$here = $request->getRequestTarget();

// /subdir
$base = $request->getAttribute('base');

// /subdir/
$base = $request->getAttribute('webroot');
Obiekt żądania zapewnia łatwy sposób sprawdzenia określonych warunków w danym żądaniu np. czy żądanie jest POST. Służy do tego metoda is().
$isPost = $this->request->is('post');
Detektory Możesz również rozszerzyć dostępne detektory żądań, używając Cake\Http\ServerRequest::addDetector() do tworzenia nowych rodzajów detektorów. Istnieją różne typy detektorów, które możesz tworzyć. Oto przykład kilku detektorów.
$this->request->addDetector('internalIp', [
    'env' => 'CLIENT_IP',
    'options' => ['192.168.0.101', '192.168.0.100']
]);

$this->request->addDetector(
    'csv',
    [
        'accept' => ['text/csv'],
        'param' => '_ext',
        'value' => 'csv',
    ]
);

$this->request->addDetector(
    'iphone',
    ['env' => 'HTTP_USER_AGENT', 'pattern' => '/iPhone/i']
);

$this->request->addDetector(
    'awesome',
    function ($request) {
        return $request->getParam('awesome');
    }
);
W CakePHP mamy kilkanaście wbudowanych detektorów. Przykładowo is('post') sprawdza czy żądanie jest POST, podobnie jak is('get') sprawdza czy żądanie jest GET. is('ajax') sprawdza czy bieżące żądanie przychodzi z nagłówkiem X-Requested-With=XMLHttpRequest. Więcej można zobaczyć w dokumentacji CakePHP. Dostęp do sesji to również zadanie obiektu request. Należy użyć metody session()
$userName = $this->request->session()->read('Auth.User.name');
W request mamy również dostęp do domeny i hosta.
// 'example.org'
echo $request->domain();

// 'my.dev.example.org'
echo $request->host();
Funkcja getMethod() zwraca metodę HTTP, za pomocą której żądanie zostało wysłane.
// POST
echo $request->getMethod();
Można ustawić również dozwolone metody HTTP. Jeśli nie zostaną dopasowane rzuconay będzie wyjątek MethodNotAllowedException.
public function delete()
{
    // Tylko POST i DELETE
    $this->request->allowMethod(['post', 'delete']);
    ...
}
Obiekt Request umożliwia dostęp do dowolnych nagłówków HTTP_ *, które zostały użyte w żądaniu. Na przykład:
$userAgent = $this->request->getHeaderLine('User-Agent');

// Get an array of all values.
$acceptHeader = $this->request->getHeader('Accept');

// Check if a header exists
$hasAcceptHeader = $this->request->hasHeader('Accept');
Na koniec dwie przydatne metody. Pierwsza zwraca adres odsyłający dla bieżącego żądania. Druga zwraca IP aktualnie odwiedzającego użytkownika.
$referer = $this->request->referer();
$clientIp = $this->request->clientIp();