Heim Datenbank MySQL-Tutorial ThinkPHP3.2 扩展

ThinkPHP3.2 扩展

Jun 07, 2016 pm 03:43 PM
thinkphp3.2 扩展

之前写到TP3.1的行为扩展是tag();在TP3.2中引入了另一种说法—:钩子。 我们来看一下TP3.2中的钩子这个东西: 一:文件流程: 1:/index.php - require './ThinkPHP/ThinkPHP.php'; 2:/ThinkPHP/ThinkPHP.php—- require CORE_PATH.'Think'.EXT; Think\Think:

之前写到TP3.1的行为扩展是tag();在TP3.2中引入了另一种说法—:钩子。
我们来看一下TP3.2中的钩子这个东西:
一:文件流程:
1:/index.php ->require './ThinkPHP/ThinkPHP.php';
2:/ThinkPHP/ThinkPHP.php—->require CORE_PATH.'Think'.EXT; Think\Think::start();
3:/ThinkPHP/Library/Think/Think.class.php—–>App::run();
4:/ThinkPHP/Library/Think/App.class.php 。到这里基本流程就走完了,(这里不说细节);

二:代码:
1:看一下 App::run()方法:

<code>        
        Hook<span>::listen(<span>'app_init'</span>);</span>
        App<span>::init();</span>
        
        Hook<span>::listen(<span>'app_begin'</span>);</span>
        <span>// Session初始化</span>
        <span>if(!IS_CLI)</span>{
            <span>session(<span>C(<span>'SESSION_OPTIONS'</span>)</span>)</span>;
        }
        <span>// 记录应用初始化时间</span>
        <span>G(<span>'initTime'</span>)</span>;
        App<span>::exec();</span>
        
        Hook<span>::listen(<span>'app_end'</span>);</span>
        return ;</code>
Nach dem Login kopieren

其中的Hook::listen(”)就是用来执行钩子的,我们可以在app_init这个安插的位置用来获取应用中安装的插件。

看一下Hook::listen();

<code><span><span> @param</span><span> @param</span> mixed $params 传入参数
     *<span> @return</span> void
     */</span>
    <span>static</span> <span>public</span> <span><span>function</span> <span>listen</span><span>(<span>$tag</span>, &<span>$params</span>=NULL)</span> {</span>
        <span>if</span>(<span>isset</span>(<span>self</span>::<span>$tags</span>[<span>$tag</span>])) {
            <span>if</span>(APP_DEBUG) {
                G(<span>$tag</span>.<span>'Start'</span>);
                trace(<span>'[ '</span>.<span>$tag</span>.<span>' ] --START--'</span>,<span>''</span>,<span>'INFO'</span>);
            }
            <span>foreach</span> (<span>self</span>::<span>$tags</span>[<span>$tag</span>] <span>as</span> <span>$name</span>) {
                APP_DEBUG && G(<span>$name</span>.<span>'_start'</span>);
                <span>$result</span> =   <span>self</span>::exec(<span>$name</span>, <span>$tag</span>,<span>$params</span>);
                <span>if</span>(APP_DEBUG){
                    G(<span>$name</span>.<span>'_end'</span>);
                    trace(<span>'Run '</span>.<span>$name</span>.<span>' [ RunTime:'</span>.G(<span>$name</span>.<span>'_start'</span>,<span>$name</span>.<span>'_end'</span>,<span>6</span>).<span>'s ]'</span>,<span>''</span>,<span>'INFO'</span>);
                }
                <span>if</span>(<span>false</span> === <span>$result</span>) {
                    <span>// 如果返回false 则中断插件执行</span>
                    <span>return</span> ;
                }
            }
            <span>if</span>(APP_DEBUG) { <span>// 记录行为的执行日志</span>
                trace(<span>'[ '</span>.<span>$tag</span>.<span>' ] --END-- [ RunTime:'</span>.G(<span>$tag</span>.<span>'Start'</span>,<span>$tag</span>.<span>'End'</span>,<span>6</span>).<span>'s ]'</span>,<span>''</span>,<span>'INFO'</span>);
            }
        }
        <span>return</span>;
    }</code>
