Απόκριση HTTP
Η Nette ενθυλακώνει την απόκριση HTTP σε αντικείμενα με κατανοητό API παρέχοντας παράλληλα ένα φίλτρο εξυγίανσης.
Μια απόκριση HTTP είναι ένα αντικείμενο Nette\Http\Response, το οποίο λαμβάνετε
περνώντας το με τη χρήση dependency injection.
Σε παρουσιαστές απλά καλείτε το $httpResponse = $this->getHttpResponse()
.
Nette\Http\Response
Σε αντίθεση με το Nette\Http\Request, αυτό το αντικείμενο είναι
μεταβλητό, οπότε μπορείτε να χρησιμοποιήσετε ρυθμιστές για να
αλλάξετε την κατάσταση, δηλαδή να στείλετε κεφαλίδες. Να θυμάστε ότι
όλοι οι ρυθμιστές πρέπει να κληθούν πριν από την αποστολή της
πραγματικής εξόδου. Η μέθοδος isSent()
δηλώνει αν η έξοδος έχει
σταλεί. Εάν επιστρέφει true
, κάθε προσπάθεια αποστολής κεφαλίδας
προκαλεί μια εξαίρεση Nette\InvalidStateException
.
setCode(int $code, ?string $reason=null)
Αλλάζει έναν κωδικό απόκρισης κατάστασης. Για καλύτερη αναγνωσιμότητα του πηγαίου κώδικα συνιστάται η χρήση προκαθορισμένων σταθερών αντί πραγματικών αριθμών.
$httpResponse->setCode(Nette\Http\Response::S404_NotFound);
getCode(): int
Επιστρέφει τον κωδικό κατάστασης της απάντησης.
isSent(): bool
Επιστρέφει εάν οι επικεφαλίδες έχουν ήδη σταλεί από τον διακομιστή στο πρόγραμμα περιήγησης, οπότε δεν είναι πλέον δυνατή η αποστολή επικεφαλίδων ή η αλλαγή του κωδικού κατάστασης.
setHeader(string $name, string $value)
Αποστέλλει μια επικεφαλίδα HTTP και αντικαθιστά την προηγουμένως αποσταλείσα επικεφαλίδα με το ίδιο όνομα.
$httpResponse->setHeader('Pragma', 'no-cache');
addHeader(string $name, string $value)
Αποστέλλει μια επικεφαλίδα HTTP και δεν αντικαθιστά την προηγουμένως αποσταλείσα επικεφαλίδα με το ίδιο όνομα.
$httpResponse->addHeader('Accept', 'application/json');
$httpResponse->addHeader('Accept', 'application/xml');
deleteHeader(string $name)
Διαγράφει μια κεφαλίδα HTTP που έχει αποσταλεί προηγουμένως.
getHeader(string $header): ?string
Επιστρέφει την αποσταλείσα επικεφαλίδα HTTP ή null
εάν δεν
υπάρχει. Η παράμετρος δεν λαμβάνει υπόψη την πεζότητα.
$pragma = $httpResponse->getHeader('Pragma');
getHeaders(): array
Επιστρέφει όλες τις αποσταλμένες επικεφαλίδες HTTP ως συσχετιστικό πίνακα.
$headers = $httpResponse->getHeaders();
echo $headers['Pragma'];
setContentType(string $type, ?string $charset=null)
Αποστέλλει την επικεφαλίδα Content-Type
.
$httpResponse->setContentType('text/plain', 'UTF-8');
redirect(string $url, int $code=self::S302_Found): void
Ανακατευθύνει σε άλλη διεύθυνση URL. Μην ξεχάσετε να τερματίσετε το σενάριο στη συνέχεια.
$httpResponse->redirect('http://example.com');
exit;
setExpiration(?string $time)
Ορίζει τη λήξη του εγγράφου HTTP χρησιμοποιώντας τις επικεφαλίδες
Cache-Control
και Expires
. Η παράμετρος είναι είτε ένα χρονικό
διάστημα (ως κείμενο) είτε το null
, το οποίο απενεργοποιεί την
προσωρινή αποθήκευση.
// η προσωρινή μνήμη cache του προγράμματος περιήγησης λήγει σε μία ώρα
$httpResponse->setExpiration('1 hour');
sendAsFile(string $fileName)
Η απάντηση θα πρέπει να μεταφορτωθεί με το παράθυρο διαλόγου Save as με το καθορισμένο όνομα. Δεν στέλνει κανένα αρχείο στην έξοδο.
$httpResponse->sendAsFile('invoice.pdf');
setCookie(string $name, string $value, $time, ?string $path=null, ?string $domain=null, ?bool $secure=null, ?bool $httpOnly=null, ?string $sameSite=null)
Αποστέλλει ένα cookie. Προεπιλεγμένες τιμές παραμέτρων:
$path |
'/' |
με εμβέλεια σε όλες τις διαδρομές στον (υπο)τομέα (διαμορφώσιμο) |
$domain |
null |
με πεδίο εφαρμογής τον τρέχοντα (υπο)τομέα, αλλά όχι τους υποτομείς του (διαμορφώσιμο) |
$secure |
true |
αν ο ιστότοπος λειτουργεί σε HTTPS, διαφορετικά false
(διαμορφώσιμο) |
$httpOnly |
true |
το cookie δεν είναι προσβάσιμο σε JavaScript |
$sameSite |
'Lax' |
το cookie δεν χρειάζεται να αποστέλλεται όταν η πρόσβαση γίνεται από άλλη προέλευση |
Μπορείτε να αλλάξετε τις προεπιλεγμένες τιμές των παραμέτρων
$path
, $domain
και $secure
στο configuration.
Ο χρόνος μπορεί να καθοριστεί ως αριθμός δευτερολέπτων ή ως συμβολοσειρά:
$httpResponse->setCookie('lang', 'en', '100 days');
Η επιλογή $domain
καθορίζει ποιοι τομείς (προέλευση) μπορούν να
δέχονται cookies. Αν δεν καθοριστεί, το cookie γίνεται αποδεκτό από τον ίδιο
(υπο)τομέα που έχει οριστεί από αυτό, εξαιρουμένων των υποτομέων τους.
Εάν καθοριστεί η επιλογή $domain
, τότε συμπεριλαμβάνονται και τα
subdomains. Επομένως, ο προσδιορισμός του $domain
είναι λιγότερο
περιοριστικός από την παράλειψη. Για παράδειγμα, εάν
$domain = 'nette.org'
, το cookie είναι επίσης διαθέσιμο σε όλα τα subdomains όπως
το doc.nette.org
.
Μπορείτε να χρησιμοποιήσετε τις σταθερές Response::SameSiteLax
,
SameSiteStrict
και SameSiteNone
για την τιμή $sameSite
.
deleteCookie(string $name, ?string $path=null, ?string $domain=null, ?bool $secure=null): void
Διαγράφει ένα cookie. Οι προεπιλεγμένες τιμές των παραμέτρων είναι:
$path
με εμβέλεια σε όλους τους καταλόγους ('/'
)$domain
με πεδίο εφαρμογής τον τρέχοντα (υπο)τομέα, αλλά όχι τους υποτομείς του- Το
$secure
επηρεάζεται από τις ρυθμίσεις στο configuration#HTTP cookie
$httpResponse->deleteCookie('lang');