1 follower

クラス yii\filters\RateLimiter

継承yii\filters\RateLimiter » yii\base\ActionFilter » yii\base\Behavior » yii\base\BaseObject
実装yii\base\Configurable
利用可能なバージョン2.0
ソースコード https://github.com/yiisoft/yii2/blob/master/framework/filters/RateLimiter.php

RateLimiter は、リーキーバケットアルゴリズム に基づくレート制限アルゴリズムを実装します。

RateLimiter は、次のように、コントローラまたはモジュールにビヘイビアとしてアタッチすることで使用できます。

public function behaviors()
{
    return [
        'rateLimiter' => [
            'class' => \yii\filters\RateLimiter::class,
        ],
    ];
}

ユーザーがレート制限を超過すると、RateLimiter は yii\web\TooManyRequestsHttpException 例外をスローします。

RateLimiter は、$useryii\filters\RateLimitInterface を実装することを必要とすることに注意してください。$user が設定されていないか、または yii\filters\RateLimitInterface を実装していない場合、RateLimiter は何も行いません。

公開プロパティ

継承されたプロパティを非表示

プロパティ 説明 定義元
$enableRateLimitHeaders boolean レスポンスにレート制限ヘッダーを含めるかどうか yii\filters\RateLimiter
$errorMessage string レート制限を超えたときに表示されるメッセージ yii\filters\RateLimiter
$except array このフィルタを適用すべきでないアクション ID のリスト。 yii\base\ActionFilter
$only array このフィルタを適用すべきアクション ID のリスト。 yii\base\ActionFilter
$owner yii\base\Component|null このビヘイビアのオーナー yii\base\Behavior
$request yii\web\Request|null 現在のリクエスト。 yii\filters\RateLimiter
$response yii\web\Response|null 送信されるレスポンス。 yii\filters\RateLimiter
$user yii\filters\RateLimitInterface|Closure|null RateLimitInterface を実装するユーザーオブジェクト。 yii\filters\RateLimiter

公開メソッド

継承されたメソッドを非表示

メソッド 説明 定義元
__call() クラスメソッドではない名前付きメソッドを呼び出します。 yii\base\BaseObject
__construct() コンストラクタ。 yii\base\BaseObject
__get() オブジェクトのプロパティの値を返します。 yii\base\BaseObject
__isset() プロパティが設定されているか (すなわち、定義されていて null でないか) をチェックします。 yii\base\BaseObject
__set() オブジェクトのプロパティの値を設定します。 yii\base\BaseObject
__unset() オブジェクトのプロパティを null に設定します。 yii\base\BaseObject
addRateLimitHeaders() レスポンスにレート制限ヘッダーを追加します。 yii\filters\RateLimiter
afterAction() このメソッドは、アクションが実行された直後に呼び出されます。 yii\base\ActionFilter
afterFilter() yii\base\ActionFilter
attach() ビヘイビアオブジェクトをコンポーネントにアタッチします。 yii\base\ActionFilter
beforeAction() このメソッドは、アクションが実行される直前 (すべての可能なフィルタの後) に呼び出されます。このメソッドをオーバーライドして、アクションの直前の準備を行うことができます。 yii\filters\RateLimiter
beforeFilter() yii\base\ActionFilter
canGetProperty() プロパティが読み取り可能かどうかを示す値を返します。 yii\base\BaseObject
canSetProperty() プロパティが設定可能かどうかを示す値を返します。 yii\base\BaseObject
checkRateLimit() レート制限を超えているかどうかをチェックします。 yii\filters\RateLimiter
className() このクラスの完全修飾名を返します。 yii\base\BaseObject
detach() ビヘイビアオブジェクトをコンポーネントからデタッチします。 yii\base\ActionFilter
events() $owner のイベントのイベントハンドラを宣言します。 yii\base\Behavior
hasMethod() メソッドが定義されているかどうかを示す値を返します。 yii\base\BaseObject
hasProperty() プロパティが定義されているかどうかを示す値を返します。 yii\base\BaseObject
init() オブジェクトを初期化します。 yii\filters\RateLimiter

保護されたメソッド

継承されたメソッドを非表示

