URL の操作
クラス Url、UrlImmutable、UrlScript を使用すると、URL の生成、解析、操作が簡単になります。
Url
Nette\Http\Url クラスを使用すると、URL とその個々のコンポーネントを簡単に操作できます。これらは次の図で示されています:
scheme user password host port path query fragment | | | | | | | | /--\ /--\ /------\ /-------\ /--\/----------\ /--------\ /----\ http://john:xyz%2A12@nette.org:8080/en/download?name=param#footer \______\__________________________/ | | hostUrl authority
URL の生成は直感的です:
use Nette\Http\Url;
$url = new Url;
$url->setScheme('https')
->setHost('localhost')
->setPath('/edit')
->setQueryParameter('foo', 'bar');
echo $url; // 'https://localhost/edit?foo=bar'
URL を解析してさらに操作することもできます:
$url = new Url(
'http://john:xyz%2A12@nette.org:8080/en/download?name=param#footer',
);
Url
クラスは JsonSerializable
インターフェースを実装し、__toString()
メソッドを持っているため、オブジェクトを出力したり、json_encode()
に渡されるデータで使用したりできます。
echo $url;
echo json_encode([$url]);
URL コンポーネント
URL の個々のコンポーネントを返すか変更するには、次のメソッドを使用できます:
セッター | ゲッター | 返される値 |
---|---|---|
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 |
完全な URL |
注意:HTTP リクエストから取得した URL を操作する場合、ブラウザはフラグメントをサーバーに送信しないため、フラグメントは含まれないことに注意してください。
個々のクエリパラメータも次のように操作できます:
セッター | ゲッター |
---|---|
setQuery(string|array $query) |
getQueryParameters(): array |
setQueryParameter(string $name, $val) |
getQueryParameter(string $name) |
getDomain (int $level = 2): string
ホストの右側または左側の部分を返します。ホストが 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
2 つの URL が同じかどうかを確認します。
$url->isEqual('https://nette.org');
Url::isAbsolute (string $url): bool
URL が絶対 URL かどうかを確認します。URL は、スキーム(例:http、https、ftp)で始まり、その後にコロンが続く場合に絶対 URL と見なされます。
Url::isAbsolute('https://nette.org'); // true
Url::isAbsolute('//nette.org'); // false
Url::removeDotSegments (string $path): string
特別なセグメント .
と ..
を削除して URL
のパスを正規化します。このメソッドは、Web
ブラウザと同じ方法で余分なパス要素を削除します。
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 クラスは、Url クラスのイミュータブル(不変)な代替です(PHP の DateTimeImmutable
が
DateTime
の不変な代替であるのと同様です)。セッターの代わりに、オブジェクトを変更せず、変更された値を持つ新しいインスタンスを返すウィザーがあります:
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://nette.org:8080/cs/?name=param#footer'
UrlImmutable
クラスは JsonSerializable
インターフェースを実装し、__toString()
メソッドを持っているため、オブジェクトを出力したり、json_encode()
に渡されるデータで使用したりできます。
echo $url;
echo json_encode([$url]);
URL コンポーネント
URL の個々のコンポーネントを返すか変更するには、次のメソッドを使用します:
ウィザー | ゲッター | 返される値 |
---|---|---|
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 |
完全な URL |
withoutUserInfo()
メソッドは user
と password
を削除します。
個々のクエリパラメータも次のように操作できます:
ウィザー | ゲッター |
---|---|
withQuery(string|array $query) |
getQueryParameters(): array |
withQueryParameter(string $name, $val) |
getQueryParameter(string $name) |
getDomain (int $level = 2): string
ホストの右側または左側の部分を返します。ホストが 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
ブラウザが HTML ページ上のリンクを処理するのと同じ方法で絶対 URL を導出します:
- リンクが絶対 URL(スキームを含む)の場合、変更せずに使用されます
- リンクが
//
で始まる場合、現在の URL からスキームのみが引き継がれます - リンクが
/
で始まる場合、ドメインのルートからの絶対パスが作成されます - その他の場合、URL は現在のパスに対して相対的に構築されます
$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
2 つの URL が同じかどうかを確認します。
$url->isEqual('https://nette.org');
UrlScript
Nette\Http\UrlScript クラスは UrlImmutable の子孫であり、プロジェクトのルートディレクトリなどの追加の仮想 URL コンポーネントで拡張します。親クラスと同様に、イミュータブル(不変)なオブジェクトです。
次の図は、UrlScript が認識するコンポーネントを示しています:
baseUrl basePath relativePath relativeUrl | | | | /---------------/-----\/--------\---------------------------\ http://nette.org/admin/script.php/pathinfo/?name=param#footer \_______________/\________/ | | scriptPath pathInfo
baseUrl
は、ドメインとアプリケーションのルートディレクトリへのパスの一部を含む、アプリケーションのベース URL アドレスですbasePath
は、アプリケーションのルートディレクトリへのパスの一部ですscriptPath
は、現在のスクリプトへのパスですrelativePath
は、basePath に対して相対的なスクリプトの名前(および場合によっては追加のパスセグメント)ですrelativeUrl
は、クエリ文字列とフラグメントを含む、baseUrl の後の URL の全体の部分です。pathInfo
は、今日ではあまり使用されない、スクリプト名の後の URL の部分です
URL の部分を返すには、次のメソッドを使用できます:
ゲッター | 返される値 |
---|---|
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/' |
UrlScript
オブジェクトは通常、直接作成しませんが、現在の HTTP
リクエストに対して正しく設定されたコンポーネントを持つ Nette\Http\Request::getUrl() メソッドによって返されます。