ホームページ  >  記事  >  バックエンド開発  >  ThinkPHPフレームワーク設計と拡張の詳細説明、thinkphpフレームワーク_PHPチュートリアルの詳細説明

ThinkPHPフレームワーク設計と拡張の詳細説明、thinkphpフレームワーク_PHPチュートリアルの詳細説明

WBOY
WBOYオリジナル
2016-07-13 10:13:151027ブラウズ

ThinkPHPフレームワークの設計と拡張の詳細な説明、thinkphpフレームワークの詳細な説明

ThinkPHP フレームワークは、中国でよく知られ、広く使用されている PHP フレームワークです。いくつかの簡単な開発例を通じて、このフレームワークがもたらす開発の利便性と、その簡単な拡張設計について詳しく見てみましょう。同時に、ソースコード解析の観点からフレームワークの欠点にも目を向け、総合的かつ客観的な評価を試みます。ここでは、すでに ThinkPHP フレームワークを使用していることを前提としています。基本的な使用方法については、公式ドキュメントを参照してください。

1. フレームワークの階層化と URL ルーティング

フレームワークのインストールは非常に簡単で、ダウンロードして Web サーバーのディレクトリに配置するだけです。ただし、作業を容易にするために、デフォルトのエントリ ファイルの場所を使用せずに、別のディレクトリに配置することをお勧めします。コードとデータの保護。たとえば、私のエントリ ファイルと Web サーバー設定ディレクトリは Web ディレクトリにあります (外側のフレームのindex.php は削除されませんが、使用されません):

ほとんどの MVC フレームワークと同様に、フレームワークのディレクトリ構造に従って独自のコントローラーとビューを拡張するだけで済み、いくつかのページが開発されます。 ThinkPHP は、独自の URL を整理するためにモジュール、コントローラー、およびアクションの 3 層構造を提供します (バージョン 3.1 はグループ化、アクション、およびメソッドと呼ばれ、3.2 はより国際的です)。ディレクトリ構造は次のとおりです。

ここを皆さんに強くお勧めします:

1. ビジネスは個別に階層化されており、コントローラーとモデルに配置する必要はありません。たとえば、拡張関数ライブラリ Application/Common/Common/function.php を使用して、ビジネス レイヤー名を Service:
として強制的に定義します。 リーリー

将来的に wap ページを開発して別のコントローラーを作成する場合、データベースを mysql から mongodb に移行するなど、サービスを再利用できるという利点があります。モデル。はい、サービスはまだ変更する必要がありません。


2. 基本モジュールと業務モジュールは分離されており、相互参照しません。基本モジュール (基本的なユーザー情報など) は、コントローラーとビューを持たないデータ インターフェイスのみを提供します。

3 層のディレクトリはすでに一般的な Web アプリケーションを処理でき、より複雑な Web アプリケーションの場合は、さまざまなエントリ ファイルを定義し、さまざまなアプリケーションをロードして問題を解決できます。もっと複雑なアプリケーション?ポータルや非常に大規模な Web サイトの場合、PHP フレームワークですべての問題を解決できるわけではありません。独自のミドルウェアとカスタマイズされたフレームワークが必要です。

ThinkPHP は、次の 4 つの URL アクセス モードをサポートしています:

1、

通常モード、従来のURLモード、などのすべてのパラメータは分離されています http://localhost/tp/index.php?m=Ucai&c=User&a=index¶=xxx
ルーティングパラメータ: m パラメータはモジュールを表し、c パラメータはコントローラを表し、a はアクセスメソッドを表します
2.
互換モード
http://localhost/tp/index.php?s=/Ucai/User/index/para/xxx
ルーティングパラメータは s パラメータを通じて組み立てられます。 もちろん、データパラメータを s パラメータに置く必要はありません
。 3.
パス情報モード http://localhost/tp/index.php/Ucai/User/index/para/xxx
このモードはエントリーファイルと実際のスクリプトを一緒にします。これは明確な意味を持ち、SEO にも便利です
4.
書き換えモード http://localhost/tp/Ucai/User/index/para/xxx
このモードは、Web サーバーの構成を書き換えることによってエントリ ファイルを非表示にし、より使いやすくしています
pathinfo および rewrite モードには、Web サーバーのサポートが必要です。 ThinkPHP には、U メソッドで URL リンクを生成するときにどのモードに設定する必要があるかという設定があり、Web サーバーがサポートしているメソッドであれば、どのメソッドでも使用できます。
また、ThinkPHP を設定する必要はありませんが、最初のアクセス モードが使用されている限り、後続のすべての URL がこの方法で生成されるため、ユーザーのアクセス方法を記憶することをお勧めします。サポートはありません。サポートの問題はありません。

