URIの操作
CodeIgniterは、アプリケーションでURIを操作するためのオブジェクト指向ソリューションを提供します。これを使用すると、URIがどれほど複雑であっても、構造が常に正しいことを簡単に保証できるだけでなく、既存のURIに相対URIを追加して、安全かつ正しく解決することができます。
URIインスタンスの作成
URIインスタンスの作成は、新しいクラスインスタンスを作成するのと同じくらい簡単です。
新しいインスタンスを作成するときに、コンストラクターで完全または部分的なURLを渡すことができ、適切なセクションに解析されます。
$uri = new \CodeIgniter\HTTP\URI('http://www.example.com/some/path');
または、service()
関数を使用して、インスタンスを返してもらうこともできます。
$uri = service('uri', 'http://www.example.com/some/path');
v4.4.0以降、URLを渡さない場合、現在のURIが返されます。
$uri = service('uri'); // returns the current SiteURI instance.
注
上記のコードは、URI
クラスを拡張したSiteURI
インスタンスを返します。URI
クラスは一般的なURI用ですが、SiteURI
クラスはサイトのURI用です。
現在のURI
多くの場合、本当に必要なのは、このリクエストの現在のURLを表すオブジェクトだけです。current_url()
関数をURLヘルパーで使用できます。
$uri = current_url(true);
最初のパラメーターとしてtrue
を渡す必要があります。そうしないと、現在のURLの文字列表現が返されます。
このURIは、現在のリクエストオブジェクトとConfig\App
(baseURL
、indexPage
、およびforceGlobalSecureRequests
)の設定によって決定されるパス(baseURL
からの相対パス)に基づいています。
CodeIgniter\Controller
を拡張するコントローラーにいると仮定すると、現在のSiteURIインスタンスを取得することもできます。
$uri = $this->request->getUri();
URI文字列
多くの場合、本当に必要なのは、URIの文字列表現を取得することだけです。これは、URIを文字列としてキャストするだけで簡単に行うことができます。
<?php
$uri = current_url(true);
echo (string) $uri; // http://example.com/index.php
URIの構成要素がわかっていて、それらがすべて正しくフォーマットされていることを確認したいだけの場合は、URIクラスの静的なcreateURIString()
メソッドを使用して文字列を生成できます。
<?php
use CodeIgniter\HTTP\URI;
$uriString = URI::createURIString($scheme, $authority, $path, $query, $fragment);
// Creates: http://exmample.com/some/path?foo=bar#first-heading
echo URI::createURIString('http', 'example.com', 'some/path', 'foo=bar', 'first-heading');
重要
URI
が文字列にキャストされると、Config\App
で定義された設定に合わせてプロジェクトURLを調整しようとします。正確で変更されていない文字列表現が必要な場合は、代わりにURI::createURIString()
を使用してください。
URIの構成要素
URIインスタンスを取得したら、URIのさまざまな部分のいずれかを設定または取得できます。このセクションでは、それらの部分が何であるか、およびそれらを操作する方法について詳しく説明します。
スキーム
スキームは、頻繁に「http」または「https」ですが、「file」、「mailto」など、任意のスキームがサポートされています。
<?php
$uri = new \CodeIgniter\HTTP\URI('http://www.example.com/some/path');
echo $uri->getScheme(); // 'http'
$uri->setScheme('https');
ユーザー情報
ユーザー情報セクションは、FTP URIで表示される可能性のあるユーザー名とパスワードです。これをオーソリティの一部として取得できますが、自分で取得することもできます。
<?php
echo $uri->getUserInfo(); // user
デフォルトでは、パスワードは表示されませんが、showPassword()
メソッドで上書きできます。
<?php
echo $uri->showPassword()->getUserInfo(); // user:password
$uri->showPassword(false);
ホスト
URIのホスト部分は、通常、URLのドメイン名です。これは、getHost()
メソッドとsetHost()
メソッドを使用して簡単に設定および取得できます。
<?php
$uri = new \CodeIgniter\HTTP\URI('http://www.example.com/some/path');
echo $uri->getHost(); // www.example.com
echo $uri->setHost('anotherexample.com')->getHost(); // anotherexample.com
ポート
ポートは、0〜65535の整数です。各スキームには、それに関連付けられたデフォルト値があります。
<?php
$uri = new \CodeIgniter\HTTP\URI('ftp://user:[email protected]:21/some/path');
echo $uri->getPort(); // 21
echo $uri->setPort(2201)->getPort(); // 2201
setPort()
メソッドを使用すると、ポートが有効な範囲内にあることが確認され、割り当てられます。
パス
パスは、サイト自体の中のすべてのセグメントです。予想どおり、getPath()
および setPath()
メソッドを使用して操作できます。
<?php
$uri = new \CodeIgniter\HTTP\URI('http://www.example.com/some/path');
echo $uri->getPath(); // '/some/path'
echo $uri->setPath('/another/path')->getPath(); // '/another/path'
注
この方法、またはクラスが許可する他の方法でパスを設定する場合、危険な文字をエンコードし、安全のためにドットセグメントを削除するようにサニタイズされます。
注
v4.4.0以降、SiteURI::getRoutePath()
メソッドは、baseURLに対する相対的なURIパスを返し、SiteURI::getPath()
メソッドは、常に先頭に /
を含む完全なURIパスを返します。
クエリ
クエリデータは、単純な文字列表現を使用してクラスを通じて操作できます。
クエリの取得/設定
現在、クエリ値は文字列としてのみ設定できます。
<?php
$uri = new \CodeIgniter\HTTP\URI('http://www.example.com?foo=bar');
echo $uri->getQuery(); // 'foo=bar'
$uri->setQuery('foo=bar&bar=baz');
setQuery()
メソッドは、既存のクエリ変数を上書きします。
注
クエリ値にフラグメントを含めることはできません。含めると、InvalidArgumentExceptionがスローされます。
配列からのクエリの設定
配列を使用してクエリ値を設定できます。
<?php
$uri->setQueryArray(['foo' => 'bar', 'bar' => 'baz']);
setQueryArray()
メソッドは、既存のクエリ変数を上書きします。
クエリ値の追加
addQuery()
メソッドを使用すると、既存のクエリ変数を破棄せずに、クエリ変数コレクションに値を追加できます。最初のパラメーターは変数の名前、2番目のパラメーターは値です。
<?php
$uri->addQuery('foo', 'bar');
クエリ値のフィルタリング
getQuery()
メソッドに、only または except キーを含むオプション配列を渡すことで、返されるクエリ値をフィルタリングできます。
<?php
$uri = new \CodeIgniter\HTTP\URI('http://www.example.com?foo=bar&bar=baz&baz=foz');
// Returns 'foo=bar'
echo $uri->getQuery(['only' => ['foo']]);
// Returns 'foo=bar&baz=foz'
echo $uri->getQuery(['except' => ['bar']]);
これは、この1回の呼び出し中に返される値を変更するだけです。URIのクエリ値をより永続的に変更する必要がある場合は、
クエリ値の変更
stripQuery()
および keepQuery()
メソッドを使用して、実際のオブジェクトのクエリ変数コレクションを変更できます。
<?php
$uri = new \CodeIgniter\HTTP\URI('http://www.example.com?foo=bar&bar=baz&baz=foz');
// Leaves just the 'baz' variable
$uri->stripQuery('foo', 'bar');
// Leaves just the 'foo' variable
$uri->keepQuery('foo');
注
デフォルトでは、setQuery()
および setQueryArray()
メソッドは、ネイティブの parse_str()
関数を使用してデータを準備します。より自由なルール(キー名にドットを含めることができる)を使用する場合は、事前に特別なメソッド useRawQueryString()
を使用できます。
フラグメント
フラグメントは、URLの末尾部分であり、ポンド記号(#
)が前に付いています。HTML URLでは、これらはページ上のアンカーへのリンクです。メディアURIは、さまざまな他の方法でそれらを利用できます。
<?php
$uri = new \CodeIgniter\HTTP\URI('http://www.example.com/some/path#first-heading');
echo $uri->getFragment(); // 'first-heading'
echo $uri->setFragment('second-heading')->getFragment(); // 'second-heading'
URIセグメント
スラッシュ間のパスの各セクションは、単一のセグメントです。
注
サイトURIの場合、URIセグメントは、baseURLに対する相対的なURIパス部分のみを意味します。baseURLにサブフォルダーが含まれている場合、値は現在のURIパスとは異なります。
URIクラスは、セグメントの値が何であるかを判断する簡単な方法を提供します。セグメントは、パスの最も左側にある1から始まります。
<?php
// URI = http://example.com/users/15/profile
// Prints '15'
if ($uri->getSegment(1) === 'users') {
echo $uri->getSegment(2);
}
getSegment()
メソッドの2番目のパラメーターを使用すると、特定のセグメントに異なるデフォルト値を設定することもできます。デフォルトは空の文字列です。
<?php
// URI = http://example.com/users/15/profile
// will print 'profile'
echo $uri->getSegment(3, 'foo');
// will print 'bar'
echo $uri->getSegment(4, 'bar');
// will throw an exception
echo $uri->getSegment(5, 'baz');
// will print 'baz'
echo $uri->setSilent()->getSegment(5, 'baz');
// will print '' (empty string)
echo $uri->setSilent()->getSegment(5);
注
最後の+1セグメントを取得できます。最後の+2以上のセグメントを取得しようとすると、デフォルトで例外がスローされます。setSilent()
メソッドを使用すると、例外のスローを防ぐことができます。
合計セグメント数を取得できます。
<?php
$total = $uri->getTotalSegments(); // 3
最後に、すべてのセグメントの配列を取得できます。
<?php
$segments = $uri->getSegments();
/*
* Produces:
* [
* 0 => 'users',
* 1 => '15',
* 2 => 'profile',
* ]
*/
例外のスローを無効にする
デフォルトでは、このクラスの一部のメソッドは例外をスローする可能性があります。無効にしたい場合は、例外のスローを防ぐ特別なフラグを設定できます。
<?php
// Disable throwing exceptions
$uri->setSilent();
// Enable throwing exceptions (default)
$uri->setSilent(false);