メソッド 説明 定義元
getActionId() yii\base\Action::$uniqueId をモジュールに対する相対的な ID に変換して、アクション ID を返します。 yii\base\ActionFilter
isActive() 指定されたアクションに対してフィルタがアクティブかどうかを示す値を返します。 yii\base\ActionFilter

プロパティの詳細

継承されたプロパティを非表示

$enableRateLimitHeaders 公開プロパティ

レスポンスにレート制限ヘッダーを含めるかどうか

$errorMessage 公開プロパティ

レート制限を超えたときに表示されるメッセージ

public string $errorMessage 'レート制限を超えました。'
$request 公開プロパティ

現在のリクエスト。設定されていない場合は、request アプリケーションコンポーネントが使用されます。

$response public プロパティ

送信されるレスポンス。設定されていない場合は、response アプリケーションコンポーネントが使用されます。

$user public プロパティ

RateLimitInterfaceを実装するユーザーオブジェクト。設定されていない場合は、Yii::$app->user->getIdentity(false) の値が使用されます。 {@since 2.0.38} 実行時にユーザーIDを割り当てるためにクロージャ関数を提供できます。標準の Yii::$app->user コンポーネントを使用していない場合は、クロージャを使用してユーザーIDを割り当てることをお勧めします。以下の例を参照してください。 `php 'user' => function() {

return Yii::$app->apiUser->identity;

} `

メソッド詳細

継承されたメソッドを非表示

__call() public メソッド

定義元: yii\base\BaseObject::__call()

クラスメソッドではない名前付きメソッドを呼び出します。

不明なメソッドが呼び出されたときに暗黙的に呼び出されるPHPのマジックメソッドであるため、このメソッドを直接呼び出さないでください。

public mixed __call ( $name, $params )
$name string

メソッド名

$params array

メソッドのパラメータ

return mixed

メソッドの戻り値

throws yii\base\UnknownMethodException

不明なメソッドを呼び出すとき

                public function __call($name, $params)
{
    throw new UnknownMethodException('Calling unknown method: ' . get_class($this) . "::$name()");
}

            
__construct() public メソッド

定義元: 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();
}

            
__get() public メソッド

定義元: yii\base\BaseObject::__get()

オブジェクトのプロパティの値を返します。

$value = $object->property; を実行するときに暗黙的に呼び出されるPHPのマジックメソッドであるため、このメソッドを直接呼び出さないでください。

__set() も参照してください。

public mixed __get ( $name )
$name string

プロパティ名

return mixed

プロパティの値

throws yii\base\UnknownPropertyException

プロパティが定義されていない場合

throws 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);
}

            
__isset() public メソッド

定義元: yii\base\BaseObject::__isset()

プロパティが設定されているか (すなわち、定義されていて null でないか) をチェックします。

isset($object->property) を実行するときに暗黙的に呼び出されるPHPのマジックメソッドであるため、このメソッドを直接呼び出さないでください。

プロパティが定義されていない場合は、falseが返されることに注意してください。

https://www.php.net/manual/en/function.isset.php も参照してください。

public boolean __isset ( $name )
$name string

プロパティ名またはイベント名

return boolean

指定されたプロパティが設定されている(nullではない)かどうか。

                public function __isset($name)
{
    $getter = 'get' . $name;
    if (method_exists($this, $getter)) {
        return $this->$getter() !== null;
    }
    return false;
}

            
__set() public メソッド

定義元: yii\base\BaseObject::__set()

オブジェクトのプロパティの値を設定します。

$object->property = $value; を実行するときに暗黙的に呼び出されるPHPのマジックメソッドであるため、このメソッドを直接呼び出さないでください。

__get() も参照してください。

public void __set ( $name, $value )
$name string

プロパティ名またはイベント名

$value mixed

プロパティの値

throws yii\base\UnknownPropertyException

プロパティが定義されていない場合

throws 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);
    }
}

            
__unset() public メソッド

定義元: yii\base\BaseObject::__unset()

オブジェクトのプロパティを null に設定します。

unset($object->property) を実行するときに暗黙的に呼び出されるPHPのマジックメソッドであるため、このメソッドを直接呼び出さないでください。

