基本:
1. 基本概念
LAMP
LAMP は、Linux、Apache、MySQL、および PHP に基づくオープン リソース ネットワーク開発プラットフォームです。この用語はヨーロッパに由来しており、ヨーロッパではこれらのプログラムが標準の開発環境として一般的に使用されていました。名前は各プログラムの頭文字に由来しています。各プログラムは、その所有権においてオープン ソース標準に準拠しています。Linux はオープン システムであり、Apache は、Web ベースの管理用の追加ツールを備えたリレーショナル データベースです。他の言語の優れた機能の多くを利用して、Web 開発をより効率的にします。 Windows オペレーティング システム上の Linux 環境でこれらのツールを使用する開発者は、WAMP を使用して呼び出されます。
これらのオープン ソース プログラム自体は、他のいくつかのプログラムと連携して動作するように特別に設計されているわけではありませんが、これらはすべて影響力のあるオープン ソース ソフトウェアであり、多くの共通の特性を共有しているため、これらのコンポーネントは一緒に使用されることがよくあります。過去数年間にわたって、これらのコンポーネントの互換性は向上し続けており、それらを組み合わせて使用することがより一般的になりました。そして、さまざまなコンポーネント間の連携を改善するために、特定の拡張機能を作成しました。現在、これらの製品は、ほとんどすべての Linux ディストリビューションにデフォルトで含まれています。 Linux オペレーティング システム、Apache サーバー、MySQL データベース、Perl、PHP、または Python 言語、これらの製品が連携して強力な Web アプリケーション プラットフォームを形成します。
オープンソーストレンドの活発な発展に伴い、オープンソースLAMPはJ2EEおよび.Net商用ソフトウェアと三位一体のトレンドを形成しており、ソフトウェア開発プロジェクトはソフトウェアへの投資コストが低いため、IT全体の注目を集めています。コミュニティ。 Web サイトのトラフィックに関しては、LAMP が最も強力な Web サイト ソリューションです。
OOP
オブジェクト指向プログラミング (OOP、オブジェクト指向プログラミング) は、コンピューター プログラミング アーキテクチャです。 OOP の基本原理は、コンピューター プログラムがサブルーチンとして機能する個々のユニットまたはオブジェクトで構成されるということです。 OOP は、再利用性、柔軟性、拡張性というソフトウェア エンジニアリングの 3 つの主な目標を達成します。全体的な操作を実現するために、各オブジェクトは情報を受信し、データを処理し、他のオブジェクトに情報を送信できます。 OOP には主に次の概念とコンポーネントがあります:
コンポーネント - 実行中のコンピューター プログラム内でデータと機能が一緒に形成される単位。コンポーネントは、OOP コンピューター プログラムのモジュールと構造の基礎です。
抽象性 - プログラムには、処理される情報の特定の側面を無視する機能、つまり、情報の主要な側面に焦点を当てる機能があります。
カプセル化 - 情報カプセル化とも呼ばれます。コンポーネントが他のコンポーネントの内部状態を予期しない方法で変更しないようにします。内部状態を変更するメソッドを提供するコンポーネントのみが内部状態にアクセスできます。各タイプのコンポーネントは、他のコンポーネントと通信するためのインターフェイスを提供し、他のコンポーネントが呼び出すメソッドを指定します。
ポリモーフィズム - コンポーネント参照とクラス アセンブリには、他の多くの異なるタイプのコンポーネントが含まれており、コンポーネントの参照によって生成される結果は、実際の呼び出しタイプに基づく必要があります。
継承 - 既存のコンポーネントに基づいてサブクラス化されたコンポーネントを作成できるようにし、ポリモーフィズムとカプセル化を統合および強化します。通常、クラスはコンポーネントをグループ化するために使用されますが、新しいクラスを既存のクラスの拡張として定義することもできるため、クラスをツリー構造またはネットワーク構造に編成して、アクションの多用途性を反映できます。
コンポーネントベースのプログラミングは、抽象化、カプセル化、再利用性、使いやすさなどの理由から、スクリプト言語で特に人気があります。
MVC
MVC は、アプリケーションの入力、処理、出力の分離を強制する設計パターンです。 MVC を使用するアプリケーションは、モデル (M)、ビュー (V)、およびコントローラー (C) の 3 つのコア コンポーネントに分割されており、それぞれが独自のタスクを処理します。
ビュー: ビューは、ユーザーが表示して操作するインターフェイスです。旧来の Web アプリケーションの場合、ビューは HTML 要素で構成されるインターフェイスです。新しいスタイルの Web アプリケーションでも、HTML はビュー内で重要な役割を果たしていますが、Adobe Flash や一部のマークアップ言語など、いくつかの新しいテクノロジが際限なく登場しています。 XHTML、XML/XSL、WML などの Web サービスアプリケーションのインターフェイスをどのように扱うかは、ますます困難になってきています。 MVC の大きな利点の 1 つは、アプリケーションのさまざまなビューを処理できることです。データがオンラインで保存されているか、従業員のリストで保存されているかに関係なく、ビューでは実際の処理は発生せず、データを出力してユーザーが操作できるようにする手段としてのみ機能します。
モデル: モデルは企業データとビジネス ルールを表します。 MVC の 3 つのコンポーネントの中で、モデルには最も多くの処理タスクがあります。たとえば、EJB や ColdFusion コンポーネントなどのコンポーネント オブジェクトを使用してデータベースを処理する場合があります。モデルによって返されるデータはニュートラルです。これは、モデルがデータ形式とは何の関係もないことを意味するため、モデルは複数のビューにデータを提供できます。モデルに適用されるコードは 1 回記述するだけで済み、複数のビューで再利用できるため、コードの重複が削減されます。
コントローラー: コントローラーはユーザー入力を受け入れ、モデルとビューを呼び出してユーザーのニーズを満たします。そのため、Web ページ内のハイパーリンクがクリックされて HTML フォームが送信された場合、コントローラー自体は何も出力したり、処理を実行したりしません。リクエストを受信し、リクエストを処理するためにどのモデル コンポーネントを呼び出すかを決定し、モデル処理によって返されたデータを表示するためにどのビューを使用するかを決定するだけです。
次に、MVC の処理プロセスを要約します。まず、コントローラーはユーザーのリクエストを受け取り、処理のためにどのモデルを呼び出すかを決定します。次に、モデルはビジネス ロジックを使用してユーザーのリクエストを処理し、データを返します。データは、対応するビューとともに返され、プレゼンテーション層を通じてユーザーに表示されます。
ORM
オブジェクト/リレーションマッピング (略してORM) は、オブジェクト指向ソフトウェア開発手法の発展とともに生まれました。オブジェクト指向開発手法は、今日のエンタープライズレベルのアプリケーション開発環境における主流の開発手法であり、リレーショナルデータベースは、エンタープライズレベルのアプリケーション環境でデータを永続的に保存する主流のデータストレージシステムです。オブジェクトとリレーショナル データは、ビジネス エンティティの 2 つの表現形式です。ビジネス エンティティは、メモリ内ではオブジェクトとして、データベース内ではリレーショナル データとして表されます。メモリ内のオブジェクト間には関連付けや継承関係がありますが、データベースではリレーショナル データは多対多の関連付けや継承関係を直接表現できません。したがって、オブジェクト リレーショナル マッピング (ORM) システムは一般にミドルウェアの形式で存在し、主にプログラム オブジェクトからリレーショナル データベース データへのマッピングを実装します。
オブジェクト指向はソフトウェア工学の基本原理 (結合、集約、カプセル化など) に基づいて開発されますが、リレーショナル データベースは数学理論に基づいて開発されます。この 2 つの理論には大きな違いがあります。この不一致現象を解決するために、オブジェクト リレーショナル マッピング技術が登場しました。
AOP
AOP(Aspect-Oriented Programming、アスペクト指向プログラミング)は、OOP(Object-Oriented Programming、オブジェクト指向プログラミング)を補完・改良したものと言えます。 OOP では、カプセル化、継承、ポリモーフィズムなどの概念を導入して、オブジェクト階層を確立し、一般的な動作のコレクションをシミュレートします。分散オブジェクトにパブリックな動作を導入する必要がある場合、OOP は無力です。つまり、OOP では上から下への関係を定義できますが、左から右への関係の定義には適していません。例えばロギング機能。ロギング コードは、すべてのオブジェクト階層にわたって水平に分散される傾向があり、分散先のオブジェクトのコア機能とは何の関係もありません。セキュリティ、例外処理、透過的な永続性など、他のタイプのコードにも同じことが当てはまります。この種の無関係なコードが随所に散在することは、OOP 設計では横断的コードと呼ばれ、大量のコードの重複につながり、さまざまなモジュールの再利用に役立ちません。 AOP 技術はその逆で、「クロスカッティング」と呼ばれる技術を使用してカプセル化されたオブジェクトの内部を解剖し、複数のクラスに影響を与えるパブリックな動作を再利用可能なモジュールにカプセル化します。その名前は「Aspect」です。側面。いわゆる「アスペクト」とは、簡単に言えば、システム内のコードの重複を減らし、結合を減らすために、ビジネスとは関係がないが、ビジネス モジュールによって一般的に呼び出されるロジックや責任をカプセル化することです。モジュール間を統合し、将来の操作性と保守性を向上させます。 AOP が水平的な関係を表すのは、「オブジェクト」がオブジェクトのプロパティと動作をカプセル化した中空の円筒である場合、アスペクト指向プログラミング手法は、これらの中空の円筒を切り開くようなものです。その内部の情報を入手します。カットされた断面はいわゆる「アスペクト」です。そして、これらの切断部分を驚異的な技術で跡形もなく復元しました。
「横断的」テクノロジーを使用して、AOP はソフトウェア システムを 2 つの部分 (中核的な懸念事項と横断的な懸念事項) に分割します。業務処理のメインプロセスが中心的な関心事であり、それとあまり関係のない部分が横断的な関心事です。横断的な懸念事項の特徴の 1 つは、それらが中核的な懸念事項の複数の場所で発生することが多いですが、基本的にはどこでも同様であるということです。権限認証、ロギング、トランザクション処理など。 Aop の役割は、システム内のさまざまな懸念事項を分離し、中核的な懸念事項と横断的な懸念事項を分離することです。アバナードのシニア ソリューション アーキテクトであるアダム マギー氏が述べたように、AOP の中心的な考え方は、「アプリケーション内のビジネス ロジックを、それをサポートする共通サービスから分離する」ことです。 ”
CURD
CURDはデータベーステクノロジーの略称で、一般的なプロジェクト開発におけるさまざまなパラメータの基本的な機能です。これは、作成、更新、読み取り、および削除の操作を表します。 CURD は、データを処理するための基本的なアトミック操作を定義します。 CURD が技術的に難しいレベルにまで引き上げられている理由は、複数のデータベース システムで CURD 操作を含む集計関連アクティビティを完了するパフォーマンスが、データ関係の変化に応じて大きく異なる可能性があるためです。
CURD は、特定のアプリケーションで作成、更新、読み取り、および削除メソッドを必ずしも使用するわけではありませんが、それらが実行する機能は同じです。たとえば、ThinkPHP は、add、save、select、および delete メソッドを使用して、モデルの CURD 操作を表します。
ActiveRecord
Active Record (中国語名: Active Record) は、リレーショナル データベース内のテーブルに対応するモデル クラスと、レコードの行に対応するモデル クラスのインスタンスによって特徴付けられるドメイン モデル パターンです。表にある。 Active Record と Row Gateway はよく似ていますが、前者はドメイン モデル、後者はデータ ソース モデルです。リレーショナル データベースは、多くの場合、外部キーを通じてエンティティの関係を表現します。また、Active Record は、この関係をデータ ソース レベルでのオブジェクトの関連付けと集計にマップします。 Active Record は、非常に単純なドメイン要件、特にドメイン モデルとデータベース モデルが非常に似ている場合に適しています。より複雑なドメイン モデル構造 (継承と戦略を使用したドメイン モデルなど) が発生した場合は、多くの場合、データ ソースを分離し、それをデータ マッパーと組み合わせるドメイン モデルを使用する必要があります。
Active Recordドライバーフレームワークは一般的にORMフレームワークの機能を備えていますが、Row Gatewayとの違いと同様に、Active Recordは単純なORMではありません。 Rails によって最初に提案されたこのモデルは、テーブルがレコードにマップされ、レコードがオブジェクトにマップされ、フィールドがオブジェクトのプロパティにマップされるという標準 ORM モデルに従っています。次の命名規則と構成規則を使用すると、モデルの操作を大幅に迅速に実現でき、簡潔で理解しやすくなります。
単一入口
単一エントリは、通常、プロジェクトまたはアプリケーションに統合された (ただし、必ずしも一意である必要はない) エントリ ファイルがあることを意味します。つまり、プロジェクトのすべての機能操作がこのエントリ ファイルを通じて実行され、多くの場合、エントリ ファイルが最初のステップで実行されます。
入り口が 1 つであることの利点は、同じ入り口にはさまざまな操作に対して同じルールが適用されることが多いため、プロジェクト全体が比較的標準化されていることです。また、入口が単一であることのメリットとして、傍受が便利なため制御が柔軟になり、一部の権限制御やユーザーログインなどの判断や操作を統一的に扱えることも挙げられます。
すべての Web サイトが 1 つのエントリ ファイルを通じてアクセスされるのではないかと心配する人もいるかもしれませんが、実際、これは根拠のない考えです。
2. ディレクトリ構造
ディレクトリ/ファイル | 説明 |
---|---|
ThinkPHP.php | フレームワークエントリーファイル |
共通 | フレームワークパブリックファイルディレクトリ |
会議 | フレームワーク構成ファイルディレクトリ |
Lang | フレームワークシステム言語ディレクトリ |
Lib | システムコア基本クラスライブラリディレクトリ |
Tpl | システムテンプレートディレクトリ |
Extend | フレームワーク拡張ディレクトリ (約拡張ディレクトリの詳細については、後の拡張章を参照してください) |
注: コア バージョンをダウンロードすると、ThinkPHP 自体は拡張機能に依存しないため、Extend ディレクトリが空になる可能性があります。
3. 命名規則
ThinkPHP で開発する場合は、次の命名規則に従うようにしてください:
クラス ファイルにはすべて .class.php という接尾辞が付けられます (これは内部使用を指します)。 ThinkPHP クラス ライブラリ ファイルの名前は、外部からロードされたクラス ライブラリ ファイルを表しません)、キャメルケースの名前を使用し、DbMysql.class.php のように最初の文字が大文字になっていることを確認してください。 Unix システムでは、クラスでは大文字と小文字が区別されるため、呼び出しの大文字と小文字は一致します (デバッグ モードの ThinkPHP は、Windows プラットフォームでも大文字と小文字の区別を厳密にチェックします)
クラス名とファイル名は一致しています (前述の一貫したケースを含む)。たとえば、UserAction クラスのファイル名は UserAction.class.php、InfoModel クラスのファイル名は InfoModel.class.php、さまざまなクラス ライブラリのクラス命名には特定の基準があります。 ;
関数、設定ファイル、およびその他のクラス ライブラリ ファイル その他の関数には、通常 .php 接尾辞が付いています (サードパーティによって導入された関数には必須ではありません)。 ;
メソッドはキャメルケースを使用して名前が付けられ、getUserName、_parseType など、最初の文字は小文字またはアンダースコア "_" が使用されます。通常、アンダースコアで始まるメソッドはプライベート メソッドです。キャメルケースを使用し、最初の文字が小文字かアンダースコア「_」が使用されます ( tableName 、 _instance など)。通常、アンダースコアで始まる属性はプライベート属性です。
二重アンダースコア「__」で始まる関数またはメソッド。 __call や __autoload などのマジック メソッドとして使用されます。
定数名は、HAS_ONE や MANY_TO_MANY のように、大文字とアンダースコアで名前が付けられます。
構成パラメータは、HTML_CACHE_ON のように、大文字とアンダースコアで名前が付けられます。
言語変数は、MY_LANG のように大文字とアンダースコアで名前が付けられます。アンダースコアで始まる言語変数は、通常、_CLASS_NOT_EXIST_ などのシステム言語変数に使用されます。
変数の名前付けに必須の指定はありません。
ThinkPHP のテンプレート ファイルのデフォルトは接尾辞として .html です (設定を通じて変更可能)
データ テーブルとフィールドの名前は小文字で下線が引かれていますので注意してください。 think_user テーブルや user_name フィールドなどのフィールド名をアンダースコアで始めないでください。_username などのデータ テーブル フィールドはフィルタリングされる可能性があります。
ThinkPHP3.0 バージョンでは、新しい CBD (コア + ビヘイビア + ドライバー) アーキテクチャ モデルが導入されています。これは、フレームワークが最も重要なコア + ビヘイビア + ドライバー アーキテクチャ システムを採用しているためです。パーツは保持され、ラベルはマーキングのために重要な位置に設定されます。開発者は、独自のニーズに基づいて特定のラベルの位置を拡張したり、置き換えたりすることができます。また、アプリケーション層に独自のラベル位置とアプリケーション行を追加することもできます。ラベルの位置は、AOP 概念の「アスペクト」に似ており、システムの組み込みコア拡張機能が標準モードと見なされる場合、ユーザーはこのすべての動作のカスタマイズを使用できます。新しいパターンにパッケージ化されるため、ThinkPHP ではパターン拡張と呼ばれます。実際、パターン拡張は動作を置き換えたり追加したりするだけでなく、カスタマイズされたカスタマイズの目的を達成するために基礎となる MVC を置き換えたり変更したりすることもできます。この新機能を使用すると、開発者はパターン拡張機能を通じて自分自身または自社の開発フレームワークを簡単にカスタマイズできます。パターン拡張機能の新しいバージョンは、フレームワーク拡張機能のマスターであり、新しいマイルストーンを作成します。これがまさに新しいバージョンの本当の美しさです。 。
システム設計、データベースとデータ テーブルの作成 (オプション)
キャッシュ機能を開発および設定します。 (オプション)
ルーティング サポートを追加します。 (オプション)
本番環境にデプロイします。
ThinkPHP は、プロジェクトのデプロイメントとアクセスに単一エントリーモードを採用しており、どの機能が完了しても、プロジェクトには統一された (ただし、唯一であるとは限りません) エントリーがあります。すべてのプロジェクトはエントリ ファイルから始まり、すべてのプロジェクトのエントリ ファイルは類似していると言うべきです。 エントリ ファイルには主に以下が含まれます:
フレームワーク パス、プロジェクト パス、およびプロジェクト名を定義します (オプション)
デバッグ モードと実行モードに関連する定数を定義します (オプション)
フレームワーク エントリ ファイルをロードします (必須)
生成されたプロジェクト ディレクトリ構造は、以下を含むシステム ディレクトリと似ています。 :directory
description
Lang | プロジェクト言語パックディレクトリ(オプション、多言語サポートが必要ない場合は削除可能) |
---|---|
Lib | プロジェクトクラスライブラリディレクトリ(通常はActionとModelサブディレクトリを含む) |
Tpl | プロジェクトテンプレートdirectory 、テンプレート テーマをサポートします |
Runtime | プロジェクト ランタイム ディレクトリ。これには、Cache (テンプレート キャッシュ)、Temp (データ キャッシュ)、Data (データ ディレクトリ)、および Logs (ログ ファイル) サブディレクトリが含まれます。グループがある場合は、最初にグループディレクトリ。 |
index.php を App ディレクトリの外に移動する必要がある場合は、プロジェクト名とプロジェクト パスの定義をエントリ ファイルに追加するだけです。 | |
//プロジェクト名を定義 | |
define('APP_NAME', 'App'); |
注: Unix のような環境または Linux 環境では、ランタイム ディレクトリに書き込み権限が必要です。
8. デプロイメントディレクトリ
システムディレクトリ(以下のディレクトリ構造は上記のシステムディレクトリと同じです)
Uploads | Web サイトのアップロード ディレクトリ (ユーザーがアップロードした統合ディレクトリ) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Home | プロジェクト ディレクトリ (以下のディレクトリ構造)アプリケーションディレクトリ) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Admin | バックエンド管理プロジェクトディレクトリ | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
… プロジェクト管理者のエントリファイル | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
プロジェクトのテンプレート ファイルは引き続きプロジェクトの Tpl ディレクトリに配置されますが、画像、JS、CSS を含む外部から呼び出されるリソース ファイルは、Web サイトのパブリック ディレクトリ Public に配置され、Images、Js、およびCss サブディレクトリ (可能であれば) その場合、リモート呼び出し用にこれらのリソース ファイルを外部サーバーに個別に配置して最適化することもできます。 実際、システム ディレクトリとプロジェクト ディレクトリは非 WEB アクセス ディレクトリの下に配置でき、Web サイト ディレクトリの下にはパブリック ディレクトリとエントリ ファイルのみを配置する必要があるため、Web サイトのセキュリティが向上します。 自分でディレクトリを設定したい場合は、エントリ ファイル内の RUNTIME_PATH 定数を変更できます。例:
注RUNTIME_PATH ディレクトリには書き込み権限を設定する必要があります。
ThinkPHP フレームワークのすべての設定ファイルの定義形式は PHP 配列を返します。形式は次のとおりです:
//项目配置文件 return array( 'DEFAULT_MODULE' => 'Index', //默认模块 'URL_MODEL' => '2', //URL模式 'SESSION_AUTO_START' => true, //是否开启session 'USER_CONFIG' => array( 'USER_AUTH' => true, 'USER_TYPE' => 2, ), //更多配置参数 //... ); ログイン後にコピー
構成よりも規則が重要であり、システムは組み込みの規則構成ファイル (Confconvention.php にあります) を持っています。共通パラメータは、ほとんどの用途に応じてデフォルトで設定されます。
'APP_STATUS' => 'debug', //应用调试模式状态 ログイン後にコピー
テストステータスなど、デバッグモードでアプリケーションのステータスを追加したい場合は、プロジェクト構成ファイルの設定を次のように変更できます: 'APP_STATUS' => 'test', //应用调试模式状态 ログイン後にコピー デバッグモードにはキャッシュがないため、 、より多くのファイル IO 操作が含まれ、テンプレートはリアルタイムでコンパイルされるため、デバッグ モードがオンになっている場合、パフォーマンスはある程度低下しますが、デプロイメント モードのパフォーマンスには影響しません。
'APP_GROUP_LIST' => 'Home,Admin', //项目分组设定 'DEFAULT_GROUP' => 'Home', //默认分组 ログイン後にコピー Conf/Home/config.php Conf/Admin/config.php ログイン後にコピー 注: グループ名は大文字と小文字が区別され、定義されたグループ名と一致している必要があります。 設定ファイルを定義した後、システムが提供する C メソッドを使用して (奇妙に感じる場合は、覚えやすくするために Config という単語を使用できます)、既存の設定を読み取ることができます:
C メソッドは、2 次元構成を読み取るために使用することもできます: C('USER_CONFIG.USER_TYPE')//ユーザー構成内のユーザー タイプ設定を取得します
特定のアクション メソッドでは、特定のパラメーター (主にまだ使用されていないパラメーター) を動的に構成できます。
たとえば、データキャッシュの有効期間を動的に変更する必要がある場合は、
は、次のように操作にドット構文を使用して、2 次元配列の読み取りと設定をサポートすることもできます。 set:
二次構成方法を使用する場合は、次のように設定できます: 'USER' => 'user', //ユーザー構成
lib.driver built-in driverライブラリパッケージ
アプリケーション クラス ライブラリ アプリケーション クラス ライブラリは、プロジェクトで定義または使用されるクラス ライブラリも ThinkPHP の命名規則に従います。アプリケーション ライブラリ ディレクトリは、プロジェクト ディレクトリの下の Lib ディレクトリにあります。アプリケーション ライブラリには、アクション ライブラリ、モデル ライブラリ、またはその他のツール ライブラリを含む幅広い範囲があり、通常は
项目根据自己的需要可以在项目类库目录下面添加自己的类库包,例如Lib/Common、Lib/Tool等。 类库导入 一、Import显式导入ThinkPHP模拟了Java的类库导入机制,统一采用import方法进行类文件的加载。import方法是ThinkPHP内建的类库导入方法,提供了方便和灵活的文件导入机制,完全可以替代PHP的require和include方法。例如:
import方法具有缓存和检测机制,相同的文件不会重复导入,如果导入了不同的位置下面的同名类库文件,系统也不会再次导入 注意:在Unix或者Linux主机下面是区别大小写的,所以在使用import方法的时候要注意目录名和类库名称的大小写,否则会导入失败。对于import方法,系统会自动识别导入类库文件的位置,ThinkPHP的约定是Think、ORG、Com包的导入作为基类库导入,否则就认为是项目应用类库导入。
上面两个方法分别导入了Think基类库的Util/Session.class.php文件和ORG扩展类库包的Util/Page.class.php文件。 要导入项目的应用类库文件也很简单,使用下面的方式就可以了,和导入基类库的方式看起来差不多:
上面的方式分别表示导入MyApp项目下面的Lib/Action/UserAction.class.php和Lib/Model/InfoModel.class.php类文件。 通常我们都是在当前项目里面导入所需的类库文件,所以,我们可以使用下面的方式来简化代码
二,别名导入除了命名空间的导入方式外,import方法还可以支持别名导入,要使用别名导入,首先要定义别名,我们可以在项目配置目录下面增加alias.php 用以定义项目中需要用到的类库别名,例如:
那么,现在就可以直接使用:
导入Rbac和Page类,别名导入方式禁止使用import方法的第二和第三个参数,别名导入方式的效率比命名空间导入方式要高效,缺点是需要预先定义相关别名。 导入第三方类库 第三方类库统一放置在系统扩展目录下的Vendor 目录,并且使用vendor 方法导入,其参数和 import 方法是 一致的,只是默认的值有针对变化。 例如,我们把 Zend 的 Filter\Dir.php 放到 Vendor 目录下面,这个时候 Dir 文件的路径就是 Vendor\Zend\Filter\Dir.php,我们使用vendor 方法导入只需要使用:
就可以导入Dir类库了。 Vendor('Zend.Filter.Dir',dirname(__FILE__),'.class.php'); ログイン後にコピー 自动加载 在大多数情况下,我们无需手动导入类库,而是通过配置采用自动加载机制即可,自动加载机制是真正的按需加载,可以很大程度的提高性能。自动加载有三种情况,按照加载优先级从高到低分别是:别名自动加载、系统规则自动加载和自定义路径自动加载。 一、别名自动加载在前面我们提到了别名的定义方式,并且采用了import方法进行别名导入,其实所有定义别名的类库都无需再手动加载,系统会按需自动加载。 二、 系统规则自动加载果你没有定义别名的话,系统会首先按照内置的规则来判断加载,系统规则仅针对行为类、模型类和控制器类,搜索规则如下:
注意:搜索的优先顺序从上至下 ,一旦找到则返回,后面规则不再检测。如果全部规则检测完成后依然没有找到类库,则开始进行第三个自定义路径自动加载检测。 三、 自定义路径自动加载当你的类库比较集中在某个目录下面,而且不想定义太多的别名导入的话,可以使用自定义路径自动加载方式,这种方式需要在项目配置文件中添加自动加载的搜索路径,例如: 'APP_AUTOLOAD_PATH' =>'@.Common,@.Tool', ログイン後にコピー
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ 控制器: 1. URL模式 传统方式的文件入口访问会变成由URL的参数来统一解析和调度。 ThinkPHP支持四种URL模式,可以通过设置URL_MODEL参数来定义,包括普通模式、PATHINFO、REWRITE和兼容模式。 一、普通模式:设置URL_MODEL 为0
二、PATHINFO模式(默认模式):设置URL_MODEL 为1 http://serverName/appName/module/action/id/1/或者 http://serverName/appName/module,action,id,1/ ログイン後にコピー 三、REWRITE模式: 设置URL_MODEL 为2 四、兼容模式: 设置URL_MODEL 为3 兼容模式的效果是:
并且也可以支持参数分割符号的定义,例如在URL_PATHINFO_DEPR为~的情况下,下面的URL有效:
其实是利用了VAR_PATHINFO参数,用普通模式的实现模拟了PATHINFO的模式。但是兼容模式并不需要自己传s变量,而是由系统自动完成URL部分。正是由于这个特性,兼容模式可以和PATHINFO模式之间直接切换,而不需更改模板文件里面的URL地址连接。我们建议的方式是采用PATHINFO模式开发,如果部署的时候环境不支持PATHINFO则改成兼容URL模式部署即可,程序和模板都不需要做任何改动。 2. 模块和操作 http://域名/项目名/分组名/模块名/操作名/其他参数 3.1版本开始,增加ACTION_SUFFIX配置参数,用于设置操作方法的后缀。
那么访问某个模块的add操作对应读取模块类的操作方法则由原来的add方法变成addAct方法。 3. 定义控制器和空操作,空模块 一个应用如果不需要和数据库交互的时候可以不需要定义模型类,但是必须定义Action控制器,一般位于项目的Lib/Action目录下面。
控制器文件的名称是UserAction.class.php。 空の操作とは、システムが指定された操作メソッドを見つけられない場合に、空の操作 (_empty) メソッドを見つけて実行することを意味します。このメカニズムを使用すると、エラー ページと一部の URL の最適化を実現できます。 空のモジュールの概念は、システムが指定されたモジュール名を見つけられない場合、システムが空のモジュール (EmptyAction) を見つけようとすることを意味します。このメカニズムを使用して、エラー ページをカスタマイズし、URL を最適化できます。 4. モジュールのグループ化 モジュールのグループ化に関連する設定パラメータには以下が含まれます:
たとえば、現在のプロジェクトを、それぞれフロントエンド機能とバックエンド機能を表す Home と Admin の 2 つのグループに分割する場合、プロジェクト構成に次の構成を追加するだけで済みます:
複数のグループはカンマで区切ることができます。悩ませる。
注: 擬似静的サフィックスを設定するときに、サフィックスに「.」を含める必要はありません。したがって、次の設定は実際には同等です:
< /code><code><code><code><code><code><code><code><code><code> 8. URL生成 <code><code><code><code><code><code><code><code><code>
<code><code><code><code><code><code><code><code><code>
<code><code><code><code><code><code><code><code><code>
<code><code><code><code ><code>< code><code><code><code><code><code>使用される URL モードと一致させるには、現在の URL 設定に基づいて対応する URL アドレスを動的に生成できる必要があります。この目的のために、ThinkPHP は、URL の動的生成に使用される組み込み U メソッドを提供します。これにより、移植プロセス中にプロジェクトが環境の影響を受けないようにすることができます。 <li> U メソッドの定義規則は次のとおりです (角括弧内のパラメータは実際のアプリケーションに応じて決定されます): <code><code><code><code><code><code><code><code><code>
<code><code><code><code><code><code><code><code><code> 根据项目的不同URL设置,同样的U方法调用可以智能地对应产生不同的URL地址效果,例如针对
如果当前URL设置为普通模式的话,最后生成的URL地址是:
那么可以使用
最终生成的URL地址是:
注意:如果你是在模板文件中直接使用U方法的话,需要采用 {:U('参数1', '参数2'…)} 的方式,具体参考模板引擎章节的8.3 使用函数内容。 如果你的应用涉及到多个子域名的操作地址,那么也可以在U方法里面指定需要生成地址的域名,例如:
@后面传入需要指定的域名即可。 9. URL大小写 只要在项目配置中,增加:
就可以实现URL访问不再区分大小写了。 这里需要注意一个地方,如果我们定义了一个UserTypeAction的模块类,那么URL的访问应该是:
利用系统提供的U方法可以为你自动生成相关的URL地址。
的话,URL就又变成:
注意:URL不区分大小写并不会改变系统的命名规范,并且只有按照系统的命名规范后才能正确的实现URL不区分大小写。 10. 前置和后置操作 系统会检测当前操作是否具有前置和后置操作,如果存在就会按照顺序执行,前置和后置操作的方法名是在要执行的方法前面加 _before_和_after_,例如:
对于任何操作方法我们都可以按照这样的规则来定义前置和后置方法。 <code><code><code><code><code><code><code><code><code> 如果当前的操作并没有定义操作方法,而是直接渲染模板文件,那么如果定义了前置 和后置方法的话,依然会生效。真正有模板输出的可能仅仅是当前的操作,前置和后置操作一般情况是没有任何输出的。 <code><code><code><code><code><code><code><code><code> 11. 跨模块调用
因为系统会自动加载Action控制器,因此 我们不需要导入UserAction类就可以直接实例化。
R方法表示调用一个模块的某个操作方法,调用格式是:
R方法还支持对调用的操作方法需要传入参数,例如User模块中我们定义了一个info方法:
接下来,我们可以在其他模块中调用:
表示调用当前项目的User模块的info操作方法,并且id参数传入15 12. 页面跳转
Success和error方法都有对应的模板,并且是可以设置的,默认的设置是两个方法对应的模板都是:
也可以使用项目内部的模板文件
模板文件可以使用模板标签,并且可以使用下面的模板变量:
success和error方法会自动判断当前请求是否属于Ajax请求,如果属于Ajax请求则会调用ajaxReturn方法返回信息,具体可以参考后面的AJAX返回部分。 3.1版本开始,error和success方法支持传值,无论是跳转模板方式还是ajax方式 都可以使用assign方式传参。例如:
当正常方式提交的时候,var1和var2变量会赋值到错误模板的模板变量。 13. 重定向 Action类的redirect方法可以实现页面的重定向功能。
関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
最新の問題
function_exists() はカスタム関数を決定できません
Function test () {return true;} if (function_exists ('test')) {echo "テストは関数です";
から 2024-04-29 11:01:01
0
3
2060
Google Chromeのモバイル版を表示する方法
こんにちは、先生、Google Chrome をモバイル版に変更するにはどうすればよいですか?
から 2024-04-23 00:22:19
0
11
2214
親ウィンドウには出力がありません
document.onclick = function(){ window.opener.document.write('私は子ウィンドウの出力です');
から 2024-04-18 23:52:34
0
1
1753
関連トピック
詳細>
|