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