Απόκριση HTTP
Το Nette ενσωματώνει την απόκριση HTTP σε αντικείμενα με ένα κατανοητό API.
Η απόκριση HTTP αντιπροσωπεύεται από το αντικείμενο Nette\Http\Response. Εάν εργάζεστε με το
Nette, αυτό το αντικείμενο δημιουργείται αυτόματα από το framework και
μπορείτε να το λάβετε μέσω έγχυσης εξάρτησης. Στους
presenters, απλά καλέστε τη μέθοδο $this->getHttpResponse()
.
Nette\Http\Response
Το αντικείμενο, σε αντίθεση με το Nette\Http\Request, είναι μεταβλητό (mutable), οπότε
μπορείτε να αλλάξετε την κατάσταση χρησιμοποιώντας setters, π.χ. να
στείλετε κεφαλίδες. Θυμηθείτε ότι όλοι οι setters πρέπει να κληθούν πριν
από την αποστολή οποιασδήποτε εξόδου. Η μέθοδος 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)
Η απόκριση θα ληφθεί μέσω του διαλόγου Αποθήκευση ως με το καθορισμένο όνομα. Δεν στέλνει το ίδιο το αρχείο.
$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 |
'/' |
το cookie έχει εμβέλεια σε όλες τις διαδρομές στο (υπο)domain (διαμορφώσιμο) |
$domain |
null |
που σημαίνει με εμβέλεια στο τρέχον (υπο)domain, αλλά όχι στα υποdomains του (διαμορφώσιμο) |
$secure |
true |
εάν ο ιστότοπος εκτελείται σε HTTPS, διαφορετικά false
(διαμορφώσιμο) |
$httpOnly |
true |
το cookie δεν είναι προσβάσιμο από JavaScript |
$sameSite |
'Lax' |
το cookie μπορεί να μην αποσταλεί κατά την πρόσβαση από άλλο domain |
Μπορείτε να αλλάξετε τις προεπιλεγμένες τιμές των παραμέτρων
$path
, $domain
και $secure
στην διαμόρφωση.
Ο χρόνος μπορεί να καθοριστεί ως αριθμός δευτερολέπτων ή ως συμβολοσειρά:
$httpResponse->setCookie('lang', 'el', '100 days');
Η παράμετρος $domain
καθορίζει ποια domains μπορούν να δέχονται cookies.
Εάν δεν καθοριστεί, το cookie γίνεται αποδεκτό από το ίδιο (υπο)domain που το
όρισε, αλλά όχι από τα υποdomains του. Εάν το $domain
καθοριστεί,
περιλαμβάνονται και τα υποdomains. Επομένως, ο καθορισμός του $domain
είναι λιγότερο περιοριστικός από την παράλειψή του. Για παράδειγμα, με
$domain = 'nette.org'
, τα cookies είναι επίσης διαθέσιμα σε όλα τα υποdomains
όπως το doc.nette.org
.
Για την τιμή $sameSite
, μπορείτε να χρησιμοποιήσετε τις σταθερές
Response::SameSiteLax
, SameSiteStrict
και SameSiteNone
.
deleteCookie (string $name, ?string $path=null, ?string $domain=null, ?bool $secure=null): void
Διαγράφει ένα cookie. Οι προεπιλεγμένες τιμές των παραμέτρων είναι:
$path
με εμβέλεια σε όλους τους καταλόγους ('/'
)$domain
με εμβέλεια στο τρέχον (υπο)domain, αλλά όχι στα υποdomains του$secure
καθορίζεται από τις ρυθμίσεις στην διαμόρφωση
$httpResponse->deleteCookie('lang');