Arbeiten mit URLs
Die Klassen Url, UrlImmutable und UrlScript ermöglichen das einfache Generieren, Parsen und Manipulieren von URLs.
→ Installation und Anforderungen
Url
Die Klasse Nette\Http\Url ermöglicht das einfache Arbeiten mit URLs und ihren einzelnen Komponenten, die diese Skizze erfasst:
scheme user password host port path query fragment | | | | | | | | /--\ /--\ /------\ /-------\ /--\/----------\ /--------\ /----\ http://john:xyz%2A12@nette.org:8080/en/download?name=param#footer \______\__________________________/ | | hostUrl authority
Das Generieren von URLs ist intuitiv:
use Nette\Http\Url;
$url = new Url;
$url->setScheme('https')
->setHost('localhost')
->setPath('/edit')
->setQueryParameter('foo', 'bar');
echo $url; // 'https://localhost/edit?foo=bar'
Es ist auch möglich, eine URL zu parsen und weiter zu manipulieren:
$url = new Url(
'http://john:xyz%2A12@nette.org:8080/en/download?name=param#footer',
);
Die Klasse Url
implementiert die Schnittstelle JsonSerializable
und hat die Methode
__toString()
, sodass das Objekt ausgegeben oder in Daten verwendet werden kann, die an json_encode()
übergeben werden.
echo $url;
echo json_encode([$url]);
URL-Komponenten
Zum Abrufen oder Ändern einzelner URL-Komponenten stehen Ihnen diese Methoden zur Verfügung:
Setter | Getter | Zurückgegebener Wert |
---|---|---|
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 |
ganze URL |
Warnung: Wenn Sie mit einer URL arbeiten, die aus einer HTTP-Anfrage stammt, beachten Sie, dass sie kein Fragment enthalten wird, da der Browser es nicht an den Server sendet.
Wir können auch mit einzelnen Query-Parametern arbeiten mittels:
Setter | Getter |
---|---|
setQuery(string|array $query) |
getQueryParameters(): array |
setQueryParameter(string $name, $val) |
getQueryParameter(string $name) |
getDomain (int $level = 2): string
Gibt den rechten oder linken Teil des Hosts zurück. So funktioniert es, wenn der Host www.nette.org
ist:
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
Überprüft, ob zwei URLs identisch sind.
$url->isEqual('https://nette.org');
Url::isAbsolute (string $url): bool
Überprüft, ob die URL absolut ist. Eine URL wird als absolut betrachtet, wenn sie mit einem Schema (z. B. http, https, ftp) gefolgt von einem Doppelpunkt beginnt.
Url::isAbsolute('https://nette.org'); // true
Url::isAbsolute('//nette.org'); // false
Url::removeDotSegments (string $path): string
Normalisiert den Pfad in einer URL durch Entfernen der speziellen Segmente .
und ..
. Die Methode
entfernt überflüssige Pfadelemente auf die gleiche Weise, wie es Webbrowser tun.
Url::removeDotSegments('/path/../subtree/./file.txt'); // '/subtree/file.txt'
Url::removeDotSegments('/../foo/./bar'); // '/foo/bar'
Url::removeDotSegments('./today/../file.txt'); // 'file.txt'
UrlImmutable
Die Klasse Nette\Http\UrlImmutable ist eine
immutable (unveränderliche) Alternative zur Klasse Url (ähnlich wie in PHP DateTimeImmutable
eine unveränderliche Alternative zu DateTime
ist). Anstelle von Settern hat sie sogenannte Wither, die das Objekt
nicht ändern, sondern neue Instanzen mit dem geänderten Wert zurückgeben:
use Nette\Http\UrlImmutable;
$url = new UrlImmutable(
'http://john:xyz%2A12@nette.org:8080/en/download?name=param#footer',
);
$newUrl = $url
->withUser('')
->withPassword('')
->withPath('/cs/');
echo $newUrl; // 'http://john:xyz%2A12@nette.org:8080/cs/?name=param#footer'
Die Klasse UrlImmutable
implementiert die Schnittstelle JsonSerializable
und hat die Methode
__toString()
, sodass das Objekt ausgegeben oder in Daten verwendet werden kann, die an json_encode()
übergeben werden.
echo $url;
echo json_encode([$url]);
URL-Komponenten
Zum Abrufen oder Ändern einzelner URL-Komponenten dienen Methoden:
Wither | Getter | Zurückgegebener Wert |
---|---|---|
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 |
ganze URL |
Die Methode withoutUserInfo()
entfernt user
und password
.
Wir können auch mit einzelnen Query-Parametern arbeiten mittels:
Wither | Getter |
---|---|
withQuery(string|array $query) |
getQueryParameters(): array |
withQueryParameter(string $name, $val) |
getQueryParameter(string $name) |
getDomain (int $level = 2): string
Gibt den rechten oder linken Teil des Hosts zurück. So funktioniert es, wenn der Host www.nette.org
ist:
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
Leitet eine absolute URL auf die gleiche Weise ab, wie ein Browser Links auf einer HTML-Seite verarbeitet:
- wenn der Link eine absolute URL ist (Schema enthält), wird er unverändert verwendet
- wenn der Link mit
//
beginnt, wird nur das Schema aus der aktuellen URL übernommen - wenn der Link mit
/
beginnt, wird ein absoluter Pfad vom Domain-Stamm erstellt - in anderen Fällen wird die URL relativ zum aktuellen Pfad zusammengestellt
$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
Überprüft, ob zwei URLs identisch sind.
$url->isEqual('https://nette.org');
UrlScript
Die Klasse Nette\Http\UrlScript ist ein Nachkomme von UrlImmutable und erweitert diese um weitere virtuelle URL-Komponenten, wie das Stammverzeichnis des Projekts usw. Wie die übergeordnete Klasse ist sie ein immutables (unveränderliches) Objekt.
Das folgende Diagramm zeigt die Komponenten, die UrlScript erkennt:
baseUrl basePath relativePath relativeUrl | | | | /---------------/-----\/--------\---------------------------\ http://nette.org/admin/script.php/pathinfo/?name=param#footer \_______________/\________/ | | scriptPath pathInfo
baseUrl
ist die Basis-URL der Anwendung einschließlich Domain und Pfadteil zum Stammverzeichnis der AnwendungbasePath
ist der Pfadteil zum Stammverzeichnis der AnwendungscriptPath
ist der Pfad zum aktuellen SkriptrelativePath
ist der Name des Skripts (ggf. weitere Pfadsegmente) relativ zum basePathrelativeUrl
ist der gesamte Teil der URL nach baseUrl, einschließlich Query-String und Fragment.pathInfo
ist ein heute selten genutzter Teil der URL nach dem Skriptnamen
Zum Abrufen von URL-Teilen stehen Methoden zur Verfügung:
Getter | Zurückgegebener Wert |
---|---|
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/' |
Objekte UrlScript
erstellen wir normalerweise nicht direkt, sondern sie werden von der Methode Nette\Http\Request::getUrl() mit bereits korrekt eingestellten Komponenten für
die aktuelle HTTP-Anfrage zurückgegeben.