URL Utility
Klasy Url, UrlImmutable i UrlScript ułatwiają generowanie, przetwarzanie i manipulowanie adresami URL.
Url
Klasa Nette\Http\Url ułatwia pracę z adresem URL i jego poszczególnymi składnikami, jak pokazano na tym schemacie:
scheme user password host port path query fragment | | | | | | | | /--\ /--\ /------\ /-------\ /--\/----------\ /--------\ /----\ http://john:xyz%2A12@nette.org:8080/en/download?name=param#footer \______\__________________________/ | | hostUrl authority
Generowanie adresów URL jest intuicyjne:
use Nette\Http\Url;
$url = new Url;
$url->setScheme('https')
->setHost('localhost')
->setPath('/edit')
->setQueryParameter('foo', 'bar');
echo $url; // 'https://localhost/edit?foo=bar'
Możesz również parsować adres URL i manipulować nim dalej:
$url = new Url(
'http://john:xyz%2A12@nette.org:8080/en/download?name=param#footer',
);
Klasa Url
implementuje interfejs JsonSerializable
i udostępnia metodę __toString()
,
umożliwiając drukowanie obiektu lub używanie go z json_encode()
.
echo $url;
echo json_encode([$url]);
URL Components
Następujące metody są dostępne w celu uzyskania lub zmiany poszczególnych komponentów URL:
Setter | Getter | Wartość zwrotna |
---|---|---|
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 |
'nette.org:8080' |
|
getHostUrl(): string |
'http://nette.org:8080' |
|
getAbsoluteUrl(): string |
pełny adres URL |
Ostrzeżenie: Podczas pracy z adresem URL uzyskanym z żądania HTTP należy pamiętać, że nie będzie on zawierał fragmentu, ponieważ przeglądarka nie wysyła go do serwera.
Możemy również pracować z poszczególnymi parametrami zapytania za pomocą:
Setter | Getter |
---|---|
setQuery(string|array $query) |
getQueryParameters(): array |
setQueryParameter(string $name, $val) |
getQueryParameter(string $name) |
getDomain (int $level = 2): string
Zwraca prawą lub lewą część hosta. Oto jak to działa, jeśli hostem jest www.nette.org
:
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 $anotherUrl): bool
Sprawdza, czy dwa adresy URL są identyczne.
$url->isEqual('https://nette.org');
Url::isAbsolute (string $url): bool
Sprawdza, czy adres URL jest bezwzględny. Adres URL jest uważany za bezwzględny, jeśli zaczyna się od schematu (np. http, https, ftp), po którym następuje dwukropek.
Url::isAbsolute('https://nette.org'); // true
Url::isAbsolute('//nette.org'); // false
Url::removeDotSegments (string $path): string
Normalizuje ścieżkę URL poprzez usunięcie specjalnych segmentów .
i ..
. Ta metoda usuwa zbędne
elementy ścieżki w taki sam sposób, jak robią to przeglądarki.
Url::removeDotSegments('/path/../subtree/./file.txt'); // '/subtree/file.txt'
Url::removeDotSegments('/../foo/./bar'); // '/foo/bar'
Url::removeDotSegments('./today/../file.txt'); // 'file.txt'
UrlImmutable
Klasa Nette\Http\UrlImmutable jest niezmienną
alternatywą dla klasy Url (podobnie jak DateTimeImmutable
jest niezmienną alternatywą dla
DateTime
w PHP). Zamiast setterów posiada kłęby, które nie zmieniają obiektu, ale zwracają nowe instancje ze
zmodyfikowaną wartością:
use Nette\Http\UrlImmutable;
$url = new UrlImmutable(
'http://john:xyz%2A12@nette.org:8080/en/download?name=param#footer',
);
$newUrl = $url
->withUser('')
->withPassword('')
->withPath('/en/');
echo $newUrl; // 'http://nette.org:8080/en/?name=param#footer'
Klasa UrlImmutable
implementuje interfejs JsonSerializable
i udostępnia metodę
__toString()
, umożliwiając drukowanie obiektu lub używanie go z json_encode()
.
echo $url;
echo json_encode([$url]);
URL Components
Następujące metody są dostępne w celu uzyskania lub zmiany poszczególnych komponentów URL:
Wither | Getter | Wartość zwrotna |
---|---|---|
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 |
'nette.org:8080' |
|
getHostUrl(): string |
'http://nette.org:8080' |
|
getAbsoluteUrl(): string |
pełny adres URL |
Metoda withoutUserInfo()
usuwa user
i password
.
Możemy również operować na poszczególnych parametrach zapytania za pomocą:
Wither | Getter |
---|---|
withQuery(string|array $query) |
getQueryParameters(): array |
withQueryParameter(string $name, $val) |
getQueryParameter(string $name) |
getDomain (int $level = 2): string
Zwraca prawą lub lewą część hosta. Oto jak to działa, jeśli hostem jest www.nette.org
:
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
Rozwiązuje bezwzględny adres URL w taki sam sposób, w jaki przeglądarka przetwarza łącza na stronie HTML:
- Jeśli link jest bezwzględnym adresem URL (zawiera schemat), jest on używany bez zmian.
- Jeśli łącze zaczyna się od
//
, stosowany jest tylko schemat z bieżącego adresu URL. - Jeśli łącze zaczyna się od
/
, tworzona jest bezwzględna ścieżka z katalogu głównego domeny. - W innych przypadkach adres URL jest konstruowany względem bieżącej ścieżki.
$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 $anotherUrl): bool
Sprawdza, czy dwa adresy URL są identyczne.
$url->isEqual('https://nette.org');
UrlScript
Klasa Nette\Http\UrlScript jest potomkiem UrlImmutable i rozszerza ją o dodatkowe wirtualne komponenty URL, takie jak katalog główny projektu itp. Podobnie jak jej klasa nadrzędna, jest to obiekt niezmienny.
Poniższy diagram przedstawia komponenty rozpoznawane przez UrlScript:
baseUrl basePath relativePath relativeUrl | | | | /---------------/-----\/--------\---------------------------\ http://nette.org/admin/script.php/pathinfo/?name=param#footer \_______________/\________/ | | scriptPath pathInfo
baseUrl
to podstawowy adres URL aplikacji zawierający domenę i część ścieżki do katalogu głównego aplikacji.basePath
jest częścią ścieżki do katalogu głównego aplikacjiscriptPath
to ścieżka do bieżącego skrypturelativePath
to nazwa skryptu (i ewentualnie dodatkowe segmenty ścieżki) względem basePathrelativeUrl
to cała część adresu URL po baseUrl, w tym ciąg zapytania i fragment.pathInfo
to obecnie rzadko używana część adresu URL po nazwie skryptu
Udostępniane są metody pozwalające na zwrócenie części adresu URL:
Getter | Wartość zwrotna |
---|---|
getScriptPath(): string |
'/admin/script.php' |
getBasePath(): string |
'/admin/' |
getBaseUrl(): string |
'http://nette.org/admin/' |
getRelativePath(): string |
'script.php' |
getRelativeUrl(): string |
'script.php/pathinfo/?name=param#footer' |
getPathInfo(): string |
'/pathinfo/' |