目次
Yaf_Caller
ホームページ バックエンド開発 PHPチュートリアル yaf に基づくモジュール型開発ソリューション

yaf に基づくモジュール型開発ソリューション

Jun 23, 2016 pm 01:16 PM

ウェブサイトのトラフィックが増加し、ユーザーが増え、ニーズがますます複雑になるにつれて、製品開発期間中、ワンストップ開発ではビジネス開発のニーズをサポートできなくなります。技術的なアーキテクチャがビジネスの発展を制限しており、研究開発担当者にとっては耐えられない問題が増えています。ビジネス。

まず次のワンストップ開発が直面するであろう問題をまとめてみましょう:

1. コードの量が多く、開発、デプロイ、テストのすべてが問題になります

これは理解しやすいです、私たちのビジネス開発・導入・テストには大きなリスクが伴うことがあります。例えば、開発においては、プロジェクトに最初から参加しているメンバーであっても、事業規模が大きくなるとリスクのコントロールが困難になることがあります。大量のデプロイメントなど、ボリュームが大きいため、コードのリリースが非常に遅くなります。リリース プラットフォームでは、まずコードをパッケージ化して、オンライン サーバー上で解凍します。オンラインで問題が発生すると、ロールバックのコストが高くなり、その影響も大きくなります。リリース システムが深刻になるだけでなく、サービスの利用不能にもつながります。

2. ビジネス開発を大幅に制限する

開発者は、開発プロセス中に習慣的にパブリック関数をクラスまたはメソッドにカプセル化する傾向があり、これがコア関数である場合、システム全体に現れる可能性があります。機能の発達が必要であり、それは全身に影響を及ぼし、システムの再構築に直面する可能性があります。

非常に簡単な例を見てみましょう。

関数 (またはクラス) があるとします。

