# Class yii\captcha\CaptchaAction

Inheritance | yii\captcha\CaptchaAction » yii\base\Action » yii\base\Component » yii\base\BaseObject
Implements | yii\base\Configurable
Available since version | 2.0
Source Code | https://github.com/yiisoft/yii2/blob/master/framework/captcha/CaptchaAction.php

CaptchaAction renders a CAPTCHA image.

CaptchaAction is used together with yii\captcha\Captcha and yii\captcha\CaptchaValidator to provide the CAPTCHA feature.

By configuring the properties of CaptchaAction, you may customize the appearance of the generated CAPTCHA images, such as the font color, the background color, etc.

Note that CaptchaAction requires either GD2 extension or ImageMagick PHP extension.

Using CAPTCHA involves the following steps:

1. Override yii\web\Controller::actions() and register an action of class CaptchaAction with ID 'captcha'
2. In the form model, declare an attribute to store user-entered verification code, and declare the attribute to be validated by the 'captcha' validator.
3. In the controller view, insert a yii\captcha\Captcha widget in the form.

## Public Properties

Hide inherited properties

Property | Type | Description | Defined By
--- | --- | --- | ---
$backColor | integer | The background color. | yii\captcha\CaptchaAction
$behaviors | yii\base\Behavior[] | List of behaviors attached to this component. | yii\base\Component
$controller | yii\base\Controller|yii\web\Controller|yii\console\Controller | The controller that owns this action | yii\base\Action
$fixedVerifyCode | string|null | The fixed verification code. | yii\captcha\CaptchaAction
$fontFile | string | The TrueType font file. | yii\captcha\CaptchaAction
$foreColor | integer | The font color. | yii\captcha\CaptchaAction
$height | integer | The height of the generated CAPTCHA image. | yii\captcha\CaptchaAction
$id | string | ID of the action | yii\base\Action
$imageLibrary | string|null | The rendering library to use. | yii\captcha\CaptchaAction
$maxLength | integer | The maximum length for randomly generated word. | yii\captcha\CaptchaAction
$minLength | integer | The minimum length for randomly generated word. | yii\captcha\CaptchaAction
$offset | integer | The offset between characters. | yii\captcha\CaptchaAction
$padding | integer | Padding around the text. | yii\captcha\CaptchaAction
$testLimit | integer | How many times should the same CAPTCHA be displayed. | yii\captcha\CaptchaAction
$transparent | boolean | Whether to use transparent background. | yii\captcha\CaptchaAction
$uniqueId | string | The unique ID of this action among the whole application. | yii\base\Action
$verifyCode | string | The verification code. | yii\captcha\CaptchaAction
$width | integer | The width of the generated CAPTCHA image. | yii\captcha\CaptchaAction

## Public Methods

Hide inherited methods

Method | Description | Defined By
--- | --- | ---
__call() | Calls the named method which is not a class method. | yii\base\Component
__clone() | This method is called after the object is created by cloning an existing one. | yii\base\Component
__construct() | Constructor. | yii\base\Action
__get() | Returns the value of a component property. | yii\base\Component
__isset() | Checks if a property is set, i.e. defined and not null. | yii\base\Component
__set() | Sets the value of a component property. | yii\base\Component
__unset() | Sets a component property to be null. | yii\base\Component
attachBehavior() | Attaches a behavior to this component. | yii\base\Component
attachBehaviors() | Attaches a list of behaviors to the component. | yii\base\Component
behaviors() | Returns a list of behaviors that this component should behave as. | yii\base\Component
canGetProperty() | Returns a value indicating whether a property can be read. | yii\base\Component
canSetProperty() | Returns a value indicating whether a property can be set. | yii\base\Component
className() | Returns the fully qualified name of this class. | yii\base\BaseObject
detachBehavior() | Detaches a behavior from the component. | yii\base\Component
detachBehaviors() | Detaches all behaviors from the component. | yii\base\Component
ensureBehaviors() | Makes sure that the behaviors declared in behaviors() are attached to this component. | yii\base\Component
generateValidationHash() | Generates a hash code that can be used for client-side validation. | yii\captcha\CaptchaAction
getBehavior() | Returns the named behavior object. | yii\base\Component
getBehaviors() | Returns all behaviors attached to this component. | yii\base\Component
getUniqueId() | Returns the unique ID of this action among the whole application. | yii\base\Action
getVerifyCode() | Gets the verification code. | yii\captcha\CaptchaAction
hasEventHandlers() | Returns a value indicating whether there is any handler attached to the named event. | yii\base\Component
hasMethod() | Returns a value indicating whether a method is defined. | yii\base\Component
hasProperty() | Returns a value indicating whether a property is defined for this component. | yii\base\Component
init() | Initializes the action. | yii\captcha\CaptchaAction
off() | Detaches an existing event handler from this component. | yii\base\Component
on() | Attaches an event handler to an event. | yii\base\Component
run() | Runs the action. | yii\captcha\CaptchaAction
runWithParams() | Runs this action with the specified parameters. | yii\base\Action
trigger() | Triggers an event. | yii\base\Component
validate() | Validates the input to see if it matches the generated code. | yii\captcha\CaptchaAction