プロパティが定義されていない場合、このメソッドは何もしないことに注意してください。プロパティが読み取り専用の場合は、例外がスローされます。

https://www.php.net/manual/en/function.unset.php も参照してください。

public void __unset ( $name )
$name string

プロパティ名

throws 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);
    }
}

            
addRateLimitHeaders() public メソッド

レスポンスにレート制限ヘッダーを追加します。

public void addRateLimitHeaders ( $response, $limit, $remaining, $reset )
$response yii\web\Response
$limit integer

期間中に許可されるリクエストの最大数

$remaining integer

現在の期間内に許可される残りのリクエスト数

$reset integer

再び許可されるリクエストの最大数になるまで待つ秒数

                public function addRateLimitHeaders($response, $limit, $remaining, $reset)
{
    if ($this->enableRateLimitHeaders) {
        $response->getHeaders()
            ->set('X-Rate-Limit-Limit', $limit)
            ->set('X-Rate-Limit-Remaining', $remaining)
            ->set('X-Rate-Limit-Reset', $reset);
    }
}

            
afterAction() public メソッド

定義元: yii\base\ActionFilter::afterAction()

このメソッドは、アクションが実行された直後に呼び出されます。

このメソッドをオーバーライドして、アクションの事後処理を行うことができます。

public mixed afterAction ( $action, $result )
$action yii\base\Action

実行されたばかりのアクション。

$result mixed

アクションの実行結果

return mixed

処理済みのアクション結果。

                public function afterAction($action, $result)
{
    return $result;
}

            
afterFilter() public メソッド
public void afterFilter ( $event )
$event yii\base\ActionEvent

                public function afterFilter($event)
{
    $event->result = $this->afterAction($event->action, $event->result);
    $this->owner->off(Controller::EVENT_AFTER_ACTION, [$this, 'afterFilter']);
}

            
attach() public メソッド

定義元: yii\base\ActionFilter::attach()

ビヘイビアオブジェクトをコンポーネントにアタッチします。

デフォルトの実装では、$owner プロパティを設定し、events() で宣言されているイベントハンドラをアタッチします。このメソッドをオーバーライドする場合は、必ず親の実装を呼び出してください。

public void attach ( $owner )
$owner yii\base\Component

このビヘイビアがアタッチされるコンポーネント。

                public function attach($owner)
{
    $this->owner = $owner;
    $owner->on(Controller::EVENT_BEFORE_ACTION, [$this, 'beforeFilter']);
}

            
beforeAction() public メソッド

このメソッドは、アクションが実行される直前 (すべての可能なフィルタの後) に呼び出されます。このメソッドをオーバーライドして、アクションの直前の準備を行うことができます。

public boolean beforeAction ( $action )
$action yii\base\Action

実行されるアクション。

return boolean

アクションが引き続き実行されるべきかどうか。

                public function beforeAction($action)
{
    if ($this->user === null && Yii::$app->getUser()) {
        $this->user = Yii::$app->getUser()->getIdentity(false);
    }
    if ($this->user instanceof Closure) {
        $this->user = call_user_func($this->user, $action);
    }
    if ($this->user instanceof RateLimitInterface) {
        Yii::debug('Check rate limit', __METHOD__);
        $this->checkRateLimit($this->user, $this->request, $this->response, $action);
    } elseif ($this->user) {
        Yii::info('Rate limit skipped: "user" does not implement RateLimitInterface.', __METHOD__);
    } else {
        Yii::info('Rate limit skipped: user not logged in.', __METHOD__);
    }
    return true;
}

            
beforeFilter() public メソッド
public void beforeFilter ( $event )
$event yii\base\ActionEvent

                public function beforeFilter($event)
{
    if (!$this->isActive($event->action)) {
        return;
    }
    $event->isValid = $this->beforeAction($event->action);
    if ($event->isValid) {
        // call afterFilter only if beforeFilter succeeds
        // beforeFilter and afterFilter should be properly nested
        $this->owner->on(Controller::EVENT_AFTER_ACTION, [$this, 'afterFilter'], null, false);
    } else {
        $event->handled = true;
    }
}

            
canGetProperty() public メソッド

