URL Dienstprogramm
Die Klassen Url, UrlImmutable und UrlScript erleichtern das Verwalten, Parsen und Manipulieren von URLs.
→ Installation und Anforderungen
Url
Die Klasse Nette\Http\Url erleichtert die Arbeit mit der URL und ihren einzelnen Komponenten, die in diesem Diagramm skizziert werden:
scheme user password host port path query fragment | | | | | | | | /--\ /--\ /------\ /-------\ /--\/----------\ /--------\ /----\ http://john:xyz%2A12@nette.org:8080/en/download?name=param#footer \______\__________________________/ | | hostUrl authority
Die URL-Generierung 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'
Sie können die URL auch parsen und dann manipulieren:
$url = new Url(
'http://john:xyz%2A12@nette.org:8080/en/download?name=param#footer',
);
Die Klasse Url
implementiert die Schnittstelle JsonSerializable
und stellt die Methode
__toString()
zur Verfügung, die es ermöglicht, das Objekt zu drucken oder mit json_encode()
zu
verwenden.
echo $url;
echo json_encode([$url]);
URL Components
Die folgenden Methoden sind verfügbar, um einzelne URL-Komponenten zu erhalten oder zu ändern:
Setter | Getter | Rückgabewert |
---|---|---|
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 |
vollständige URL |
Warnung: Bei der Arbeit mit einer URL, die aus einer HTTP-Anfrage stammt, ist zu beachten, dass sie das Fragment nicht enthält, da der Browser es nicht an den Server sendet.
Wir können auch mit einzelnen Abfrageparametern arbeiten:
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
Prüft, ob zwei URLs identisch sind.
$url->isEqual('https://nette.org');
Url::isAbsolute (string $url): bool
Prüft, ob eine URL absolut ist. Eine URL gilt als absolut, wenn sie mit einem Schema beginnt (z. B. http, https, ftp), gefolgt von einem Doppelpunkt.
Url::isAbsolute('https://nette.org'); // true
Url::isAbsolute('//nette.org'); // false
Url::removeDotSegments (string $path): string
Normalisiert einen URL-Pfad durch Entfernen der speziellen Segmente .
und ..
. Diese Methode entfernt
überflüssige Pfadelemente auf die gleiche Weise, wie es die Browser 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
unveränderbare Alternative zur Klasse Url (ähnlich wie DateTimeImmutable
eine
unveränderbare Alternative zu DateTime
in PHP ist). Anstelle von Settern hat sie 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('/en/');
echo $newUrl; // 'http://nette.org:8080/en/?name=param#footer'
Die Klasse UrlImmutable
implementiert die Schnittstelle JsonSerializable
und stellt die Methode
__toString()
zur Verfügung, mit der Sie das Objekt drucken oder mit json_encode()
verwenden
können.
echo $url;
echo json_encode([$url]);
URL Components
Die folgenden Methoden sind verfügbar, um einzelne URL-Komponenten zu erhalten oder zu ändern:
Wither | Getter | Rückgabewert |
---|---|---|
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 |
vollständige URL |
Bei der Methode withoutUserInfo()
werden user
und password
entfernt.
Wir können auch mit einzelnen Abfrageparametern arbeiten, indem wir:
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
Löst einen absoluten URL in der gleichen Weise auf, wie ein Browser Links auf einer HTML-Seite verarbeitet:
- Wenn der Link ein absoluter URL ist (ein Schema enthält), wird er unverändert verwendet.
- Wenn der Link mit
//
beginnt, wird nur das Schema der aktuellen URL verwendet. - Beginnt der Link mit
/
, wird ein absoluter Pfad vom Domänenstamm erstellt. - In anderen Fällen wird die URL relativ zum aktuellen Pfad aufgebaut.
$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
Prüft, ob zwei URLs identisch sind.
$url->isEqual('https://nette.org');
UrlScript
Die Klasse Nette\Http\UrlScript ist ein Abkömmling von UrlImmutable und erweitert diese um zusätzliche virtuelle URL-Komponenten, wie das Stammverzeichnis des Projekts usw. Wie ihre Elternklasse ist sie ein 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 der Domäne und eines Teils des Pfads zum Stammverzeichnis der AnwendungbasePath
ist ein Teil des Pfads zum Stammverzeichnis der AnwendungscriptPath
ist der Pfad zum aktuellen SkriptrelativePath
ist der Skriptname (und möglicherweise zusätzliche Pfadsegmente) relativ zu basePathrelativeUrl
ist der gesamte Teil der URL nach baseUrl, einschließlich Abfragezeichenfolge und Fragment.pathInfo
ist ein jetzt selten verwendeter Teil der URL nach dem Skriptnamen
Die folgenden Methoden sind verfügbar, um diese Teile zu erhalten:
Getter | Rückgabewert |
---|---|
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/' |
Wir erstellen die Objekte UrlScript
nicht direkt, aber die Methode Nette\Http\Request::getUrl() gibt sie zurück.