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\AppbaseURLindexPage、および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');

オーソリティ

多くのURIには、「オーソリティ」としてまとめて知られているいくつかの要素が含まれています。これには、ユーザー情報、ホスト、ポート番号が含まれます。getAuthority()メソッドを使用して、これらのすべての部分を1つの文字列として取得できます。または、個々の部分を操作できます。

<?php

$uri = new \CodeIgniter\HTTP\URI('ftp://user:[email protected]:21/some/path');

echo $uri->getAuthority();  // [email protected]:21

デフォルトでは、パスワードを誰にも見せたくないので、パスワード部分は表示されません。パスワードを表示する場合は、showPassword()メソッドを使用できます。このURIインスタンスは、再びオフにするまでパスワードを表示し続けるため、終了したらすぐにオフにすることを常に確認してください。

<?php

echo $uri->getAuthority();  // [email protected]:21
echo $uri->showPassword()->getAuthority();   // user:[email protected]:21

// Turn password display off again.
$uri->showPassword(false);

ポートを表示したくない場合は、唯一のパラメーターとしてtrueを渡します。

<?php

echo $uri->getAuthority(true);  // [email protected]

現在のポートがスキームのデフォルトポートである場合、表示されることはありません。

ユーザー情報

ユーザー情報セクションは、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);