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.

Kurulum ve gereksinimler

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.

versiyon: 4.0