定義元: yii\base\BaseObject::canGetProperty()

プロパティが読み取り可能かどうかを示す値を返します。

プロパティが読み取り可能であるのは、以下の場合です。

  • クラスが指定された名前に関連付けられたゲッターメソッドを持っている場合(この場合、プロパティ名は大文字と小文字を区別しません)。
  • クラスが指定された名前のメンバ変数を持っている場合($checkVars が true の場合)。

canSetProperty() も参照してください。

public boolean canGetProperty ( $name, $checkVars true )
$name string

プロパティ名

$checkVars boolean

メンバ変数をプロパティとして扱うかどうか

return boolean

プロパティが読み取り可能かどうか

                public function canGetProperty($name, $checkVars = true)
{
    return method_exists($this, 'get' . $name) || $checkVars && property_exists($this, $name);
}

            
canSetProperty() public メソッド

定義元: yii\base\BaseObject::canSetProperty()

プロパティが設定可能かどうかを示す値を返します。

プロパティが書き込み可能であるのは、以下の場合です。

  • クラスが指定された名前に関連付けられたセッターメソッドを持っている場合(この場合、プロパティ名は大文字と小文字を区別しません)。
  • クラスが指定された名前のメンバ変数を持っている場合($checkVars が true の場合)。

canGetProperty() も参照してください。

public boolean canSetProperty ( $name, $checkVars true )
$name string

プロパティ名

$checkVars boolean

メンバ変数をプロパティとして扱うかどうか

return boolean

プロパティが書き込み可能かどうか

                public function canSetProperty($name, $checkVars = true)
{
    return method_exists($this, 'set' . $name) || $checkVars && property_exists($this, $name);
}

            
checkRateLimit() public メソッド

レート制限を超えているかどうかをチェックします。

public void checkRateLimit ( $user, $request, $response, $action )
$user yii\filters\RateLimitInterface

現在のユーザー

$request yii\web\Request
$response yii\web\Response
$action yii\base\Action

実行されるアクション

throws yii\web\TooManyRequestsHttpException

レート制限を超過した場合

                public function checkRateLimit($user, $request, $response, $action)
{
    list($limit, $window) = $user->getRateLimit($request, $action);
    list($allowance, $timestamp) = $user->loadAllowance($request, $action);
    $current = time();
    $allowance += (int) (($current - $timestamp) * $limit / $window);
    if ($allowance > $limit) {
        $allowance = $limit;
    }
    if ($allowance < 1) {
        $user->saveAllowance($request, $action, 0, $current);
        $this->addRateLimitHeaders($response, $limit, 0, $window);
        throw new TooManyRequestsHttpException($this->errorMessage);
    }
    $user->saveAllowance($request, $action, $allowance - 1, $current);
    $this->addRateLimitHeaders($response, $limit, $allowance - 1, (int) (($limit - $allowance + 1) * $window / $limit));
}

            
className() public static メソッド
2.0.14 から非推奨。PHP >=5.5 では ::class を代わりに使用してください。

定義元: yii\base\BaseObject::className()

このクラスの完全修飾名を返します。

public static string className ( )
return string

このクラスの完全修飾名。

                public static function className()
{
    return get_called_class();
}

            
detach() public メソッド

定義元: yii\base\ActionFilter::detach()

ビヘイビアオブジェクトをコンポーネントからデタッチします。

デフォルトの実装では、$owner プロパティを unset し、events() で宣言されているイベントハンドラをデタッチします。このメソッドをオーバーライドする場合は、必ず親の実装を呼び出してください。

public void detach ( )

                public function detach()
{
    if ($this->owner) {
        $this->owner->off(Controller::EVENT_BEFORE_ACTION, [$this, 'beforeFilter']);
        $this->owner->off(Controller::EVENT_AFTER_ACTION, [$this, 'afterFilter']);
        $this->owner = null;
    }
}

            
events() public メソッド

定義元: yii\base\Behavior::events()

$owner のイベントのイベントハンドラを宣言します。

子クラスはこのメソッドをオーバーライドして、$owner コンポーネントのイベントにアタッチされるべき PHP コールバックを宣言できます。

