クラス yii\web\UrlRule
継承 | yii\web\UrlRule » yii\base\BaseObject |
---|---|
実装 | yii\base\Configurable, yii\web\UrlRuleInterface |
利用可能なバージョン | 2.0 |
ソースコード | https://github.com/yiisoft/yii2/blob/master/framework/web/UrlRule.php |
UrlRule は、URL の解析と生成に yii\web\UrlManager によって使用されるルールを表します。
独自の URL 解析と作成ロジックを定義するには、このクラスを拡張し、yii\web\UrlManager::$rules に次のように追加できます。
'rules' => [
['class' => 'MyUrlRule', 'pattern' => '...', 'route' => 'site/index', ...],
// ...
]
公開プロパティ
プロパティ | 型 | 説明 | 定義元 |
---|---|---|---|
$createStatus | integer|null | 最後の createUrl() 呼び出し後の URL 作成の状態。 | yii\web\UrlRule |
$createUrlStatus | integer|null | 最後の createUrl() 呼び出し後の URL 作成の状態。 | yii\web\UrlRule |
$defaults | array | このルールが提供するデフォルトの GET パラメータ (名前 => 値)。 | yii\web\UrlRule |
$encodeParams | boolean | パラメータを URL エンコードするかどうかを示す値。 | yii\web\UrlRule |
$host | string|null | URL のホスト情報部分を解析および作成するために使用されるパターン (例: https://example.com )。 |
yii\web\UrlRule |
$mode | integer|null | このルールをリクエストの解析と URL の作成の両方、解析のみ、または作成のみに使用するかどうかを示す値。 | yii\web\UrlRule |
$name | string|null | このルールの名前。 | yii\web\UrlRule |
$normalizer | yii\web\UrlNormalizer|array|false|null | このルールで使用される yii\web\UrlNormalizer の設定。 | yii\web\UrlRule |
$pattern | string | URL のパス情報部分を解析および作成するために使用されるパターン。 | yii\web\UrlRule |
$placeholders | array | 一致するパラメータ名のプレースホルダーのリスト。 | yii\web\UrlRule |
$route | string | コントローラーアクションへのルート。 | yii\web\UrlRule |
$suffix | string|null | このルールで使用される URL サフィックス。 | yii\web\UrlRule |
$verb | string|array|null | このルールが一致する必要がある HTTP 動詞 (例: GET、POST、DELETE)。 | yii\web\UrlRule |
公開メソッド
メソッド | 説明 | 定義元 |
---|---|---|
__call() | クラスメソッドではない名前付きメソッドを呼び出します。 | yii\base\BaseObject |
__construct() | コンストラクタ。 | yii\base\BaseObject |
__get() | オブジェクトプロパティの値を返します。 | yii\base\BaseObject |
__isset() | プロパティが設定されているかどうか、つまり定義されていて null でないかどうかをチェックします。 | yii\base\BaseObject |
__set() | オブジェクトプロパティの値を設定します。 | yii\base\BaseObject |
__toString() | yii\web\UrlRule | |
__unset() | オブジェクトプロパティを null に設定します。 | yii\base\BaseObject |
canGetProperty() | プロパティを読み取ることができるかどうかを示す値を返します。 | yii\base\BaseObject |
canSetProperty() | プロパティを設定できるかどうかを示す値を返します。 | yii\base\BaseObject |
className() | このクラスの完全修飾名を返します。 | yii\base\BaseObject |
createUrl() | 指定されたルートとパラメータに従って URL を作成します。 | yii\web\UrlRule |
getCreateUrlStatus() | 最後の createUrl() 呼び出し後の URL 作成の状態を返します。 | yii\web\UrlRule |
hasMethod() | メソッドが定義されているかどうかを示す値を返します。 | yii\base\BaseObject |
hasProperty() | プロパティが定義されているかどうかを示す値を返します。 | yii\base\BaseObject |
init() | このルールを初期化します。 | yii\web\UrlRule |
parseRequest() | 指定されたリクエストを解析し、対応するルートとパラメータを返します。 | yii\web\UrlRule |
保護されたメソッド
メソッド | 説明 | 定義元 |
---|---|---|
getNormalizer() | yii\web\UrlRule | |
getParamRules() | パラメータに一致する正規表現のリストを返します。 | yii\web\UrlRule |
hasNormalizer() | yii\web\UrlRule | |
substitutePlaceholderNames() | $placeholders を反復処理し、各プレースホルダーが $matches 配列のキーとして存在するかどうかをチェックします。 | yii\web\UrlRule |
定数
定数 | 値 | 説明 | 定義元 |
---|---|---|---|
CREATE_STATUS_PARAMS_MISMATCH | 4 | パラメータの不一致または不足のために、最後の createUrl() 呼び出しによる URL 生成が失敗したことを表します。 | yii\web\UrlRule |
CREATE_STATUS_PARSING_ONLY | 1 | ルールが URL の作成をサポートしていないために、最後の createUrl() 呼び出しによる URL 生成が失敗したことを表します。 | yii\web\UrlRule |
CREATE_STATUS_ROUTE_MISMATCH | 2 | ルートの不一致のために、最後の createUrl() 呼び出しによる URL 生成が失敗したことを表します。 | yii\web\UrlRule |
CREATE_STATUS_SUCCESS | 0 | 直前のcreateUrl()呼び出しによるURL生成が成功したことを表します。 | yii\web\UrlRule |
CREATION_ONLY | 2 | このルールがURL作成専用であることを示すには、$modeをこの値に設定します。 | yii\web\UrlRule |
PARSING_ONLY | 1 | このルールがURL解析専用であることを示すには、$modeをこの値に設定します。 | yii\web\UrlRule |
プロパティの詳細
最後の createUrl() 呼び出し後の URL 作成の状態。
直前のcreateUrl()呼び出し後のURL作成の状態。ルールが作成状態に関する情報を提供しない場合はnull
。
このルールが提供するデフォルトのGETパラメータ(名前 => 値)。このルールを使用して受信リクエストを解析する場合、このプロパティで宣言された値は$_GETに挿入されます。
URL のホスト情報部分を解析および作成するために使用されるパターン (例: https://example.com
)。
$patternも参照してください。
このルールをリクエストの解析とURLの作成の両方、解析のみ、または作成のみに使用するかどうかを示す値。設定されていないか0の場合は、ルールはリクエストの解析とURLの作成の両方です。PARSING_ONLYの場合は、ルールはリクエストの解析専用です。CREATION_ONLYの場合は、ルールはURL作成専用です。
このルールで使用されるyii\web\UrlNormalizerの構成。null
の場合はyii\web\UrlManager::$normalizerが使用され、false
の場合はこのルールの正規化がスキップされます。
parseRequest()、createUrl()で使用される、一致するパラメータ名のプレースホルダーのリスト。ルールの初期化時に、$patternのパラメータ名はプレースホルダーに置き換えられます。この配列には、元のパラメータ名とそのプレースホルダー間の関係が含まれています。配列のキーはプレースホルダーで、値は元の名前です。
こちらも参照してください
このルールで使用されるURLサフィックス。たとえば、 ".html" を使用して、URLが静的HTMLページを指しているように見せることができます。設定されていない場合、yii\web\UrlManager::$suffixの値が使用されます。
メソッドの詳細
定義されている場所: yii\base\BaseObject::__call()
クラスメソッドではない名前付きメソッドを呼び出します。
これはPHPのマジックメソッドであり、不明なメソッドが呼び出されたときに暗黙的に呼び出されるため、直接呼び出さないでください。
public mixed __call ( $name, $params ) | ||
$name | string |
メソッド名 |
$params | array |
メソッドパラメータ |
戻り値 | mixed |
メソッドの戻り値 |
---|---|---|
例外 | yii\base\UnknownMethodException |
不明なメソッドを呼び出した場合 |
public function __call($name, $params)
{
throw new UnknownMethodException('Calling unknown method: ' . get_class($this) . "::$name()");
}
定義されている場所: yii\base\BaseObject::__construct()
コンストラクタ。
デフォルトの実装では、次の2つのことを行います。
- 指定された設定 `$config` を使用してオブジェクトを初期化します。
- init() を呼び出します。
このメソッドを子クラスでオーバーライドする場合は、
- コンストラクタの最後のパラメータが、ここにある `$config` のような設定配列であることをお勧めします。
- コンストラクタの最後に親の実装を呼び出してください。
public void __construct ( $config = [] ) | ||
$config | array |
オブジェクトのプロパティを初期化するために使用される名前と値のペア |
public function __construct($config = [])
{
if (!empty($config)) {
Yii::configure($this, $config);
}
$this->init();
}
定義されている場所: yii\base\BaseObject::__get()
オブジェクトプロパティの値を返します。
`$value = $object->property;` を実行したときに暗黙的に呼び出されるPHPのマジックメソッドであるため、直接呼び出さないでください。
__set() も参照してください。
public mixed __get ( $name ) | ||
$name | string |
プロパティ名 |
戻り値 | mixed |
プロパティの値 |
---|---|---|
例外 | yii\base\UnknownPropertyException |
プロパティが定義されていない場合 |
例外 | yii\base\InvalidCallException |
プロパティが書き込み専用の場合 |
public function __get($name)
{
$getter = 'get' . $name;
if (method_exists($this, $getter)) {
return $this->$getter();
} elseif (method_exists($this, 'set' . $name)) {
throw new InvalidCallException('Getting write-only property: ' . get_class($this) . '::' . $name);
}
throw new UnknownPropertyException('Getting unknown property: ' . get_class($this) . '::' . $name);
}
定義されている場所: yii\base\BaseObject::__isset()
プロパティが設定されているかどうか、つまり定義されていて null でないかどうかをチェックします。
`isset($object->property)` を実行したときに暗黙的に呼び出されるPHPのマジックメソッドであるため、直接呼び出さないでください。
プロパティが定義されていない場合、falseが返されることに注意してください。
public boolean __isset ( $name ) | ||
$name | string |
プロパティ名またはイベント名 |
戻り値 | boolean |
指定されたプロパティが設定されているかどうか(nullではないか)。 |
---|
public function __isset($name)
{
$getter = 'get' . $name;
if (method_exists($this, $getter)) {
return $this->$getter() !== null;
}
return false;
}
定義されている場所: yii\base\BaseObject::__set()
オブジェクトプロパティの値を設定します。
`$object->property = $value;` を実行したときに暗黙的に呼び出されるPHPのマジックメソッドであるため、直接呼び出さないでください。
__get() も参照してください。
public void __set ( $name, $value ) | ||
$name | string |
プロパティ名またはイベント名 |
$value | mixed |
プロパティの値 |
例外 | yii\base\UnknownPropertyException |
プロパティが定義されていない場合 |
---|---|---|
例外 | yii\base\InvalidCallException |
プロパティが読み取り専用の場合 |
public function __set($name, $value)
{
$setter = 'set' . $name;
if (method_exists($this, $setter)) {
$this->$setter($value);
} elseif (method_exists($this, 'get' . $name)) {
throw new InvalidCallException('Setting read-only property: ' . get_class($this) . '::' . $name);
} else {
throw new UnknownPropertyException('Setting unknown property: ' . get_class($this) . '::' . $name);
}
}
public string __toString ( ) |
public function __toString()
{
$str = '';
if ($this->verb !== null) {
$str .= implode(',', $this->verb) . ' ';
}
if ($this->host !== null && strrpos($this->name, $this->host) === false) {
$str .= $this->host . '/';
}
$str .= $this->name;
if ($str === '') {
return '/';
}
return $str;
}
定義されている場所: yii\base\BaseObject::__unset()
オブジェクトプロパティを null に設定します。
`unset($object->property)` を実行したときに暗黙的に呼び出されるPHPのマジックメソッドであるため、直接呼び出さないでください。
プロパティが定義されていない場合、このメソッドは何もしません。プロパティが読み取り専用の場合、例外をスローします。
public void __unset ( $name ) | ||
$name | string |
プロパティ名 |
例外 | yii\base\InvalidCallException |
プロパティが読み取り専用の場合。 |
---|
public function __unset($name)
{
$setter = 'set' . $name;
if (method_exists($this, $setter)) {
$this->$setter(null);
} elseif (method_exists($this, 'get' . $name)) {
throw new InvalidCallException('Unsetting read-only property: ' . get_class($this) . '::' . $name);
}
}
定義されている場所: yii\base\BaseObject::canGetProperty()
プロパティを読み取ることができるかどうかを示す値を返します。
プロパティは、次の場合に読み取り可能です。
- クラスに、指定された名前と関連付けられたゲッターメソッドがある場合(この場合、プロパティ名はケースインセンシティブです)。
- クラスに、指定された名前のメンバー変数がある場合(`$checkVars` がtrueの場合)。
canSetProperty() も参照してください。
public boolean canGetProperty ( $name, $checkVars = true ) | ||
$name | string |
プロパティ名 |
$checkVars | boolean |
メンバー変数をプロパティとして扱うかどうか |
戻り値 | boolean |
プロパティを読み取ることができるかどうか |
---|
public function canGetProperty($name, $checkVars = true)
{
return method_exists($this, 'get' . $name) || $checkVars && property_exists($this, $name);
}
定義されている場所: yii\base\BaseObject::canSetProperty()
プロパティを設定できるかどうかを示す値を返します。
プロパティは、次の場合に書き込み可能です。
- クラスに、指定された名前と関連付けられたセッターメソッドがある場合(この場合、プロパティ名はケースインセンシティブです)。
- クラスに、指定された名前のメンバー変数がある場合(`$checkVars` がtrueの場合)。
canGetProperty() も参照してください。
public boolean canSetProperty ( $name, $checkVars = true ) | ||
$name | string |
プロパティ名 |
$checkVars | boolean |
メンバー変数をプロパティとして扱うかどうか |
戻り値 | boolean |
プロパティを書き込むことができるかどうか |
---|
public function canSetProperty($name, $checkVars = true)
{
return method_exists($this, 'set' . $name) || $checkVars && property_exists($this, $name);
}
定義されている場所: yii\base\BaseObject::className()
このクラスの完全修飾名を返します。
public static string className ( ) | ||
戻り値 | string |
このクラスの完全修飾名。 |
---|
public static function className()
{
return get_called_class();
}
指定されたルートとパラメータに従って URL を作成します。
public 文字列|ブール値 createUrl ( $manager, $route, $params ) | ||
$manager | yii\web\UrlManager |
URLマネージャー |
$route | string |
ルート。先頭と末尾にスラッシュを含んではいけません。 |
$params | array |
パラメーター |
戻り値 | 文字列|ブール値 |
生成されたURL、またはこのルールがこのURLの生成に使用できない場合は |
---|
public function createUrl($manager, $route, $params)
{
if ($this->mode === self::PARSING_ONLY) {
$this->createStatus = self::CREATE_STATUS_PARSING_ONLY;
return false;
}
$tr = [];
// match the route part first
if ($route !== $this->route) {
if ($this->_routeRule !== null && preg_match($this->_routeRule, $route, $matches)) {
$matches = $this->substitutePlaceholderNames($matches);
foreach ($this->_routeParams as $name => $token) {
if (isset($this->defaults[$name]) && strcmp($this->defaults[$name], $matches[$name]) === 0) {
$tr[$token] = '';
} else {
$tr[$token] = $matches[$name];
}
}
} else {
$this->createStatus = self::CREATE_STATUS_ROUTE_MISMATCH;
return false;
}
}
// match default params
// if a default param is not in the route pattern, its value must also be matched
foreach ($this->defaults as $name => $value) {
if (isset($this->_routeParams[$name])) {
continue;
}
if (!isset($params[$name])) {
// allow omit empty optional params
// @see https://github.com/yiisoft/yii2/issues/10970
if (in_array($name, $this->placeholders) && strcmp($value, '') === 0) {
$params[$name] = '';
} else {
$this->createStatus = self::CREATE_STATUS_PARAMS_MISMATCH;
return false;
}
}
if (strcmp($params[$name], $value) === 0) { // strcmp will do string conversion automatically
unset($params[$name]);
if (isset($this->_paramRules[$name])) {
$tr["<$name>"] = '';
}
} elseif (!isset($this->_paramRules[$name])) {
$this->createStatus = self::CREATE_STATUS_PARAMS_MISMATCH;
return false;
}
}
// match params in the pattern
foreach ($this->_paramRules as $name => $rule) {
if (isset($params[$name]) && !is_array($params[$name]) && ($rule === '' || preg_match($rule, $params[$name]))) {
$tr["<$name>"] = $this->encodeParams ? urlencode($params[$name]) : $params[$name];
unset($params[$name]);
} elseif (!isset($this->defaults[$name]) || isset($params[$name])) {
$this->createStatus = self::CREATE_STATUS_PARAMS_MISMATCH;
return false;
}
}
$url = $this->trimSlashes(strtr($this->_template, $tr));
if ($this->host !== null) {
$pos = strpos($url, '/', 8);
if ($pos !== false) {
$url = substr($url, 0, $pos) . preg_replace('#/+#', '/', substr($url, $pos));
}
} elseif (strpos($url, '//') !== false) {
$url = preg_replace('#/+#', '/', trim($url, '/'));
}
if ($url !== '') {
$url .= ($this->suffix === null ? $manager->suffix : $this->suffix);
}
if (!empty($params) && ($query = http_build_query($params)) !== '') {
$url .= '?' . $query;
}
$this->createStatus = self::CREATE_STATUS_SUCCESS;
return $url;
}
最後の createUrl() 呼び出し後の URL 作成の状態を返します。
参照: $createStatus.
public 整数|null getCreateUrlStatus ( ) | ||
戻り値 | integer|null |
直前のcreateUrl()呼び出し後のURL作成の状態。ルールが作成状態に関する情報を提供しない場合は |
---|
public function getCreateUrlStatus()
{
return $this->createStatus;
}
protected yii\web\UrlNormalizer|null getNormalizer ( $manager ) | ||
$manager | yii\web\UrlManager |
URLマネージャー |
protected function getNormalizer($manager)
{
if ($this->normalizer === null) {
return $manager->normalizer;
}
return $this->normalizer;
}
パラメータに一致する正規表現のリストを返します。
protected 配列 getParamRules ( ) | ||
戻り値 | array |
パラメーターキーと正規表現ルール。 |
---|
protected function getParamRules()
{
return $this->_paramRules;
}
定義先: yii\base\BaseObject::hasMethod()
メソッドが定義されているかどうかを示す値を返します。
デフォルトの実装はPHP関数method_exists()
の呼び出しです。PHPマジックメソッド__call()
を実装した場合は、このメソッドをオーバーライドできます。
public ブール値 hasMethod ( $name ) | ||
$name | string |
メソッド名 |
戻り値 | boolean |
メソッドが定義されているかどうか |
---|
public function hasMethod($name)
{
return method_exists($this, $name);
}
protected ブール値 hasNormalizer ( $manager ) | ||
$manager | yii\web\UrlManager |
URLマネージャー |
protected function hasNormalizer($manager)
{
return $this->getNormalizer($manager) instanceof UrlNormalizer;
}
定義先: yii\base\BaseObject::hasProperty()
プロパティが定義されているかどうかを示す値を返します。
プロパティは、以下の場合に定義されます。
- 指定された名前に関連付けられたゲッターまたはセッターメソッドがクラスに存在する場合(この場合、プロパティ名はケースインセンシティブです)。
- クラスに、指定された名前のメンバー変数がある場合(`$checkVars` がtrueの場合)。
こちらも参照してください
public ブール値 hasProperty ( $name, $checkVars = true ) | ||
$name | string |
プロパティ名 |
$checkVars | boolean |
メンバー変数をプロパティとして扱うかどうか |
戻り値 | boolean |
プロパティが定義されているかどうか |
---|
public function hasProperty($name, $checkVars = true)
{
return $this->canGetProperty($name, $checkVars) || $this->canSetProperty($name, false);
}
このルールを初期化します。
public void init ( ) |
public function init()
{
if ($this->pattern === null) {
throw new InvalidConfigException('UrlRule::pattern must be set.');
}
if ($this->route === null) {
throw new InvalidConfigException('UrlRule::route must be set.');
}
if (is_array($this->normalizer)) {
$normalizerConfig = array_merge(['class' => UrlNormalizer::className()], $this->normalizer);
$this->normalizer = Yii::createObject($normalizerConfig);
}
if ($this->normalizer !== null && $this->normalizer !== false && !$this->normalizer instanceof UrlNormalizer) {
throw new InvalidConfigException('Invalid config for UrlRule::normalizer.');
}
if ($this->verb !== null) {
if (is_array($this->verb)) {
foreach ($this->verb as $i => $verb) {
$this->verb[$i] = strtoupper($verb);
}
} else {
$this->verb = [strtoupper($this->verb)];
}
}
if ($this->name === null) {
$this->name = $this->pattern;
}
$this->preparePattern();
}
指定されたリクエストを解析し、対応するルートとパラメータを返します。
public 配列|ブール値 parseRequest ( $manager, $request ) | ||
$manager | yii\web\UrlManager |
URLマネージャー |
$request | yii\web\Request |
リクエストコンポーネント |
戻り値 | 配列|ブール値 |
解析結果。ルートとパラメーターは配列として返されます。 |
---|
public function parseRequest($manager, $request)
{
if ($this->mode === self::CREATION_ONLY) {
return false;
}
if (!empty($this->verb) && !in_array($request->getMethod(), $this->verb, true)) {
return false;
}
$suffix = (string) ($this->suffix === null ? $manager->suffix : $this->suffix);
$pathInfo = $request->getPathInfo();
$normalized = false;
if ($this->hasNormalizer($manager)) {
$pathInfo = $this->getNormalizer($manager)->normalizePathInfo($pathInfo, $suffix, $normalized);
}
if ($suffix !== '' && $pathInfo !== '') {
$n = strlen($suffix);
if (substr_compare($pathInfo, $suffix, -$n, $n) === 0) {
$pathInfo = substr($pathInfo, 0, -$n);
if ($pathInfo === '') {
// suffix alone is not allowed
return false;
}
} else {
return false;
}
}
if ($this->host !== null) {
$pathInfo = strtolower($request->getHostInfo()) . ($pathInfo === '' ? '' : '/' . $pathInfo);
}
if (!preg_match($this->pattern, $pathInfo, $matches)) {
return false;
}
$matches = $this->substitutePlaceholderNames($matches);
foreach ($this->defaults as $name => $value) {
if (!isset($matches[$name]) || $matches[$name] === '') {
$matches[$name] = $value;
}
}
$params = $this->defaults;
$tr = [];
foreach ($matches as $name => $value) {
if (isset($this->_routeParams[$name])) {
$tr[$this->_routeParams[$name]] = $value;
unset($params[$name]);
} elseif (isset($this->_paramRules[$name])) {
$params[$name] = $value;
}
}
if ($this->_routeRule !== null) {
$route = strtr($this->route, $tr);
} else {
$route = $this->route;
}
Yii::debug("Request parsed with URL rule: {$this->name}", __METHOD__);
if ($normalized) {
// pathInfo was changed by normalizer - we need also normalize route
return $this->getNormalizer($manager)->normalizeRoute([$route, $params]);
}
return [$route, $params];
}
$placeholders を反復処理し、各プレースホルダーが $matches 配列のキーとして存在するかどうかをチェックします。
見つかった場合、このプレースホルダーキーを一致するパラメーターの適切な名前に置き換えます。parseRequest()、createUrl()で使用されます。
参照: $placeholders.
protected 配列 substitutePlaceholderNames ( 配列 $matches ) | ||
$matches | array |
|
戻り値 | array |
プレースホルダーキーが置き換えられた入力配列 |
---|
protected function substitutePlaceholderNames(array $matches)
{
foreach ($this->placeholders as $placeholder => $name) {
if (isset($matches[$placeholder])) {
$matches[$name] = $matches[$placeholder];
unset($matches[$placeholder]);
}
}
return $matches;
}
サインアップ または ログイン してコメントしてください。