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>
其中的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>
其中关键是: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>
最后还不是 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>
一看就明白,无非就是读取持久化的信息,放到缓存或是其他的方式
<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>
当在程序执行到{:hook(‘AdminIndex’)}时—>调用的是Hook::listen(‘AdminIndex’);
AdminIndex这个挂载点包含了三个插件:分别是:SiteStat, SystemInfo,DevTeam。
用一个循环来分别按顺序执行.
总结:钩子其实就是起到一个挂载点的作用,这个钩子挂在哪里,就可以在哪里执行,内容或功能就是挂载插件或类库的具体实现。这样实现的代码就有很大的灵活性,挂载点不变,挂的东西变量,功能也就相应的变化,是不是很灵活强大呀。
以上只属于学习笔记,若有错请指正。

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas



Sambungan SNMP untuk PHP ialah sambungan yang membolehkan PHP berkomunikasi dengan peranti rangkaian melalui protokol SNMP. Menggunakan sambungan ini, anda boleh mendapatkan dan mengubah suai maklumat konfigurasi peranti rangkaian dengan mudah, seperti CPU, memori, antara muka rangkaian dan maklumat lain penghala, suis, dsb. Anda juga boleh melakukan operasi kawalan seperti menukar port peranti. Artikel ini akan memperkenalkan pengetahuan asas protokol SNMP, cara memasang sambungan SNMP PHP dan cara menggunakan sambungan SNMP dalam PHP untuk memantau dan mengawal peranti rangkaian. 1. SN

Dari awal hingga akhir: Cara menggunakan cURL sambungan php untuk permintaan HTTP Pengenalan: Dalam pembangunan web, selalunya perlu untuk berkomunikasi dengan API pihak ketiga atau pelayan jauh lain. Menggunakan cURL untuk membuat permintaan HTTP ialah cara yang biasa dan berkesan. Artikel ini akan memperkenalkan cara menggunakan PHP untuk melanjutkan cURL untuk melaksanakan permintaan HTTP dan menyediakan beberapa contoh kod praktikal. 1. Penyediaan Pertama, pastikan php telah memasang sambungan cURL. Anda boleh melaksanakan php-m|grepcurl pada baris arahan untuk menyemak

Untuk melanjutkan fungsi fungsi PHP, anda boleh menggunakan sambungan dan modul pihak ketiga. Sambungan menyediakan fungsi dan kelas tambahan yang boleh dipasang dan didayakan melalui pengurus pakej pecl. Modul pihak ketiga menyediakan fungsi khusus dan boleh dipasang melalui pengurus pakej Komposer. Contoh praktikal termasuk menggunakan sambungan untuk menghuraikan data JSON yang kompleks dan menggunakan modul untuk mengesahkan data.

1.UncaughtError:Calltoundefinedfunctionmb_strlen(); Apabila ralat di atas berlaku, ini bermakna kami belum memasang sambungan mbstring 2. Masukkan direktori pemasangan PHP cd/temp001/php-7.1.0/ext/mbstring 3. Mulakan phpize(; /usr/local/bin /phpize atau /usr/local/php7-abel001/bin/phpize) arahan untuk memasang sambungan php 4../configure--with-php-config=/usr/local/php7-abel

Cara menggunakan sambungan Aurora Push untuk melaksanakan fungsi push mesej kelompok dalam aplikasi PHP Dalam pembangunan aplikasi mudah alih, mesej push adalah fungsi yang sangat penting. Jiguang Push ialah perkhidmatan tolak mesej yang biasa digunakan yang menyediakan fungsi dan antara muka yang kaya. Artikel ini akan memperkenalkan cara menggunakan sambungan Aurora Push untuk melaksanakan fungsi push mesej kelompok dalam aplikasi PHP. Langkah 1: Daftar akaun Jiguang Push dan dapatkan kunci API Pertama, kita perlu mendaftar di tapak web rasmi Jiguang Push (https://www.jiguang.cn/push).

PHP ialah bahasa sebelah pelayan yang popular yang boleh digunakan untuk membangunkan aplikasi web dan memproses fail. Sambungan ZipArchive untuk PHP ialah alat yang berkuasa untuk memanipulasi fail zip dalam PHP. Dalam artikel ini, kami akan membincangkan cara menggunakan sambungan ZipArchive PHP untuk membuat, membaca dan mengubah suai fail zip. 1. Pasang sambungan ZipArchive Sebelum menggunakan sambungan ZipArchive, anda perlu memastikan sambungan telah dipasang. Kaedah pemasangan adalah seperti berikut: 1. Pasang

Sambungan POSIX untuk PHP ialah satu set fungsi dan pemalar yang membolehkan PHP berinteraksi dengan sistem pengendalian yang mematuhi POSIX. POSIX (PortableOperatingSystemInterface) ialah satu set piawaian antara muka sistem pengendalian yang direka untuk membolehkan pembangun perisian menulis aplikasi yang boleh dijalankan pada pelbagai sistem pengendalian seperti UNIX atau UNIX. Artikel ini akan memperkenalkan cara menggunakan sambungan POSIX untuk PHP, termasuk pemasangan dan penggunaan. 1. Pasang sambungan POSIX PHP dalam

Dengan pembangunan PHP dan pengembangan berterusan senario aplikasi, sambungan Phar telah menjadi bahagian penting dalam pengaturcaraan PHP. Phar ialah singkatan PHPArchive, yang boleh membungkus berbilang fail dan sumber PHP ke dalam satu fail untuk pengedaran dan pengurusan yang mudah. Artikel ini akan memperkenalkan cara menggunakan sambungan Phar PHP untuk pembungkusan dan pengurusan. Memasang sambungan Phar Mula-mula, kita perlu menyemak sama ada PHP telah memasang sambungan Phar. Di bawah Linux, masukkan arahan berikut melalui terminal: php -m
