Backend Development 6 min read

ThinkPHP Hook Behaviors: Concepts, Usage Examples, and Implementation

This article explains the concept of ThinkPHP Hook behaviors, demonstrates how to define custom behavior classes, bind them to tags using Hook::add, trigger them with Hook::listen, and configure tag bindings in tags.php, providing complete code examples for a login scenario.

php中文网 Courses
php中文网 Courses
php中文网 Courses
ThinkPHP Hook Behaviors: Concepts, Usage Examples, and Implementation

ThinkPHP’s Hook behavior mechanism allows developers to attach reusable actions (behaviors) to specific execution points (tags) without modifying core framework code, similar to AOP concepts.

Behaviors can represent various actions such as routing checks, caching, permission verification, or custom tasks like displaying a welcome message.

Example: login functionality

The original login method directly calls multiple checks, making future extensions cumbersome:

function checkLogin() {
    $this->checkPass();
    // -- new added features
    $this->checkMobile();
    $this->checkCaptcha();
    // ... etc.
    echo '登录成功';
}

To decouple these checks, three behavior classes are defined.

Connect.php

namespace app\index\behavior;
class Connect {
    public function run() {
        echo '连接网络';
    }
    public function __destruct() {
        echo '<br/>';
    }
}

End.php

namespace app\index\behavior;
class End {
    public function run() {
        echo '关闭电脑';
        echo '<br/>';
    }
}

On.php

namespace app\index\behavior;
class On {
    public function run() {
        echo '开启电脑';
        echo '<br/>';
    }
    public function qq() {
        echo '打开QQ';
        echo '<br/>';
    }
    public function opBrowser() {
        echo '打开浏览器';
        echo '<br/>';
    }
    public function app_end(&amp;$param) {
        $param = '结束了';
    }
}

In the controller Index.php , behaviors are bound to tags using Hook::add and triggered with Hook::listen :

namespace app\index\controller;
use think\Hook;
class Index {
    public function __construct() {
        // Bind multiple behaviors to the custom tag "app_init"
        Hook::add('app_init', [
            'app\\index\\behavior\\On',
            'app\\index\\behavior\\Connect',
        ]);
        // Bind custom tags
        Hook::add('qq', 'app\\index\\behavior\\On');
        Hook::add('opBrowser', 'app\\index\\behavior\\On');
    }
    public function index() {
        echo '我现在需要使用电脑进行社交';
        echo '<br/>';
        Hook::listen('app_init');      // Executes On and Connect
        Hook::listen('qq');            // Executes qq method
        Hook::listen('opBrowser');     // Executes opBrowser method
    }
}

The resulting output shows the sequential execution of the bound behaviors.

Tag bindings can also be defined centrally in tags.php :

return [
    'app_init' => [
        'app\\index\\behavior\\On',
        'app\\index\\behavior\\Connect',
    ],
    'app_end' => [
        'app\\index\\behavior\\End',
    ],
];

By using Hook behaviors, developers achieve better code modularity, easier maintenance, and the ability to extend functionality without altering existing controllers.

frameworkHookThinkPHPBehavior
php中文网 Courses
Written by

php中文网 Courses

php中文网's platform for the latest courses and technical articles, helping PHP learners advance quickly.

0 followers
Reader feedback

How this landed with the community

login Sign in to like

Rate this article

Was this worth your time?

Sign in to rate
Discussion

0 Comments

Thoughtful readers leave field notes, pushback, and hard-won operational detail here.