Nach dem Login kopieren

其中关键是:self::exec($name, $tag,$params); 看一下exec的代码:

<code> <span>/**
     * 执行某个插件
     *<span> @param</span> string $name 插件名称
     *<span> @param</span><span> @param</span> Mixed $params 传入的参数
     *<span> @return</span> void
     */</span>
    <span>static</span> <span>public</span> <span><span>function</span> <span>exec</span><span>(<span>$name</span>, <span>$tag</span>,&<span>$params</span>=NULL)</span> {</span>
        <span>if</span>(<span>false</span> === strpos(<span>$name</span>,<span>'\\'</span>)) {
            <span>// 插件(多个入口)</span>
            <span>$class</span>   =  <span>"Addons\\{$name}\\{$name}Addon"</span>;
        }<span>else</span>{
            <span>// 行为扩展(只有一个run入口方法)</span>
            <span>$class</span>   =  <span>$name</span>.<span>'Behavior'</span>;
            <span>$tag</span>    =   <span>'run'</span>;
        }
        <span>$addon</span>   = <span>new</span> <span>$class</span>();
        <span>return</span> <span>$addon</span>-><span>$tag</span>(<span>$params</span>);
    }</code>
Nach dem Login kopieren

最后还不是 new $class();进而return $addon->$tag($params); 又转到了具体钩子的代码方法。其实就是我们原本的调用class的方法,只不过经过别人的高度封装了。

三:那么问题来了,这个钩子有什么用呢? 怎么用?
这里以OneThink 的{:hook('AdminIndex')}为例,看一些别人是怎么用的。
在系统初始化到 Hook::listen('app_init'); 时,

<code><span><span><?php </span>
<span>return</span> <span>array</span>(
    <span>'app_init'</span>=><span>array</span>(<span>'Common\Behavior\InitHook'</span>)
);</span></span></code>
Nach dem Login kopieren

一看就明白,无非就是读取持久化的信息,放到缓存或是其他的方式

<code> <span>// 行为扩展的执行入口必须是run</span>
    <span>public</span> <span><span>function</span> <span>run</span><span>(&<span>$content</span>)</span>{</span>
        <span>if</span>(<span>isset</span>(<span>$_GET</span>[<span>'m'</span>]) && <span>$_GET</span>[<span>'m'</span>] === <span>'Install'</span>) <span>return</span>;

        <span>$data</span> = S(<span>'hooks'</span>);
        <span>if</span>(!<span>$data</span>){
            <span>$hooks</span> = M(<span>'Hooks'</span>)->getField(<span>'name,addons'</span>);
            <span>foreach</span> (<span>$hooks</span> <span>as</span> <span>$key</span> => <span>$value</span>) {
                <span>if</span>(<span>$value</span>){
                    <span>$map</span>[<span>'status'</span>]  =   <span>1</span>;
                    <span>$names</span>          =   explode(<span>','</span>,<span>$value</span>);
                    <span>$map</span>[<span>'name'</span>]    =   <span>array</span>(<span>'IN'</span>,<span>$names</span>);
                    <span>$data</span> = M(<span>'Addons'</span>)->where(<span>$map</span>)->getField(<span>'id,name'</span>);
                    <span>if</span>(<span>$data</span>){
                        <span>$addons</span> = array_intersect(<span>$names</span>, <span>$data</span>);
                        Hook::add(<span>$key</span>,<span>$addons</span>);
                    }
                }
            }
            S(<span>'hooks'</span>,Hook::get());
        }<span>else</span>{
            Hook::import(<span>$data</span>,<span>false</span>);
        }
    }</code>
Nach dem Login kopieren

当在程序执行到{:hook(‘AdminIndex’)}时—>调用的是Hook::listen(‘AdminIndex’);
AdminIndex这个挂载点包含了三个插件:分别是:SiteStat, SystemInfo,DevTeam。
用一个循环来分别按顺序执行.

