HTTP İsteği
Nette, HTTP isteğini anlaşılır bir API'ye sahip nesneler içinde kapsüller ve aynı zamanda bir temizleme filtresi sağlar.
HTTP isteği Nette\Http\Request nesnesi tarafından
temsil edilir. Nette ile çalışıyorsanız, bu nesne framework tarafından otomatik olarak oluşturulur ve bağımlılık enjeksiyonu aracılığıyla size
iletilmesini sağlayabilirsiniz. Presenter'larda sadece $this->getHttpRequest()
metodunu çağırmanız
yeterlidir. Nette Framework dışında çalışıyorsanız, RequestFactory kullanarak bir nesne
oluşturabilirsiniz.
Nette'nin büyük bir avantajı, nesneyi oluştururken tüm GET, POST, COOKIE giriş parametrelerini ve ayrıca URL'yi kontrol karakterlerinden ve geçersiz UTF-8 dizilerinden otomatik olarak temizlemesidir. Daha sonra bu verilerle güvenle çalışabilirsiniz. Temizlenmiş veriler daha sonra presenter'larda ve formlarda kullanılır.
Nette\Http\Request
Bu nesne değişmezdir (immutable). Hiçbir ayarlayıcısı yoktur, yalnızca nesneyi değiştirmeyen ancak değiştirilmiş
bir değere sahip yeni bir örnek döndüren withUrl()
adlı bir wither'ı vardır.
withUrl (Nette\Http\UrlScript $url): Nette\Http\Request
Farklı bir URL ile bir klon döndürür.
getUrl(): Nette\Http\UrlScript
İsteğin URL'sini UrlScript nesnesi olarak döndürür.
$url = $httpRequest->getUrl();
echo $url; // https://doc.nette.org/cs/?action=edit
echo $url->getHost(); // nette.org
Uyarı: tarayıcılar sunucuya fragment göndermez, bu nedenle $url->getFragment()
boş bir dize
döndürür.
getQuery (?string $key=null): string|array|null
GET isteğinin parametrelerini döndürür.
$all = $httpRequest->getQuery(); // URL'deki tüm parametrelerin dizisini döndürür
$id = $httpRequest->getQuery('id'); // 'id' GET parametresini döndürür (veya null)
getPost (?string $key=null): string|array|null
POST isteğinin parametrelerini döndürür.
$all = $httpRequest->getPost(); // POST'taki tüm parametrelerin dizisini döndürür
$id = $httpRequest->getPost('id'); // 'id' POST parametresini döndürür (veya null)
getFile (string|string[] $key): Nette\Http\FileUpload|array|null
Yüklemeyi Nette\Http\FileUpload nesnesi olarak döndürür:
$file = $httpRequest->getFile('avatar');
if ($file?->hasFile()) { // herhangi bir dosya yüklendi mi?
$file->getUntrustedName(); // kullanıcı tarafından gönderilen dosya adı
$file->getSanitizedName(); // tehlikeli karakterler içermeyen ad
}
İç içe geçmiş yapıya erişmek için anahtar dizisi belirtin.
//<input type="file" name="my-form[details][avatar]" multiple>
$file = $request->getFile(['my-form', 'details', 'avatar']);
Dışarıdan gelen verilere güvenilemediği ve dolayısıyla dosya yapısının biçimine güvenilemediği için, bu yöntem,
örneğin başarısız olabilecek $request->getFiles()['my-form']['details']['avatar']
'dan daha güvenlidir.
getFiles(): array
Tüm yüklemeler ağacını, yaprakları Nette\Http\FileUpload nesneleri olan normalleştirilmiş bir yapıda döndürür:
$files = $httpRequest->getFiles();
getCookie (string $key): string|array|null
Çerezi veya mevcut değilse null
döndürür.
$sessId = $httpRequest->getCookie('sess_id');
getCookies(): array
Tüm çerezleri döndürür.
$cookies = $httpRequest->getCookies();
getMethod(): string
İsteğin yapıldığı HTTP metodunu döndürür.
$httpRequest->getMethod(); // GET, POST, HEAD, PUT
isMethod (string $method): bool
İsteğin yapıldığı HTTP metodunu test eder. Parametre büyük/küçük harfe duyarsızdır.
if ($httpRequest->isMethod('GET')) // ...
getHeader (string $header): ?string
HTTP başlığını veya mevcut değilse null
döndürür. Parametre büyük/küçük harfe duyarsızdır.
$userAgent = $httpRequest->getHeader('User-Agent');
getHeaders(): array
Tüm HTTP başlıklarını ilişkisel bir dizi olarak döndürür.
$headers = $httpRequest->getHeaders();
echo $headers['Content-Type'];
isSecured(): bool
Bağlantı şifreli mi (HTTPS)? Doğru işlevsellik için proxy ayarlanması gerekebilir.
isSameSite(): bool
İstek aynı (alt) alan adından mı geliyor ve bir bağlantıya tıklanarak mı başlatıldı? Nette algılama için
_nss
(önceden nette-samesite
) çerezini kullanır.
isAjax(): bool
Bu bir AJAX isteği mi?
getRemoteAddress(): ?string
Kullanıcının IP adresini döndürür. Doğru işlevsellik için proxy ayarlanması gerekebilir.
getRemoteHost(): ?string
Kullanıcının IP adresinin DNS çözümlemesini döndürür. Doğru işlevsellik için proxy ayarlanması gerekebilir.
getBasicCredentials(): ?array
Basic HTTP authentication için kimlik doğrulama bilgilerini döndürür.
[$user, $password] = $httpRequest->getBasicCredentials();
getRawBody(): ?string
HTTP isteğinin gövdesini döndürür.
$body = $httpRequest->getRawBody();
detectLanguage (array $langs): ?string
Dili algılar. Parametre olarak $lang
, uygulamanın desteklediği dilleri içeren bir dizi iletiriz ve
ziyaretçinin tarayıcısının en çok görmek isteyeceği dili döndürür. Bu sihir değil, sadece Accept-Language
başlığı kullanılır. Eşleşme olmazsa null
döndürür.
// tarayıcı örneğin Accept-Language gönderir: cs,en-us;q=0.8,en;q=0.5,sl;q=0.3
$langs = ['hu', 'pl', 'en']; // uygulama tarafından desteklenen diller
echo $httpRequest->detectLanguage($langs); // en
RequestFactory
Nette\Http\RequestFactory sınıfı, mevcut HTTP
isteğini temsil eden bir Nette\Http\Request
örneği oluşturmak için kullanılır. (Nette ile çalışıyorsanız,
HTTP isteği nesnesi framework tarafından otomatik olarak oluşturulur.)
$factory = new Nette\Http\RequestFactory;
$httpRequest = $factory->fromGlobals();
fromGlobals()
metodu, mevcut PHP genel değişkenlerine ($_GET
, $_POST
,
$_COOKIE
, $_FILES
ve $_SERVER
) dayalı olarak bir istek nesnesi oluşturur. Nesneyi
oluştururken, tüm GET, POST, COOKIE giriş parametrelerini ve ayrıca URL'yi kontrol karakterlerinden ve geçersiz
UTF-8 dizilerinden otomatik olarak temizler, bu da bu verilerle daha fazla çalışırken güvenliği sağlar.
RequestFactory, fromGlobals()
çağrılmadan önce yapılandırılabilir:
$factory->setBinary()
metoduyla, giriş parametrelerinin kontrol karakterlerinden ve geçersiz UTF-8 dizilerinden otomatik olarak temizlenmesini devre dışı bırakırsınız.$factory->setProxy(...)
metoduyla, kullanıcının IP adresinin doğru algılanması için gerekli olan proxy sunucusu IP adresini belirtirsiniz.
RequestFactory, URL isteğinin bölümlerini otomatik olarak dönüştüren filtreler tanımlamanıza olanak tanır. Bu filtreler, URL'den, örneğin çeşitli web sitelerindeki yorum sistemlerinin yanlış uygulanmasıyla oraya eklenebilecek istenmeyen karakterleri kaldırır:
// yoldan boşlukların kaldırılması
$requestFactory->urlFilters['path']['%20'] = '';
// URI sonundan nokta, virgül veya sağ parantezin kaldırılması
$requestFactory->urlFilters['url']['[.,)]$'] = '';
// yolun çift eğik çizgilerden temizlenmesi (varsayılan filtre)
$requestFactory->urlFilters['path']['/{2,}'] = '/';
İlk anahtar 'path'
veya 'url'
, filtrenin URL'nin hangi bölümüne uygulanacağını belirtir.
İkinci anahtar, aranacak düzenli ifadedir ve değer, bulunan metnin yerine kullanılacak olan değiştirmedir.
Yüklenen Dosyalar
Nette\Http\Request::getFiles()
metodu, tüm yüklemelerin normalleştirilmiş bir yapıda bir dizisini
döndürür, yaprakları Nette\Http\FileUpload
nesneleridir. Bunlar, <input type=file>
form elemanı tarafından gönderilen verileri kapsüller.
Yapı, HTML'deki elemanların adlandırılmasını yansıtır. En basit durumda, bu, şu şekilde gönderilen tek bir adlandırılmış form elemanı olabilir:
<input type="file" name="avatar">
Bu durumda $request->getFiles()
bir dizi döndürür:
[
'avatar' => /* FileUpload instance */
]
FileUpload
nesnesi, kullanıcı hiçbir dosya göndermese veya gönderme başarısız olsa bile oluşturulur.
Dosyanın gönderilip gönderilmediğini hasFile()
metodu döndürür:
$request->getFile('avatar')?->hasFile();
Dizi gösterimini kullanan eleman adı durumunda:
<input type="file" name="my-form[details][avatar]">
döndürülen ağaç şöyle görünür:
[
'my-form' => [
'details' => [
'avatar' => /* FileUpload instance */
],
],
]
Dosya dizileri de oluşturulabilir:
<input type="file" name="my-form[details][avatars][]" multiple>
Bu durumda yapı şöyle görünür:
[
'my-form' => [
'details' => [
'avatars' => [
0 => /* FileUpload instance */,
1 => /* FileUpload instance */,
2 => /* FileUpload instance */,
],
],
],
]
İç içe geçmiş dizinin 1 indeksine erişmenin en iyi yolu şudur:
$file = $request->getFile(['my-form', 'details', 'avatars', 1]);
if ($file instanceof FileUpload) {
// ...
}
Dışarıdan gelen verilere güvenilemediği ve dolayısıyla dosya yapısının biçimine güvenilemediği için, bu yöntem,
örneğin başarısız olabilecek $request->getFiles()['my-form']['details']['avatars'][1]
'dan daha
güvenlidir.
FileUpload
Metotlarına Genel Bakış
hasFile(): bool
Kullanıcı herhangi bir dosya yüklediyse true
döndürür.
isOk(): bool
Dosya başarıyla yüklendiyse true
döndürür.
getError(): int
Dosya yükleme sırasındaki hata kodunu döndürür. Bu, UPLOAD_ERR_XXX sabitlerinden biridir. Yükleme başarılı
olursa UPLOAD_ERR_OK
döndürür.
move (string $dest)
Yüklenen dosyayı yeni bir konuma taşır. Hedef dosya zaten varsa, üzerine yazılır.
$file->move('/path/to/files/name.ext');
getContents(): ?string
Yüklenen dosyanın içeriğini döndürür. Yükleme başarılı olmadıysa null
döndürür.
getContentType(): ?string
Yüklenen dosyanın MIME içerik türünü imzasına göre algılar. Yükleme başarılı olmadıysa veya algılama
başarısız olursa null
döndürür.
PHP fileinfo
uzantısını gerektirir.
getUntrustedName(): string
Tarayıcı tarafından gönderildiği şekliyle dosyanın orijinal adını döndürür.
Bu metodun döndürdüğü değere güvenmeyin. İstemci, uygulamanıza zarar vermek veya hacklemek amacıyla kötü niyetli bir dosya adı göndermiş olabilir.
getSanitizedName(): string
Temizlenmiş dosya adını döndürür. Yalnızca ASCII karakterleri [a-zA-Z0-9.-]
içerir. Ad bu tür
karakterleri içermiyorsa 'unknown'
döndürür. Dosya JPEG, PNG, GIF, WebP veya AVIF biçiminde bir resimse, doğru
uzantıyı da döndürür.
PHP fileinfo
uzantısını gerektirir.
getSuggestedExtension(): ?string
Algılanan MIME türüne karşılık gelen uygun dosya uzantısını (nokta olmadan) döndürür.
PHP fileinfo
uzantısını gerektirir.
getUntrustedFullPath(): string
Klasör yüklenirken tarayıcı tarafından gönderildiği şekliyle dosyanın orijinal yolunu döndürür. Tam yol yalnızca PHP 8.1 ve sonraki sürümlerde kullanılabilir. Önceki sürümlerde bu metot dosyanın orijinal adını döndürür.
Bu metodun döndürdüğü değere güvenmeyin. İstemci, uygulamanıza zarar vermek veya hacklemek amacıyla kötü niyetli bir dosya adı göndermiş olabilir.
getSize(): int
Yüklenen dosyanın boyutunu döndürür. Yükleme başarılı olmadıysa 0
döndürür.
getTemporaryFile(): string
Yüklenen dosyanın geçici konumunun yolunu döndürür. Yükleme başarılı olmadıysa ''
döndürür.
isImage(): bool
Yüklenen dosya JPEG, PNG, GIF, WebP veya AVIF biçiminde bir resimse true
döndürür. Algılama imzasına göre
yapılır ve tüm dosyanın bütünlüğü doğrulanmaz. Bir resmin hasarlı olup olmadığını, örneğin onu yüklemeye çalışarak belirleyebilirsiniz.
PHP fileinfo
uzantısını gerektirir.
getImageSize(): ?array
Yüklenen resmin boyutlarını içeren [genişlik, yükseklik]
çiftini döndürür. Yükleme başarılı
olmadıysa veya geçerli bir resim değilse null
döndürür.
toImage(): Nette\Utils\Image
Resmi Image nesnesi olarak yükler. Yükleme başarılı olmadıysa veya
geçerli bir resim değilse Nette\Utils\ImageException
istisnası atar.