## Protected Methods

Hide inherited methods

Method | Description | Defined By
--- | --- | ---
afterRun() | This method is called right after `run()` is executed. | yii\base\Action
beforeRun() | This method is called right before `run()` is executed. | yii\base\Action
generateVerifyCode() | Generates a new verification code. | yii\captcha\CaptchaAction
getSessionKey() | Returns the session variable name used to store verification code. | yii\captcha\CaptchaAction
renderImage() | Renders the CAPTCHA image. | yii\captcha\CaptchaAction
renderImageByGD() | Renders the CAPTCHA image based on the code using GD library. | yii\captcha\CaptchaAction
renderImageByImagick() | Renders the CAPTCHA image based on the code using ImageMagick library. | yii\captcha\CaptchaAction
setHttpHeaders() | Sets the HTTP headers needed by image response. | yii\captcha\CaptchaAction

## Constants

Hide inherited constants

Constant | Value | Description | Defined By
--- | --- | --- | ---
REFRESH_GET_VAR | 'refresh' | The name of the GET parameter indicating whether the CAPTCHA image should be regenerated. | yii\captcha\CaptchaAction

## Property Details

Hide inherited properties

$backColor public property

The background color. For example, 0x55FF00. Defaults to 0xFFFFFF, meaning white color.

public integer $backColor = 0xffffff
$fixedVerifyCode public property

The fixed verification code. When this property is set, getVerifyCode() will always return the value of this property. This is mainly used in automated tests where we want to be able to reproduce the same verification code each time we run the tests. If not set, it means the verification code will be randomly generated.

public string|null $fixedVerifyCode = null
$fontFile public property

The TrueType font file. This can be either a file path or path alias.

public string $fontFile = '@yii/captcha/SpicyRice.ttf'
$foreColor public property

The font color. For example, 0x55FF00. Defaults to 0x2040A0 (blue color).

public integer $foreColor = 0x2040a0
$height public property

The height of the generated CAPTCHA image. Defaults to 50.

public integer $height = 50
$imageLibrary public property (available since version 2.0.7)

The rendering library to use. Currently supported only 'gd' and 'imagick'. If not set, library will be determined automatically.

public string|null $imageLibrary = null
$maxLength public property

The maximum length for randomly generated word. Defaults to 7.

public integer $maxLength = 7
$minLength public property

The minimum length for randomly generated word. Defaults to 6.

public integer $minLength = 6
$offset public property

The offset between characters. Defaults to -2. You can adjust this property in order to decrease or increase the readability of the captcha.

public integer $offset = -2
$padding public property

Padding around the text. Defaults to 2.

public integer $padding = 2
$testLimit public property

How many times should the same CAPTCHA be displayed. Defaults to 3. A value less than or equal to 0 means the test is unlimited (available since version 1.1.2).

public integer $testLimit = 3
$transparent public property

Whether to use transparent background. Defaults to false.

public boolean $transparent = false
$verifyCode public property

The verification code.

public string $verifyCode = null
$width public property

The width of the generated CAPTCHA image. Defaults to 120.

public integer $width = 120

## Method Details

Hide inherited methods

__call() public method

Defined in: yii\base\Component::__call()

Calls the named method which is not a class method.

This method will check if any attached behavior has the named method and will execute it if available.

Do not call this method directly as it is a PHP magic method that will be implicitly called when an unknown method is being invoked.

public mixed __call ( $name, $params )
$name | string | The method name
$params | array | Method parameters
return | mixed | The method return value
throws | yii\base\UnknownMethodException | when calling unknown method

Source code

                    public function __call($name, $params)
    {
        $this->ensureBehaviors();
        foreach ($this->_behaviors as $object) {
            if ($object->hasMethod($name)) {
                return call_user_func_array([$object, $name], $params);
            }
        }
        throw new UnknownMethodException('Calling unknown method: ' . get_class($this) . "::$name()");
    }

__clone() public method

Defined in: yii\base\Component::__clone()

This method is called after the object is created by cloning an existing one.

It removes all behaviors because they are attached to the old object.

public void __clone ( )

Source code

                    public function __clone()
    {
        $this->_events = [];
        $this->_eventWildcards = [];
        $this->_behaviors = null;
    }

__construct() public method

Defined in: yii\base\Action::__construct()

Constructor.

public void __construct ( $id, $controller, $config = [] )
$id | string | The ID of this action
$controller | yii\base\Controller | The controller that owns this action
$config | array | Name-value pairs that will be used to initialize the object properties

Source code

                    public function __construct($id, $controller, $config = [])
    {
        $this->id = $id;
        $this->controller = $controller;
        parent::__construct($config);
    }

__get() public method

Defined in: yii\base\Component::__get()

Returns the value of a component property.