总结:钩子其实就是起到一个挂载点的作用,这个钩子挂在哪里,就可以在哪里执行,内容或功能就是挂载插件或类库的具体实现。这样实现的代码就有很大的灵活性,挂载点不变,挂的东西变量,功能也就相应的变化,是不是很灵活强大呀。


以上只属于学习笔记,若有错请指正。

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Wie man alles in Myrise freischaltet
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Wie verwende ich die SNMP-Erweiterung von PHP? Wie verwende ich die SNMP-Erweiterung von PHP? Jun 02, 2023 am 10:22 AM

Die SNMP-Erweiterung für PHP ist eine Erweiterung, die es PHP ermöglicht, über das SNMP-Protokoll mit Netzwerkgeräten zu kommunizieren. Mit dieser Erweiterung können Sie auf einfache Weise die Konfigurationsinformationen von Netzwerkgeräten abrufen und ändern, z. B. CPU, Speicher, Netzwerkschnittstelle und andere Informationen von Routern, Switches usw. Sie können auch Steuervorgänge durchführen, z. B. das Umschalten von Geräteports. In diesem Artikel werden die Grundkenntnisse des SNMP-Protokolls, die Installation der SNMP-Erweiterung von PHP und die Verwendung der SNMP-Erweiterung in PHP zur Überwachung und Steuerung von Netzwerkgeräten vorgestellt. 1. SN

Von Anfang bis Ende: So verwenden Sie die PHP-Erweiterung cURL, um HTTP-Anfragen zu stellen Von Anfang bis Ende: So verwenden Sie die PHP-Erweiterung cURL, um HTTP-Anfragen zu stellen Jul 29, 2023 pm 05:07 PM

Von Anfang bis Ende: So verwenden Sie die PHP-Erweiterung cURL für HTTP-Anfragen. Einführung: Bei der Webentwicklung ist es häufig erforderlich, mit APIs von Drittanbietern oder anderen Remote-Servern zu kommunizieren. Die Verwendung von cURL zum Senden von HTTP-Anfragen ist eine gängige und leistungsstarke Methode. In diesem Artikel wird erläutert, wie Sie mit PHP cURL erweitern, um HTTP-Anfragen auszuführen, und einige praktische Codebeispiele bereitstellen. 1. Vorbereitung Stellen Sie zunächst sicher, dass PHP die cURL-Erweiterung installiert hat. Zur Überprüfung können Sie php-m|grepcurl in der Befehlszeile ausführen

Erweiterungen und Drittanbietermodule für PHP-Funktionen Erweiterungen und Drittanbietermodule für PHP-Funktionen Apr 13, 2024 pm 02:12 PM

Um die Funktionalität der PHP-Funktion zu erweitern, können Sie Erweiterungen und Module von Drittanbietern verwenden. Erweiterungen stellen zusätzliche Funktionen und Klassen bereit, die über den pecl-Paketmanager installiert und aktiviert werden können. Module von Drittanbietern bieten spezifische Funktionen und können über den Composer-Paketmanager installiert werden. Zu den praktischen Beispielen gehören die Verwendung von Erweiterungen zum Parsen komplexer JSON-Daten und die Verwendung von Modulen zur Datenvalidierung.

Wie installiere ich die MBstring-Erweiterung unter CENTOS7? Wie installiere ich die MBstring-Erweiterung unter CENTOS7? Jan 06, 2024 pm 09:59 PM

1.UncaughtError:Calltoundefinedfunctionmb_strlen(); Wenn der obige Fehler auftritt, bedeutet dies, dass wir die mbstring-Erweiterung nicht installiert haben. 2. Geben Sie das PHP-Installationsverzeichnis cd/temp001/php-7.1.0/ext/mbstring ein. 3. Starten Sie phpize( /usr/local/bin /phpize oder /usr/local/php7-abel001/bin/phpize) Befehl zum Installieren der PHP-Erweiterung 4../configure--with-php-config=/usr/local/php7-abel