function custom_function($a,$b) {//TODO}
ログイン後にコピー

は、最初は現在のビジネスに合わせて基本的な機能を実装しますが、ビジネスが発展するにつれて、この基本的な機能はより強力になります。ビジネスをサポートするために、次のようなパラメータに応じて機能拡張の互換性を持たせています。後で?もちろん、私たちには聞こえませんが、それは将来の世代を非常に不幸にします。

3. 打倒と再構築を強いられる

さまざまなプレッシャーに基づいて、さらに重要なことに、事業開発のプレッシャーに基づいて、私たちはシステム全体を苦痛を伴う再構築するしかありませんでした。このプロセスは一方では長くて苦痛です。一方で、既存のシステム ビジネスをサポートしなければならない一方で、システム全体を技術的に再構築してそれらの結合を弱める必要があり、このコストとリスクが私たちを悲惨なものにします。

それでは、プロジェクトの開始時にビジネスを複数のモジュールに分割することを検討すべきでしょうか?答えは「はい」です。しかし、それはいくつかの問題ももたらします:

1. PM はテクノロジーを理解しておらず、それを分割する方法を知りません

この問題は、計画とプロジェクトのレビュー中にテクノロジーと話し合って、ビジネスに集中することで簡単に解決できます。機能を分割する。たとえば、ユーザー関連のすべての操作はユーザー モジュールに分類され、バックグラウンド関連の操作はビュー モジュールに分類されます

2. 制御の粒度が低いとコストが増加します。

これはテクノロジーに依存します 社内で十分にコミュニケーションして計画し、境界を制御します

3. データ共有?

複数のモジュールに分割されていますが、データはシステム全体に分散しています モジュール間でデータを共有するにはどうすればよいですか?

プロジェクトの初期段階での解決策は、

- 最も基本的なデータをライブラリ モジュールに分離し、モジュール全体で呼び出すことができる最も詳細なデータ共有単位を提供します。

- ビジネス インターフェイスを提供します。クロスモジュール呼び出しの場合、たとえばモジュール A の下で、フレームワークがモジュール B の下のインターフェイスの呼び出しをサポートするようにします。

- http サービス インターフェイスを提供します。これは主にプロジェクトが成熟したときに行われます。

方向性フレームワーク内にあり、次のような特徴があります:

1. コード量が少なく、合理化されている

2. モジュール間で呼び出すことができ、モジュールにはフレームワーク実装をほとんど含める必要がありません

3.基本ライブラリ モジュール

4. 管理構成

現在のすべての PHP フレームワークでは、モジュール化されたプログラミングを実現することは依然として困難です。 フレームワークの実装には、フレームワーク内に独自のアプリケーションまたはモジュールが含まれています。

一種の完全なモジュール化もあり、各モジュール ビジネスには次のような一連のフレームワーク実装があります。ただし、一方では、これの欠点は明らかです。一方、フレームワークのメンテナンスとコード量により、モジュールがより重く見えます。

つまり、最初の方法がより採用されています。今日のテーマ yaf は実際にはそのようなアーキテクチャですが、フレームワーク ロジックは so 拡張機能で実装されています

しかし、今日説明することは、この 2 つのソリューションに基づいています。モジュールを完全に独立させるだけでなく、モジュール間でインターフェイスを呼び出すこともできます。また、基本的にモジュール内でフレームワーク コードを維持する必要はありません。フレームワークの仕様に従ってコードを記述するだけです。

每个模块之间提供interface,供其他模块直接调用,每个模块只处理自己的业务,当有业务需要共享时直接按照规范写interface就可以了。

项目目录如下:

但是yaf不支持跨模块的调用,模块与模块之间是不能通过interface来通信的,为了解决这个问题,我增加了两个类Yaf_Init和Yaf_Caller

Yaf_Init

$app = Yaf_Init::init();$app->Bootstrap()->run();
ログイン後にコピー

这个只是一层封装,根据目录解析出当前模块名,省去配置config.ini的烦恼,为了灵活性,Yaf_init::init()后面将增加参数可以灵活自定义配置,每一个webroot/module/index.php中都是上面的代码。

等同于下面

$config = array('application'=> array('directory' => app目录))$application = new Yaf_Application($config);$application->Bootstrap()->run();
ログイン後にコピー

为了能够找到app的目录,还需要在php.ini中增加一个配置,

yaf.app_path = /home/admin/web/htdocs/app/

如果访问/home/admin/web/webserver/webroot/module/index.php时,

会解析出module拼成app目录:

/home/admin/web/htdocs/app/module/传给$config.application.directory,

将$config 配置传递给yaf_application的构造函数进行初始化

Yaf_Caller

$Object = new Yaf_Caller('moduleName','className');$Object->test();
ログイン後にコピー

这个类用来实例化其他模块中interface的类库,其实它也是一层简单的包装,保存环境变量,切换到某模块,然后调用Yaf_loader::autoload(),该构造函数接收两个参数,第一个是模块名,第二个是interface的类名,

interface的命名规范:

/app/htdocs/moduleA/Interface/Admin.php

比如模块A提供了一个interface,类名是admin

则Admin.php的类写法

class Interface_Admin{   function test(){        //TODO   }}
ログイン後にコピー

其他模块调用时

//object返回的是Interface_Admin类$object = new Yaf_Caller('moduleA','Admin');它直接可以调用Interface_Admin下的public方法。$object->test();
ログイン後にコピー

这套方案有以下优点:

- 模块代码量小,只需要实现业务代码就可以

- 模块之间可以无缝调用inteface接口

未完待续……

原文出处:

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 Apr 05, 2025 am 12:04 AM

JWTは、JSONに基づくオープン標準であり、主にアイデンティティ認証と情報交換のために、当事者間で情報を安全に送信するために使用されます。 1。JWTは、ヘッダー、ペイロード、署名の3つの部分で構成されています。 2。JWTの実用的な原則には、JWTの生成、JWTの検証、ペイロードの解析という3つのステップが含まれます。 3. PHPでの認証にJWTを使用する場合、JWTを生成および検証でき、ユーザーの役割と許可情報を高度な使用に含めることができます。 4.一般的なエラーには、署名検証障害、トークンの有効期限、およびペイロードが大きくなります。デバッグスキルには、デバッグツールの使用とロギングが含まれます。 5.パフォーマンスの最適化とベストプラクティスには、適切な署名アルゴリズムの使用、有効期間を合理的に設定することが含まれます。

セッションのハイジャックはどのように機能し、どのようにPHPでそれを軽減できますか? セッションのハイジャックはどのように機能し、どのようにPHPでそれを軽減できますか? Apr 06, 2025 am 12:02 AM

セッションハイジャックは、次の手順で達成できます。1。セッションIDを取得します。2。セッションIDを使用します。3。セッションをアクティブに保ちます。 PHPでのセッションハイジャックを防ぐための方法には次のものが含まれます。1。セッション_regenerate_id()関数を使用して、セッションIDを再生します。2。データベースを介してストアセッションデータを3。

確固たる原則と、それらがPHP開発にどのように適用されるかを説明してください。 確固たる原則と、それらがPHP開発にどのように適用されるかを説明してください。 Apr 03, 2025 am 12:04 AM

PHP開発における固体原理の適用には、次のものが含まれます。1。単一責任原則(SRP):各クラスは1つの機能のみを担当します。 2。オープンおよびクローズ原理(OCP):変更は、変更ではなく拡張によって達成されます。 3。Lischの代替原則(LSP):サブクラスは、プログラムの精度に影響を与えることなく、基本クラスを置き換えることができます。 4。インターフェイス分離原理(ISP):依存関係や未使用の方法を避けるために、細粒インターフェイスを使用します。 5。依存関係の反転原理(DIP):高レベルのモジュールと低レベルのモジュールは抽象化に依存し、依存関係噴射を通じて実装されます。

phpstormでCLIモードをデバッグする方法は? phpstormでCLIモードをデバッグする方法は? Apr 01, 2025 pm 02:57 PM

phpstormでCLIモードをデバッグする方法は? PHPStormで開発するときは、PHPをコマンドラインインターフェイス(CLI)モードでデバッグする必要がある場合があります。

システムの再起動後にUnixSocketの権限を自動的に設定する方法は? システムの再起動後にUnixSocketの権限を自動的に設定する方法は? Mar 31, 2025 pm 11:54 PM

システムが再起動した後、UnixSocketの権限を自動的に設定する方法。システムが再起動するたびに、UnixSocketの許可を変更するために次のコマンドを実行する必要があります:sudo ...

PHPでの後期静的結合を説明します(静的::)。 PHPでの後期静的結合を説明します(静的::)。 Apr 03, 2025 am 12:04 AM

静的結合(静的::) PHPで後期静的結合(LSB)を実装し、クラスを定義するのではなく、静的コンテキストで呼び出しクラスを参照できるようにします。 1)解析プロセスは実行時に実行されます。2)継承関係のコールクラスを検索します。3)パフォーマンスオーバーヘッドをもたらす可能性があります。

PHPのCurlライブラリを使用してJSONデータを含むPOSTリクエストを送信する方法は? PHPのCurlライブラリを使用してJSONデータを含むPOSTリクエストを送信する方法は? Apr 01, 2025 pm 03:12 PM

PHP開発でPHPのCurlライブラリを使用してJSONデータを送信すると、外部APIと対話する必要があることがよくあります。一般的な方法の1つは、Curlライブラリを使用して投稿を送信することです。

See all articles