This method will check in the following order and act accordingly:

- a property defined by a getter: return the getter result
- a property of a behavior: return the behavior property value

Do not call this method directly as it is a PHP magic method that will be implicitly called when executing `$value = $component->property;`.

See also __set().

public mixed __get ( $name )
$name | string | The property name
return | mixed | The property value or the value of a behavior's property
throws | yii\base\UnknownPropertyException | if the property is not defined
throws | yii\base\InvalidCallException | if the property is write-only.

Source code

                    public function __get($name)
    {
        $getter = 'get' . $name;
        if (method_exists($this, $getter)) {
            // read property, e.g. getName()
            return $this->$getter();
        }
        // behavior property
        $this->ensureBehaviors();
        foreach ($this->_behaviors as $behavior) {
            if ($behavior->canGetProperty($name)) {
                return $behavior->$name;
            }
        }
        if (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 method

Defined in: yii\base\Component::__isset()

Checks if a property is set, i.e. defined and not null.

This method will check in the following order and act accordingly:

- a property defined by a setter: return whether the property is set
- a property of a behavior: return whether the property is set
- return `false` for non existing properties

Do not call this method directly as it is a PHP magic method that will be implicitly called when executing `isset($component->property)`.

See also https://www.php.net/manual/en/function.isset.php.

public boolean __isset ( $name )
$name | string | The property name or the event name
return | boolean | Whether the named property is set

Source code

                    public function __isset($name)
    {
        $getter = 'get' . $name;
        if (method_exists($this, $getter)) {
            return $this->$getter() !== null;
        }
        // behavior property
        $this->ensureBehaviors();
        foreach ($this->_behaviors as $behavior) {
            if ($behavior->canGetProperty($name)) {
                return $behavior->$name !== null;
            }
        }
        return false;
    }

__set() public method

Defined in: yii\base\Component::__set()

Sets the value of a component property.

This method will check in the following order and act accordingly:

- a property defined by a setter: set the property value
- an event in the format of "on xyz": attach the handler to the event "xyz"
- a behavior in the format of "as xyz": attach the behavior named as "xyz"
- a property of a behavior: set the behavior property value

Do not call this method directly as it is a PHP magic method that will be implicitly called when executing `$component->property = $value;`.

See also __get().

public void __set ( $name, $value )
$name | string | The property name or the event name
$value | mixed | The property value
throws | yii\base\UnknownPropertyException | if the property is not defined
throws | yii\base\InvalidCallException | if the property is read-only.

Source code

                    public function __set($name, $value)
    {
        $setter = 'set' . $name;
        if (method_exists($this, $setter)) {
            // set property
            $this->$setter($value);
            return;
        } elseif (strncmp($name, 'on ', 3) === 0) {
            // on event: attach event handler
            $this->on(trim(substr($name, 3)), $value);
            return;
        } elseif (strncmp($name, 'as ', 3) === 0) {
            // as behavior: attach behavior
            $name = trim(substr($name, 3));
            $this->attachBehavior($name, $value instanceof Behavior ? $value : Yii::createObject($value));
            return;
        }
        // behavior property
        $this->ensureBehaviors();
        foreach ($this->_behaviors as $behavior) {
            if ($behavior->canSetProperty($name)) {
                $behavior->$name = $value;
                return;
            }
        }
        if (method_exists($this, 'get' . $name)) {
            throw new InvalidCallException('Setting read-only property: ' . get_class($this) . '::' . $name);
        }
        throw new UnknownPropertyException('Setting unknown property: ' . get_class($this) . '::' . $name);
    }

__unset() public method

Defined in: yii\base\Component::__unset()

Sets a component property to be null.

This method will check in the following order and act accordingly:

- a property defined by a setter: set the property value to be null
- a property of a behavior: set the property value to be null

Do not call this method directly as it is a PHP magic method that will be implicitly called when executing `unset($component->property)`.

See also https://www.php.net/manual/en/function.unset.php.

public void __unset ( $name )
$name | string | The property name
throws | yii\base\InvalidCallException | if the property is read only.

Source code

                    public function __unset($name)
    {
        $setter = 'set' . $name;
        if (method_exists($this, $setter)) {
            $this->$setter(null);
            return;
        }
        // behavior property
        $this->ensureBehaviors();
        foreach ($this->_behaviors as $behavior) {
            if ($behavior->canSetProperty($name)) {
                $behavior->$name = null;
                return;
            }
        }
        throw new InvalidCallException('Unsetting an unknown or read-only property: ' . get_class($this) . '::' . $name);
    }

afterRun() protected method

Defined in: yii\base\Action::afterRun()

This method is called right after `run()` is executed.

You may override this method to do post-processing work for the action run.

protected void afterRun ( )

Source code

                    protected function afterRun()
    {
    }

attachBehavior() public method

Defined in: yii\base\Component::attachBehavior()

Attaches a behavior to this component.

This method will create the behavior object based on the given configuration. After that, the behavior object will be attached to this component by calling the yii\base\Behavior::attach() method.

See also detachBehavior().

public yii\base\Behavior attachBehavior ( $name, $behavior )
$name | string | The name of the behavior.

$behavior

string|array|yii\base\Behavior

The behavior configuration. This can be one of the following:

- a yii\base\Behavior object
- a string specifying the behavior class
- an object configuration array that will be passed to Yii::createObject() to create the behavior object.

return | yii\base\Behavior | The behavior object

Source code

                    public function attachBehavior($name, $behavior)
    {
        $this->ensureBehaviors();
        return $this->attachBehaviorInternal($name, $behavior);
    }

attachBehaviors() public method

Defined in: yii\base\Component::attachBehaviors()

Attaches a list of behaviors to the component.

Each behavior is indexed by its name and should be a yii\base\Behavior object, a string specifying the behavior class, or an configuration array for creating the behavior.

See also attachBehavior().

public void attachBehaviors ( $behaviors )
$behaviors | array | List of behaviors to be attached to the component

Source code

                    public function attachBehaviors($behaviors)
    {
        $this->ensureBehaviors();
        foreach ($behaviors as $name => $behavior) {
            $this->attachBehaviorInternal($name, $behavior);
        }
    }

beforeRun() protected method

Defined in: yii\base\Action::beforeRun()

This method is called right before `run()` is executed.

You may override this method to do preparation work for the action run. If the method returns false, it will cancel the action.

protected boolean beforeRun ( )
return | boolean | Whether to run the action.

Source code

                    protected function beforeRun()
    {
        return true;
    }

behaviors() public method

Defined in: yii\base\Component::behaviors()

Returns a list of behaviors that this component should behave as.

Child classes may override this method to specify the behaviors they want to behave as.

The return value of this method should be an array of behavior objects or configurations indexed by behavior names. A behavior configuration can be either a string specifying the behavior class or an array of the following structure:

    'behaviorName' => [
        'class' => 'BehaviorClass',
        'property1' => 'value1',
        'property2' => 'value2',
    ]

Note that a behavior class must extend from yii\base\Behavior. Behaviors can be attached using a name or anonymously. When a name is used as the array key, using this name, the behavior can later be retrieved using getBehavior() or be detached using detachBehavior(). Anonymous behaviors can not be retrieved or detached.

Behaviors declared in this method will be attached to the component automatically (on demand).

public array behaviors ( )
return | array | The behavior configurations.

Source code

                    public function behaviors()
    {
        return [];
    }

canGetProperty() public method

Defined in: yii\base\Component::canGetProperty()

Returns a value indicating whether a property can be read.

A property can be read if:

- the class has a getter method associated with the specified name (in this case, property name is case-insensitive);
- the class has a member variable with the specified name (when `$checkVars` is true);
- an attached behavior has a readable property of the given name (when `$checkBehaviors` is true).

See also canSetProperty().

public boolean canGetProperty ( $name, $checkVars = true, $checkBehaviors = true )
$name | string | The property name
$checkVars | boolean | Whether to treat member variables as properties
$checkBehaviors | boolean | Whether to treat behaviors' properties as properties of this component
return | boolean | Whether the property can be read

Source code

                    public function canGetProperty($name, $checkVars = true, $checkBehaviors = true)
    {
        if (method_exists($this, 'get' . $name) || $checkVars && property_exists($this, $name)) {
            return true;
        } elseif ($checkBehaviors) {
            $this->ensureBehaviors();
            foreach ($this->_behaviors as $behavior) {
                if ($behavior->canGetProperty($name, $checkVars)) {
                    return true;
                }
            }
        }
        return false;
    }

canSetProperty() public method

Defined in: yii\base\Component::canSetProperty()

Returns a value indicating whether a property can be set.

A property can be written if:

- the class has a setter method associated with the specified name (in this case, property name is case-insensitive);
- the class has a member variable with the specified name (when `$checkVars` is true);
- an attached behavior has a writable property of the given name (when `$checkBehaviors` is true).

See also canGetProperty().

public boolean canSetProperty ( $name, $checkVars = true, $checkBehaviors = true )
$name | string | The property name
$checkVars | boolean | Whether to treat member variables as properties
$checkBehaviors | boolean | Whether to treat behaviors' properties as properties of this component
return | boolean | Whether the property can be written

Source code

                    public function canSetProperty($name, $checkVars = true, $checkBehaviors = true)
    {
        if (method_exists($this, 'set' . $name) || $checkVars && property_exists($this, $name)) {
            return true;
        } elseif ($checkBehaviors) {
            $this->ensureBehaviors();
            foreach ($this->_behaviors as $behavior) {
                if ($behavior->canSetProperty($name, $checkVars)) {
                    return true;
                }
            }
        }
        return false;
    }

className() public static method
Deprecated since 2.0.14. On PHP >=5.5, use `::class` instead.

Defined in: yii\base\BaseObject::className()

Returns the fully qualified name of this class.

public static string className ( )
return | string | The fully qualified name of this class.

Source code

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

detachBehavior() public method

Defined in: yii\base\Component::detachBehavior()

Detaches a behavior from the component.

The behavior's yii\base\Behavior::detach() method will be invoked.

public yii\base\Behavior|null detachBehavior ( $name )
$name | string | The behavior's name.
return | yii\base\Behavior|null | The detached behavior. Null if the behavior does not exist.

Source code

                    public function detachBehavior($name)
    {
        $this->ensureBehaviors();
        if (isset($this->_behaviors[$name])) {
            $behavior = $this->_behaviors[$name];
            unset($this->_behaviors[$name]);
            $behavior->detach();
            return $behavior;
        }
        return null;
    }

detachBehaviors() public method

Defined in: yii\base\Component::detachBehaviors()

Detaches all behaviors from the component.

public void detachBehaviors ( )

Source code

                    public function detachBehaviors()
    {
        $this->ensureBehaviors();
        foreach ($this->_behaviors as $name => $behavior) {
            $this->detachBehavior($name);
        }
    }

ensureBehaviors() public method

Defined in: yii\base\Component::ensureBehaviors()

Makes sure that the behaviors declared in behaviors() are attached to this component.

public void ensureBehaviors ( )

Source code

                    public function ensureBehaviors()
    {
        if ($this->_behaviors === null) {
            $this->_behaviors = [];
            foreach ($this->behaviors() as $name => $behavior) {
                $this->attachBehaviorInternal($name, $behavior);
            }
        }
    }

generateValidationHash() public method

Generates a hash code that can be used for client-side validation.

public string generateValidationHash ( $code )
$code | string | The CAPTCHA code
return | string | A hash code generated from the CAPTCHA code

Source code

                    public function generateValidationHash($code)
    {
        for ($h = 0, $i = strlen($code) - 1; $i >= 0; --$i) {
            $h += ord($code[$i]) << $i;
        }
        return $h;
    }

generateVerifyCode() protected method

Generates a new verification code.

protected string generateVerifyCode ( )
return | string | The generated verification code

Source code

                    protected function generateVerifyCode()
    {
        if ($this->minLength > $this->maxLength) {
            $this->maxLength = $this->minLength;
        }
        if ($this->minLength < 3) {
            $this->minLength = 3;
        }
        if ($this->maxLength > 20) {
            $this->maxLength = 20;
        }
        $length = random_int($this->minLength, $this->maxLength);
        $letters = 'bcdfghjklmnpqrstvwxyz';
        $vowels = 'aeiou';
        $code = '';
        for ($i = 0; $i < $length; ++$i) {
            if ($i % 2 && random_int(0, 10) > 2 || !($i % 2) && random_int(0, 10) > 9) {
                $code .= $vowels[random_int(0, 4)];
            } else {
                $code .= $letters[random_int(0, 20)];
            }
        }
        return $code;
    }

getBehavior() public method

Defined in: yii\base\Component::getBehavior()

Returns the named behavior object.

public yii\base\Behavior|null getBehavior ( $name )
$name | string | The behavior name
return | yii\base\Behavior|null | The behavior object, or null if the behavior does not exist

Source code

                    public function getBehavior($name)
    {
        $this->ensureBehaviors();
        return isset($this->_behaviors[$name]) ? $this->_behaviors[$name] : null;
    }

getBehaviors() public method

Defined in: yii\base\Component::getBehaviors()

Returns all behaviors attached to this component.

public yii\base\Behavior[] getBehaviors ( )
return | yii\base\Behavior[] | List of behaviors attached to this component

Source code

                    public function getBehaviors()
    {
        $this->ensureBehaviors();
        return $this->_behaviors;
    }

getSessionKey() protected method

Returns the session variable name used to store verification code.

protected string getSessionKey ( )
return | string | The session variable name

Source code

                    protected function getSessionKey()
    {
        return '__captcha/' . $this->getUniqueId();
    }

getUniqueId() public method

Defined in: yii\base\Action::getUniqueId()

Returns the unique ID of this action among the whole application.

public string getUniqueId ( )
return | string | The unique ID of this action among the whole application.

Source code

                    public function getUniqueId()
    {
        return $this->controller->getUniqueId() . '/' . $this->id;
    }

getVerifyCode() public method

Gets the verification code.

public string getVerifyCode ( $regenerate = false )
$regenerate | boolean | Whether the verification code should be regenerated.
return | string | The verification code.

Source code

                    public function getVerifyCode($regenerate = false)
    {
        if ($this->fixedVerifyCode !== null) {
            return $this->fixedVerifyCode;
        }
        $session = Yii::$app->getSession();
        $session->open();
        $name = $this->getSessionKey();
        if ($session[$name] === null || $regenerate) {
            $session[$name] = $this->generateVerifyCode();
            $session[$name . 'count'] = 1;
        }
        return $session[$name];
    }

hasEventHandlers() public method

Defined in: yii\base\Component::hasEventHandlers()

Returns a value indicating whether there is any handler attached to the named event.

public boolean hasEventHandlers ( $name )
$name | string | The event name
return | boolean | Whether there is any handler attached to the event.

Source code

                    public function hasEventHandlers($name)
    {
        $this->ensureBehaviors();
        if (!empty($this->_events[$name])) {
            return true;
        }
        foreach ($this->_eventWildcards as $wildcard => $handlers) {
            if (!empty($handlers) && StringHelper::matchWildcard($wildcard, $name)) {
                return true;
            }
        }
        return Event::hasHandlers($this, $name);
    }

hasMethod() public method

Defined in: yii\base\Component::hasMethod()

Returns a value indicating whether a method is defined.

A method is defined if:

- the class has a method with the specified name
- an attached behavior has a method with the given name (when `$checkBehaviors` is true).

public boolean hasMethod ( $name, $checkBehaviors = true )
$name | string | The property name
$checkBehaviors | boolean | Whether to treat behaviors' methods as methods of this component
return | boolean | Whether the method is defined

Source code

                    public function hasMethod($name, $checkBehaviors = true)
    {
        if (method_exists($this, $name)) {
            return true;
        } elseif ($checkBehaviors) {
            $this->ensureBehaviors();
            foreach ($this->_behaviors as $behavior) {
                if ($behavior->hasMethod($name)) {
                    return true;
                }
            }
        }
        return false;
    }

hasProperty() public method

Defined in: yii\base\Component::hasProperty()

Returns a value indicating whether a property is defined for this component.

A property is defined if:

- the class has a getter or setter method associated with the specified name (in this case, property name is case-insensitive);
- the class has a member variable with the specified name (when `$checkVars` is true);
- an attached behavior has a property of the given name (when `$checkBehaviors` is true).

See also:

- canGetProperty()
- canSetProperty()

public boolean hasProperty ( $name, $checkVars = true, $checkBehaviors = true )
$name | string | The property name
$checkVars | boolean | Whether to treat member variables as properties
$checkBehaviors | boolean | Whether to treat behaviors' properties as properties of this component
return | boolean | Whether the property is defined

Source code

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

init() public method

Initializes the action.

public void init ( )
throws | yii\base\InvalidConfigException | if the font file does not exist.

Source code

                    public function init()
    {
        $this->fontFile = Yii::getAlias($this->fontFile);
        if (!is_file($this->fontFile)) {
            throw new InvalidConfigException("The font file does not exist: {$this->fontFile}");
        }
    }

off() public method

Defined in: yii\base\Component::off()

Detaches an existing event handler from this component.

This method is the opposite of on().

Note: in case wildcard pattern is passed for event name, only the handlers registered with this wildcard will be removed, while handlers registered with plain names matching this wildcard will remain.

See also on().

public boolean off ( $name, $handler = null )
$name | string | Event name
$handler | callable|null | The event handler to be removed. If it is null, all handlers attached to the named event will be removed.
return | boolean | If a handler is found and detached

Source code

                    public function off($name, $handler = null)
    {
        $this->ensureBehaviors();
        if (empty($this->_events[$name]) && empty($this->_eventWildcards[$name])) {
            return false;
        }
        if ($handler === null) {
            unset($this->_events[$name], $this->_eventWildcards[$name]);
            return true;
        }
        $removed = false;
        // plain event names
        if (isset($this->_events[$name])) {
            foreach ($this->_events[$name] as $i => $event) {
                if ($event[0] === $handler) {
                    unset($this->_events[$name][$i]);
                    $removed = true;
                }
            }
            if ($removed) {
                $this->_events[$name] = array_values($this->_events[$name]);
                return true;
            }
        }
        // wildcard event names
        if (isset($this->_eventWildcards[$name])) {
            foreach ($this->_eventWildcards[$name] as $i => $event) {
                if ($event[0] === $handler) {
                    unset($this->_eventWildcards[$name][$i]);
                    $removed = true;
                }
            }
            if ($removed) {
                $this->_eventWildcards[$name] = array_values($this->_eventWildcards[$name]);
                // remove empty wildcards to save future redundant regex checks:
                if (empty($this->_eventWildcards[$name])) {
                    unset($this->_eventWildcards[$name]);
                }
            }
        }
        return $removed;
    }

on() public method

Defined in: yii\base\Component::on()

Attaches an event handler to an event.

The event handler must be a valid PHP callback. The following are some examples:

    function ($event) { ... }         // anonymous function
    [$object, 'handleClick']          // $object->handleClick()
    ['Page', 'handleClick']           // Page::handleClick()
    'handleClick'                     // global function handleClick()

The event handler must be defined with the following signature,

    function ($event)

where `$event` is an yii\base\Event object which includes parameters associated with the event.

Since 2.0.14 you can specify event name as a wildcard pattern:

    $component->on('event.group.*', function ($event) {
        Yii::trace($event->name . ' is triggered.');
    });

See also off().

public void on ( $name, $handler, $data = null, $append = true )
$name | string | The event name
$handler | callable | The event handler
$data | mixed | The data to be passed to the event handler when the event is triggered. When the event handler is invoked, this data can be accessed via yii\base\Event::$data.
$append | boolean | Whether to append new event handler to the end of the existing handler list. If false, the new handler will be inserted at the beginning of the existing handler list.

Source code

                    public function on($name, $handler, $data = null, $append = true)
    {
        $this->ensureBehaviors();
        if (strpos($name, '*') !== false) {
            if ($append || empty($this->_eventWildcards[$name])) {
                $this->_eventWildcards[$name][] = [$handler, $data];
            } else {
                array_unshift($this->_eventWildcards[$name], [$handler, $data]);
            }
            return;
        }
        if ($append || empty($this->_events[$name])) {
            $this->_events[$name][] = [$handler, $data];
        } else {
            array_unshift($this->_events[$name], [$handler, $data]);
        }
    }

renderImage() protected method

Renders the CAPTCHA image.

protected string renderImage ( $code )
$code | string | The verification code
return | string | Image contents
throws | yii\base\InvalidConfigException | if imageLibrary is not supported

Source code

                    protected function renderImage($code)
    {
        if (isset($this->imageLibrary)) {
            $imageLibrary = $this->imageLibrary;
        } else {
            $imageLibrary = Captcha::checkRequirements();
        }
        if ($imageLibrary === 'gd') {
            return $this->renderImageByGD($code);
        } elseif ($imageLibrary === 'imagick') {
            return $this->renderImageByImagick($code);
        }
        throw new InvalidConfigException("Defined library '{$imageLibrary}' is not supported");
    }

renderImageByGD() protected method

Renders the CAPTCHA image based on the code using GD library.

protected string renderImageByGD ( $code )
$code | string | The verification code
return | string | Image contents in PNG format.

Source code

                    protected function renderImageByGD($code)
    {
        $image = imagecreatetruecolor($this->width, $this->height);
        $backColor = imagecolorallocate(
            $image,
            (int) ($this->backColor % 0x1000000 / 0x10000),
            (int) ($this->backColor % 0x10000 / 0x100),
            $this->backColor % 0x100
        );
        imagefilledrectangle($image, 0, 0, $this->width - 1, $this->height - 1, $backColor);
        imagecolordeallocate($image, $backColor);
        if ($this->transparent) {
            imagecolortransparent($image, $backColor);
        }
        $foreColor = imagecolorallocate(
            $image,
            (int) ($this->foreColor % 0x1000000 / 0x10000),
            (int) ($this->foreColor % 0x10000 / 0x100),
            $this->foreColor % 0x100
        );
        $length = strlen($code);
        $box = imagettfbbox(30, 0, $this->fontFile, $code);
        $w = $box[4] - $box[0] + $this->offset * ($length - 1);
        $h = $box[1] - $box[5];
        $scale = min(($this->width - $this->padding * 2) / $w, ($this->height - $this->padding * 2) / $h);
        $x = 10;
        $y = round($this->height * 27 / 40);
        for ($i = 0; $i < $length; ++$i) {
            $fontSize = (int) (random_int(26, 32) * $scale * 0.8);
            $angle = random_int(-10, 10);
            $letter = $code[$i];
            $box = imagettftext($image, $fontSize, $angle, $x, $y, $foreColor, $this->fontFile, $letter);
            $x = $box[2] + $this->offset;
        }
        imagecolordeallocate($image, $foreColor);
        ob_start();
        imagepng($image);
        imagedestroy($image);
        return ob_get_clean();
    }

renderImageByImagick() protected method

Renders the CAPTCHA image based on the code using ImageMagick library.

protected string renderImageByImagick ( $code )
$code | string | The verification code
return | string | Image contents in PNG format.

Source code

                    protected function renderImageByImagick($code)
    {
        $backColor = $this->transparent ? new \ImagickPixel('transparent') : new \ImagickPixel('#' . str_pad(dechex($this->backColor), 6, 0, STR_PAD_LEFT));
        $foreColor = new \ImagickPixel('#' . str_pad(dechex($this->foreColor), 6, 0, STR_PAD_LEFT));
        $image = new \Imagick();
        $image->newImage($this->width, $this->height, $backColor);
        $draw = new \ImagickDraw();
        $draw->setFont($this->fontFile);
        $draw->setFontSize(30);
        $fontMetrics = $image->queryFontMetrics($draw, $code);
        $length = strlen($code);
        $w = (int) $fontMetrics['textWidth'] - 8 + $this->offset * ($length - 1);
        $h = (int) $fontMetrics['textHeight'] - 8;
        $scale = min(($this->width - $this->padding * 2) / $w, ($this->height - $this->padding * 2) / $h);
        $x = 10;
        $y = round($this->height * 27 / 40);
        for ($i = 0; $i < $length; ++$i) {
            $draw = new \ImagickDraw();
            $draw->setFont($this->fontFile);
            $draw->setFontSize((int) (random_int(26, 32) * $scale * 0.8));
            $draw->setFillColor($foreColor);
            $image->annotateImage($draw, $x, $y, random_int(-10, 10), $code[$i]);
            $fontMetrics = $image->queryFontMetrics($draw, $code[$i]);
            $x += (int) $fontMetrics['textWidth'] + $this->offset;
        }
        $image->setImageFormat('png');
        return $image->getImageBlob();
    }

run() public method

Runs the action.

public void run ( )

Source code

                    public function run()
    {
        if (Yii::$app->request->getQueryParam(self::REFRESH_GET_VAR) !== null) {
            // AJAX request for regenerating code
            $code = $this->getVerifyCode(true);
            Yii::$app->response->format = Response::FORMAT_JSON;
            return [
                'hash1' => $this->generateValidationHash($code),
                'hash2' => $this->generateValidationHash(strtolower($code)),
                // we add a random 'v' parameter so that FireFox can refresh the image
                // when src attribute of image tag is changed
                'url' => Url::to([$this->id, 'v' => uniqid('', true)]),
            ];
        }
        $this->setHttpHeaders();
        Yii::$app->response->format = Response::FORMAT_RAW;
        return $this->renderImage($this->getVerifyCode());
    }

runWithParams() public method

Defined in: yii\base\Action::runWithParams()

Runs this action with the specified parameters.

This method is mainly invoked by the controller.

public mixed runWithParams ( $params )
$params | array | The parameters to be bound to the action's run() method.
return | mixed | The result of the action
throws | yii\base\InvalidConfigException | if the action class does not have a run() method

Source code

                    public function runWithParams($params)
    {
        if (!method_exists($this, 'run')) {
            throw new InvalidConfigException(get_class($this) . ' must define a "run()" method.');
        }
        $args = $this->controller->bindActionParams($this, $params);
        Yii::debug('Running action: ' . get_class($this) . '::run(), invoked by ' . get_class($this->controller), __METHOD__);
        if (Yii::$app->requestedParams === null) {
            Yii::$app->requestedParams = $args;
        }
        if ($this->beforeRun()) {
            $result = call_user_func_array([$this, 'run'], $args);
            $this->afterRun();
            return $result;
        }
        return null;
    }

setHttpHeaders() protected method

Sets the HTTP headers needed by image response.

protected void setHttpHeaders ( )

Source code

                    protected function setHttpHeaders()
    {
        Yii::$app->getResponse()->getHeaders()
            ->set('Pragma', 'public')
            ->set('Expires', '0')
            ->set('Cache-Control', 'must-revalidate, post-check=0, pre-check=0')
            ->set('Content-Transfer-Encoding', 'binary')
            ->set('Content-type', 'image/png');
    }

trigger() public method

Defined in: yii\base\Component::trigger()

Triggers an event.

This method represents the happening of an event. It invokes all attached handlers for the event including class-level handlers.

public void trigger ( $name, yii\base\Event $event = null )
$name | string | The event name
$event | yii\base\Event|null | The event instance. If not set, a default yii\base\Event object will be created.

Source code

                    public function trigger($name, Event $event = null)
    {
        $this->ensureBehaviors();
        $eventHandlers = [];
        foreach ($this->_eventWildcards as $wildcard => $handlers) {
            if (StringHelper::matchWildcard($wildcard, $name)) {
                $eventHandlers[] = $handlers;
            }
        }
        if (!empty($this->_events[$name])) {
            $eventHandlers[] = $this->_events[$name];
        }
        if (!empty($eventHandlers)) {
            $eventHandlers = call_user_func_array('array_merge', $eventHandlers);
            if ($event === null) {
                $event = new Event();
            }
            if ($event->sender === null) {
                $event->sender = $this;
            }
            $event->handled = false;
            $event->name = $name;
            foreach ($eventHandlers as $handler) {
                $event->data = $handler[1];
                call_user_func($handler[0], $event);
                // stop further handling if the event is handled
                if ($event->handled) {
                    return;
                }
            }
        }
        // invoke class-level attached handlers
        Event::trigger($this, $name, $event);
    }

validate() public method

Validates the input to see if it matches the generated code.

public boolean validate ( $input, $caseSensitive )
$input | string | User input
$caseSensitive | boolean | Whether the comparison should be case-sensitive
return | boolean | Whether the input is valid

Source code

                    public function validate($input, $caseSensitive)
    {
        $code = $this->getVerifyCode();
        $valid = $caseSensitive ? ($input === $code) : strcasecmp($input, $code) === 0;
        $session = Yii::$app->getSession();
        $session->open();
        $name = $this->getSessionKey() . 'count';
        $session[$name] += 1;
        if ($valid || $session[$name] > $this->testLimit && $this->testLimit > 0) {
            $this->getVerifyCode(true);
        }
        return $valid;
    }