通常の URL が要件を満たさない場合は、ルーティングを構成することで URL をさらに最適化できます。たとえば、URL をより簡単に構成したいと考えています。 http://localhost/tp/Ucai/login/xxx

以下のルーティング設定をモジュール設定ファイルに追加するだけです。正規表現を使用するとさらに簡略化できます
。 リーリー
この時点で、ThinkPHP フレームワークが非常に豊富な階層と URL 構成をサポートしており、さまざまなニーズを満たすことができることがわかります。もちろん、ルーティング設定を乱用しないことをお勧めします。適切な設定を少量行うと SEO 効果が高まりますが、設定量が多くなるとプロジェクトのメンテナンスや変更が困難になります。

2. ThinkPHP 拡張機能


ThinkPHP 自体には、豊富なコンポーネントとドライバーが含まれています。ThinkPHP の拡張機能の設計を理解するために、データベース ドライバー拡張機能と動作拡張機能を例に挙げてみましょう。

3. データベースドライバー拡張機能

虽然ThinkPHP提供了众多的数据库驱动,但是也并不能满足所有的需求。例如我们的数据很可能不是通过直接访问数据库去实现,而是通过一些中间件(例如C程序)进行转发,从而获得更好的性能,这时就需要扩展数据库驱动来支持。
扩展非常简单,在DB/Driver目录下新建自己的驱动,例如Custom.php,然后实现request和execute方法扩展就算完成了,然后再配置文件里配置DB_TYPE='custom',就可以使用了。这里的request表示查询,execute表示更改数据,所有其他操作都会在Model里进行解析,包装成sql语句调用这两个方法执行。
例如我所实现的最简单的query方式,通过shell命令调用sqlite执行sql语句:

<code>public function query($str) {<br>        $cmd = sprintf('sqlite3 %s "%s"', $this->config['params']['dbfile'], $str);<br>        exec($cmd, $arr);<br>}</code>

当然这个只是示例,ThinkPHP本身就支持sqlite3,通过pdo的方式去连接就可以。实际的应用环境可能是通过连接4层协议访问中间层端口获取数据。

四、Behavior行为扩展

Behavior行为设计是ThinkPHP框架的核心,通过行为配置和扩展,为系统的伸缩性和定制性提供了最大的支持。
假如我们要加入登录验证的功能,按照常规我们会设计自己的父类Controller,然后所有其他的Controller都从这里继承。但有了Behavior会变得更加简单和灵活,我们只需要在tags.php(没有的话在配置目录新建)添加一个Behavior就可以了:

<code>return array(<br>    'action_begin' => array('Ucai\Behavior\AuthBehavior'),<br>    'view_begin' => array('Ucai\Behavior\OutputBehavior'),<br>);</code>

程序在执行到action_begin流程时就会调用这个Behavior,我们可以根据状态进行跳转或终止执行。

