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.
$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();