URL'lerle Çalışma
Url, UrlImmutable ve UrlScript sınıfları, URL'leri üretmeyi, ayrıştırmayı ve onlarla çalışmayı kolaylaştırır.
Url
Nette\Http\Url sınıfı, URL'lerle ve tek tek bileşenleriyle kolayca çalışmaya olanak tanır; şu şemada gösterildiği gibi:
scheme user password host port path query fragment
| | | | | | | |
/--\ /--\ /------\ /-------\ /--\/----------\ /--------\ /----\
http://john:xyz%2A12@nette.org:8080/en/download?name=param#footer
\______\__________________________/
| |
hostUrl authority
URL üretmek sezgiseldir:
use Nette\Http\Url;
$url = new Url;
$url->setScheme('https')
->setHost('localhost')
->setPath('/edit')
->setQueryParameter('foo', 'bar');
echo $url; // 'https://localhost/edit?foo=bar'
Bir URL'yi ayrıştırıp sonra onunla çalışabilirsiniz de:
$url = new Url(
'http://john:xyz%2A12@nette.org:8080/en/download?name=param#footer',
);
Url sınıfı JsonSerializable arayüzünü uygular ve bir __toString() metodu vardır;
dolayısıyla nesne yazdırılabilir ya da json_encode() fonksiyonuna verilen veride kullanılabilir.
echo $url;
echo json_encode([$url]);
URL Bileşenleri
Tek tek URL bileşenlerini almak ya da değiştirmek için şu metotlar kullanılabilir:
| Setter | Getter | Döndürülen değer |
|---|---|---|
setScheme(string $scheme) |
getScheme(): string |
'http' |
setUser(string $user) |
getUser(): string |
'john' |
setPassword(string $password) |
getPassword(): string |
'xyz*12' |
setHost(string $host) |
getHost(): string |
'nette.org' |
setPort(int $port) |
getPort(): ?int |
8080 |
getDefaultPort(): ?int |
80 |
|
setPath(string $path) |
getPath(): string |
'/en/download' |
setQuery(string|array $query) |
getQuery(): string |
'name=param' |
setFragment(string $fragment) |
getFragment(): string |
'footer' |
getAuthority(): string |
'john:xyz%2A12@nette.org:8080' |
|
getHostUrl(): string |
'http://john:xyz%2A12@nette.org:8080' |
|
getAbsoluteUrl(): string |
URL'nin tamamı |
getUser(), getPassword(), setUser() ve setPassword() metotları
kullanımdan kaldırıldı; çünkü kimlik bilgilerini doğrudan URL'ye gömmek önerilmez.
Uyarı: Bir HTTP isteğinden alınan URL ile çalışırken, tarayıcı fragment'ı sunucuya göndermediği için onun fragment içermeyeceğini unutmayın.
Tek tek sorgu parametreleriyle de şunları kullanarak çalışabiliriz:
| Setter | Getter |
|---|---|
setQuery(string|array $query) |
getQueryParameters(): array |
setQueryParameter(string $name, $val) |
getQueryParameter(string $name) |
| `appendQuery(string | array $query)` |
getDomain(int $level = 2): string
Host'un sağ ya da sol parçasını döndürür. Host www.nette.org ise şöyle çalışır:
getDomain(1) |
'org' |
getDomain(2) |
'nette.org' |
getDomain(3) |
'www.nette.org' |
getDomain(0) |
'www.nette.org' |
getDomain(-1) |
'www.nette' |
getDomain(-2) |
'www' |
getDomain(-3) |
'' |
isEqual(string|Url $url): bool
İki URL'nin özdeş olup olmadığını denetler.
$url->isEqual('https://nette.org');
canonicalize()
URL'yi kurallı biçime dönüştürür. Bu, host adını küçük harfe çevirir ve yolu normalleştirir (yüzde kodlaması ve gereksiz karakterlerin kaldırılması). Sorgu dizesi değiştirilmeden bırakılır.
Url::isAbsolute(string $url): bool
Bir URL'nin mutlak olup olmadığını denetler. Bir URL, bir şemayla (örneğin http, https, ftp) ve ardından iki nokta üst üste ile başlıyorsa mutlak sayılır.
Url::isAbsolute('https://nette.org'); // true
Url::isAbsolute('//nette.org'); // false
Url::removeDotSegments(string $path): string
Özel . ve .. parçalarını kaldırarak bir URL yolunu normalleştirir. Bu metot, gereksiz yol
öğelerini web tarayıcılarının yaptığı gibi kaldırır.
Url::removeDotSegments('/path/../subtree/./file.txt'); // '/subtree/file.txt'
Url::removeDotSegments('/../foo/./bar'); // '/foo/bar'
Url::removeDotSegments('./today/../file.txt'); // 'file.txt'
UrlImmutable
Nette\Http\UrlImmutable sınıfı, Url sınıfının değişmez alternatifidir (PHP'de DateTimeImmutable sınıfının
DateTime sınıfının değişmez alternatifi olmasına benzer). Setter yerine "wither"ları vardır; bunlar nesneyi
değiştirmez, değiştirilmiş değere sahip yeni örnekler döndürür:
use Nette\Http\UrlImmutable;
$url = new UrlImmutable(
'https://nette.org:8080/en/download?name=param#footer',
);
$newUrl = $url
->withHost('example.com')
->withPath('/en/')
->withQueryParameter('name', 'value');
echo $newUrl; // 'https://example.com:8080/en/?name=value#footer'
UrlImmutable sınıfı JsonSerializable arayüzünü uygular ve bir __toString() metodu
vardır; dolayısıyla nesne yazdırılabilir ya da json_encode() fonksiyonuna verilen veride kullanılabilir.
echo $url;
echo json_encode([$url]);
URL Bileşenleri
Tek tek URL bileşenlerini almak ya da değiştirmek için şu metotlar kullanılabilir:
| Wither | Getter | Döndürülen değer |
|---|---|---|
withScheme(string $scheme) |
getScheme(): string |
'http' |
withUser(string $user) |
getUser(): string |
'john' |
withPassword(string $password) |
getPassword(): string |
'xyz*12' |
withHost(string $host) |
getHost(): string |
'nette.org' |
withPort(int $port) |
getPort(): ?int |
8080 |
getDefaultPort(): ?int |
80 |
|
withPath(string $path) |
getPath(): string |
'/en/download' |
withQuery(string|array $query) |
getQuery(): string |
'name=param' |
withFragment(string $fragment) |
getFragment(): string |
'footer' |
getAuthority(): string |
'john:xyz%2A12@nette.org:8080' |
|
getHostUrl(): string |
'http://john:xyz%2A12@nette.org:8080' |
|
getAbsoluteUrl(): string |
URL'nin tamamı |
getUser(), getPassword(), withUser(), withPassword() ve
withoutUserInfo() metotları kullanımdan kaldırıldı; çünkü kimlik bilgilerini doğrudan URL'ye gömmek
önerilmez.
Tek tek sorgu parametreleriyle de şunları kullanarak çalışabiliriz:
| Wither | Getter |
|---|---|
withQuery(string|array $query) |
getQueryParameters(): array |
withQueryParameter(string $name, $val) |
getQueryParameter(string $name) |
getDomain(int $level = 2): string
Host'un sağ ya da sol parçasını döndürür. Host www.nette.org ise şöyle çalışır:
getDomain(1) |
'org' |
getDomain(2) |
'nette.org' |
getDomain(3) |
'www.nette.org' |
getDomain(0) |
'www.nette.org' |
getDomain(-1) |
'www.nette' |
getDomain(-2) |
'www' |
getDomain(-3) |
'' |
resolve(string $reference): UrlImmutable
Mutlak bir URL'yi, bir tarayıcının HTML sayfasındaki bağlantıları işlediği şekilde çözer:
- bağlantı mutlak bir URL ise (şema içeriyorsa) değiştirilmeden kullanılır
- bağlantı
//ile başlıyorsa yalnızca geçerli URL'nin şeması alınır - bağlantı
/ile başlıyorsa alan adı kökünden mutlak bir yol oluşturulur - diğer durumlarda URL, geçerli yola göre kurulur
$url = new UrlImmutable('https://example.com/path/page');
echo $url->resolve('../foo'); // 'https://example.com/foo'
echo $url->resolve('/bar'); // 'https://example.com/bar'
echo $url->resolve('sub/page.html'); // 'https://example.com/path/sub/page.html'
isEqual(string|Url $url): bool
İki URL'nin özdeş olup olmadığını denetler.
$url->isEqual('https://nette.org');
UrlScript
Nette\Http\UrlScript sınıfı, UrlImmutable sınıfının bir torunudur ve onu projenin kök dizini gibi ek sanal URL bileşenleriyle genişletir. Üst sınıfı gibi o da değişmez bir nesnedir.
Aşağıdaki şema, UrlScript'in tanıdığı bileşenleri gösterir:
baseUrl basePath relativePath relativeUrl
| | | |
/---------------/-----\/--------\---------------------------\
http://nette.org/admin/script.php/pathinfo/?name=param#footer
\_______________/\________/
| |
scriptPath pathInfo
baseUrl, uygulamanın temel URL'sidir; alan adını ve uygulamanın kök dizinine giden yol parçasını içerirbasePath, uygulamanın kök dizinine giden yol parçasıdırscriptPath, geçerli betiğe giden yoldurrelativePath,basePathdeğerine göre betiğin adıdır (ve olasılıkla ek yol parçalarıdır)relativeUrl, URL'ninbaseUrlsonrasındaki tüm parçasıdır; sorgu dizesi ve fragment dahilpathInfo, URL'nin betik adından sonraki, artık ender kullanılan parçasıdır
URL'nin bu parçalarını almak için şu metotlar kullanılabilir:
| Getter | Döndürülen değer |
|---|---|
getScriptPath(): string |
'/admin/script.php' |
getBasePath(): string |
'/admin/' |
getBaseUrl(): string |
'http://nette.org/admin/' |
getRelativePath(): string |
'script.php/pathinfo/' |
getRelativeUrl(): string |
'script.php/pathinfo/?name=param#footer' |
getPathInfo(): string |
'/pathinfo/' |
UrlScript nesnelerini genellikle doğrudan oluşturmayız; bunun yerine Nette\Http\Request::getUrl() metodu onu, bileşenleri geçerli HTTP isteği için zaten doğru ayarlanmış
olarak döndürür.