コールバックは、ビヘイビアがオーナーにアタッチされるときに $owner のイベントにアタッチされ、ビヘイビアがコンポーネントからデタッチされるときにイベントからデタッチされます。

コールバックは、以下のいずれかになります。

  • このビヘイビアのメソッド:'handleClick'[$this, 'handleClick'] と同等
  • オブジェクトメソッド:[$object, 'handleClick']
  • 静的メソッド:['Page', 'handleClick']
  • 匿名関数:function ($event) { ... }

以下に例を示します

[
    Model::EVENT_BEFORE_VALIDATE => 'myBeforeValidate',
    Model::EVENT_AFTER_VALIDATE => 'myAfterValidate',
]
public array events ( )
return array

イベント(配列のキー)と対応するイベントハンドラメソッド(配列の値)。

                public function events()
{
    return [];
}

            
getActionId() protected メソッド (バージョン 2.0.7 から利用可能)

定義元: yii\base\ActionFilter::getActionId()

yii\base\Action::$uniqueId をモジュールに対する相対的な ID に変換して、アクション ID を返します。

protected string getActionId ( $action )
$action yii\base\Action

                protected function getActionId($action)
{
    if ($this->owner instanceof Module) {
        $mid = $this->owner->getUniqueId();
        $id = $action->getUniqueId();
        if ($mid !== '' && strpos($id, $mid) === 0) {
            $id = substr($id, strlen($mid) + 1);
        }
    } else {
        $id = $action->id;
    }
    return $id;
}

            
hasMethod() public メソッド

定義元: yii\base\BaseObject::hasMethod()

メソッドが定義されているかどうかを示す値を返します。

デフォルトの実装は、PHP関数のmethod_exists()の呼び出しです。PHPのマジックメソッド__call()を実装した場合、このメソッドをオーバーライドしてもよいでしょう。

public boolean hasMethod ( $name )
$name string

メソッド名

return boolean

メソッドが定義されているかどうか

                public function hasMethod($name)
{
    return method_exists($this, $name);
}

            
hasProperty() public メソッド

定義元: yii\base\BaseObject::hasProperty()

プロパティが定義されているかどうかを示す値を返します。

プロパティが定義されているのは、次のいずれかの場合です。

  • クラスが指定された名前に関連付けられたゲッターまたはセッターメソッドを持っている場合(この場合、プロパティ名は大文字と小文字を区別しません)。
  • クラスが指定された名前のメンバ変数を持っている場合($checkVars が true の場合)。

以下も参照してください。

public boolean hasProperty ( $name, $checkVars true )
$name string

プロパティ名

$checkVars boolean

メンバ変数をプロパティとして扱うかどうか

return boolean

プロパティが定義されているかどうか

                public function hasProperty($name, $checkVars = true)
{
    return $this->canGetProperty($name, $checkVars) || $this->canSetProperty($name, false);
}

            
init() public メソッド

オブジェクトを初期化します。

このメソッドは、オブジェクトが与えられた設定で初期化された後、コンストラクタの最後に呼び出されます。

public void init ( )

                public function init()
{
    if ($this->request === null) {
        $this->request = Yii::$app->getRequest();
    }
    if ($this->response === null) {
        $this->response = Yii::$app->getResponse();
    }
}

            
isActive() protected メソッド

定義元: yii\base\ActionFilter::isActive()

指定されたアクションに対してフィルタがアクティブかどうかを示す値を返します。

protected boolean isActive ( $action )
$action yii\base\Action

フィルタリングされているアクション

return boolean

指定されたアクションに対してフィルターがアクティブかどうか。

                protected function isActive($action)
{
    $id = $this->getActionId($action);
    if (empty($this->only)) {
        $onlyMatch = true;
    } else {
        $onlyMatch = false;
        foreach ($this->only as $pattern) {
            if (StringHelper::matchWildcard($pattern, $id)) {
                $onlyMatch = true;
                break;
            }
        }
    }
    $exceptMatch = false;
    foreach ($this->except as $pattern) {
        if (StringHelper::matchWildcard($pattern, $id)) {
            $exceptMatch = true;
            break;
        }
    }
    return !$exceptMatch && $onlyMatch;
}