So verwenden Sie die Aurora Push-Erweiterung, um die Push-Funktion für Stapelnachrichten in PHP-Anwendungen zu implementieren So verwenden Sie die Aurora Push-Erweiterung, um die Push-Funktion für Stapelnachrichten in PHP-Anwendungen zu implementieren Jul 25, 2023 pm 08:07 PM

So verwenden Sie die Aurora Push-Erweiterung zum Implementieren der Batch-Nachrichten-Push-Funktion in PHP-Anwendungen. Bei der Entwicklung mobiler Anwendungen ist Message Push eine sehr wichtige Funktion. Jiguang Push ist ein häufig verwendeter Nachrichten-Push-Dienst, der umfangreiche Funktionen und Schnittstellen bietet. In diesem Artikel wird erläutert, wie Sie die Aurora Push-Erweiterung verwenden, um die Push-Funktionalität für Batch-Nachrichten in PHP-Anwendungen zu implementieren. Schritt 1: Registrieren Sie ein Jiguang Push-Konto und erhalten Sie einen API-Schlüssel. Zuerst müssen wir uns auf der offiziellen Website von Jiguang Push registrieren (https://www.jiguang.cn/push).

Wie verwende ich die ZipArchive-Erweiterung von PHP? Wie verwende ich die ZipArchive-Erweiterung von PHP? Jun 02, 2023 am 08:13 AM

PHP ist eine beliebte serverseitige Sprache, mit der Webanwendungen entwickelt und Dateien verarbeitet werden können. Die ZipArchive-Erweiterung für PHP ist ein leistungsstarkes Tool zum Bearbeiten von Zip-Dateien in PHP. In diesem Artikel erfahren Sie, wie Sie die ZipArchive-Erweiterung von PHP zum Erstellen, Lesen und Ändern von Zip-Dateien verwenden. 1. Installieren Sie die ZipArchive-Erweiterung. Bevor Sie die ZipArchive-Erweiterung verwenden, müssen Sie sicherstellen, dass die Erweiterung installiert wurde. Die Installationsmethode ist wie folgt: 1. Installieren

Wie verwende ich die POSIX-Erweiterung von PHP? Wie verwende ich die POSIX-Erweiterung von PHP? Jun 03, 2023 am 08:01 AM

POSIX-Erweiterungen für PHP sind eine Reihe von Funktionen und Konstanten, die es PHP ermöglichen, mit POSIX-kompatiblen Betriebssystemen zu interagieren. POSIX (PortableOperatingSystemInterface) ist eine Reihe von Betriebssystemschnittstellenstandards, die es Softwareentwicklern ermöglichen sollen, Anwendungen zu schreiben, die auf verschiedenen UNIX- oder UNIX-ähnlichen Betriebssystemen ausgeführt werden können. In diesem Artikel wird die Verwendung von POSIX-Erweiterungen für PHP, einschließlich Installation und Verwendung, vorgestellt. 1. Installieren Sie die POSIX-Erweiterung von PHP in

Wie verwende ich die Phar-Erweiterung von PHP? Wie verwende ich die Phar-Erweiterung von PHP? May 31, 2023 pm 11:31 PM

Mit der Entwicklung von PHP und der kontinuierlichen Erweiterung der Anwendungsszenarien ist die Phar-Erweiterung zu einem wichtigen Bestandteil der PHP-Programmierung geworden. Phar ist die Abkürzung für PHPArchive, das mehrere PHP-Dateien und -Ressourcen zur einfachen Verteilung und Verwaltung in einer einzigen Datei packen kann. In diesem Artikel wird erläutert, wie Sie die Phar-Erweiterung von PHP zum Packen und Verwalten verwenden. Installation der Phar-Erweiterung Zuerst müssen wir prüfen, ob PHP die Phar-Erweiterung installiert hat. Geben Sie unter Linux den folgenden Befehl über das Terminal ein: php -m

See all articles