<code>namespace Ucai\Behavior;<br>class AuthBehavior {<br>     // 行为扩展的执行入口必须是run<br>     public function run(&$return) {<br>        //不需要验证的action设置为true<br>         if (!$return['AUTH_PUBLIC']) {<br>            if (service('User')->checkLogin())<br>            {<br>                $return = true;<br>            }<br>            else<br>            {<br>                header('Content-Type: text/html; charset=utf-8');<br>                redirect(U('User/index', array('url' => $_SERVER['HTTP_REFERER'])), 5, '需要登录,5秒后跳转。。。');<br>            }<br>         }<br>     }<br>}</code>

对于不需要登录的页面我们可以在Controller里添加配置,所有不配置的都会要求登录验证。

<code>public $config = array('AUTH_PUBLIC' => true);</code>

这里大家对继承和Behavior实现登录验证做一个对比,可能觉得区别不大。但是在一个复杂的项目里,这种功能会非常多,如果每个功能都放到父类里,就会非常庞大,并且部分子类可能又不需要,这时候用Behavior去定制流程就会显得游刃有余。
在上面的配置中我们还发现了一个配置OutputBehavior更能说明问题,大家有没有猜到,这个Behavior我是用来在view里输出一些共有变量,例如jscss的域名和路径等。在没有Behavior之前,大家是不是需要一个公共方法,然后每个页面都去调用一次,或者改写View的类代码?有了Behavior就显得方便许多。

<code>namespace Ucai\Behavior;<br>class OutputBehavior {<br>     public function run(&$return) {<br>        $view = \Think\Think::instance('Think\View');<br>        $view->assign('STATIC_URL', 'http://p3.ucai.cn/static');<br>     }<br>}</code>

扩展总结:通过Behavior扩展和数据库驱动扩展大家可以看到,ThinkPHP提供了很灵活的扩展和增强机制,能满足众多需求。其他存储、缓存、日志、模板引擎等如果需要也能很方便的扩展。

五、源码分析与不足

首先我们来分析一下框架执行的大致流程:
index.php(入口、调试模式、应用路径)
--> ThinkPHP.php(定义路径与访问模式)
--> Think\Think(类加载器、异常处理、读取共有配置)
--> Think\App(请求url调度解析、执行调度解析结果)
--> exec 执行用户定义的Controller的Action方法
--> Think\Dispatcher(根据url模式解析M、C、A和参数,加载模块配置)
--> Think\Controller(调用视图、包装和重定向)
可以看到,框架的内部流程其实比较简单,还有2个很重要的类:
Think\Hook: 监听App、Action、View的各个阶段,执行Behavior
Think\Behavior: 可配置(配置文件)可增删(代码)

在分析源代码的过程中,我们也看到了一些不足:

1、宏定义过多,难于维护和修改
建议:只在个别文件定义极少数几个宏,其余用类常量包装
2、面向过程代码过多,封装不清晰
建议:用面向对象思想包装
例如:url的解析和包装,现在是在Dispatcher里生成APP宏,然后在U方法里读取宏并生成最终url。其实完全可以定义一个类来包装例如UrlHelper,而类的二个方法parse和generate分别负责解析和生成url,这样代码结构会清晰很多。
3、有的函数和类代码封装过多,复用和改进不方便
建议:用组合来封装独立功能内容
例如:Model的校验功能,完全可以独立成类,也可以用于非Model对象调用。而现在的校验接口是Model的保护性方法,只能在Model的create函数调用,外面必须通过create方法才能校验。
4、代码规范和风格问题
希望代码风格能更加规范和标准,例如DB类作为模板方法的父类,应该用抽象方法或抛出异常形式定义所有Model需用到的方法。事实上有些方法子类是不需要的,而Db类却没有实现。

六、总结

ThinkPHP は、中国で人気のある PHP フレームワークとして、確かに私たちの開発に利便性をもたらしてくれました。フレームワーク開発者は Web プロセスを十分に理解しており、PHP 関数のアプリケーションに習熟しています。このフレームワークは、さまざまなニーズに適応する柔軟な構成と拡張を定義し、開発を加速するための豊富なコンポーネントとモジュールを提供します。最後に、ThinkPHP のドキュメントとコミュニティのサポートは非​​常に充実しており、これもフレームワークの人気に欠かせない部分です。また、ThinkPHP が今後さらに構造を改善し、最高の PHP フレームワークを構築できることを期待しています。

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/917022.html技術記事 ThinkPHP フレームワークの設計と拡張の詳細な説明、thinkphp フレームワークの詳細な説明 ThinkPHP フレームワークは、中国で非常によく知られ、広く使用されている PHP フレームワークです。いくつかの簡単な開発例から詳しく説明します...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。