ホームページ >PHPフレームワーク >Laravel >laravelはどのようなデザインパターンを使用していますか?
laravel で使用されるデザイン パターン: ファクトリ モード、シングルトン モード、登録ツリー モード、アダプター モード、ストラテジー モード、データ オブジェクト マッピング モード、オブザーバー モード、プロトタイプ モード、デコレーター モード、イテレーター モード、エージェント モードなど。
このチュートリアルの動作環境:Windows 7 System、Laravel 6バージョン、Dell G3コンピューター。
この記事では、Laravel でよく使用されるデザイン パターンをいくつか紹介します。 。 。
1: ファクトリーモード
例: Auth::user()
ここAuth
このクラスはファクトリ内のメソッドであり、Auth
は登録ツリー内のエイリアスです。
利点:
関数のカプセル化と同様に、オブジェクトが統合された生成 (インスタンス化) エントリを持つことができます。オブジェクトに対応するクラスのクラス名が変更された場合、ファクトリ クラスのインスタンス化メソッドを変更するだけで済みます。
2: シングルトン パターン
利点:
オブジェクトは外部でインスタンス化できません。リソースを節約するために一度インスタンス化できます。
実装方法:
private static $ins = null; //设置私有的属性 private function __construct() {} //使外部无法new这个类 public static function getIns() { //暴露给外部的调用方法 if(self::$ins instanceof self) { return self::$ins; } else { self::$ins = new self(); return self::$ins; } }
クラスのプライベートまたは保護された静的変数を宣言し、コンストラクターをプライベートとして宣言し (外部の新しい操作は許可されません)、存在しない場合はインスタンス化します。存在する場合は、Return します。存在する場合は、直接戻ります。
3: 登録ツリー モード
使用:
config/app
#エイリアス## の配列は登録ツリーです
利点:
登録ツリー モードでは、配列構造を使用してオブジェクトとファクトリにアクセスします。このメソッドは一度呼び出すだけで済みます(システム環境の初期化などの場所に置くことができます) 今後オブジェクトを呼び出す必要がある場合は、登録ツリーから直接取り出すことができます。ファクトリ メソッドまたはシングルトン モードを呼び出します。実装方法:
class Register { protected static $objects function set($alias,$object) { //将对象映射到全局树上 self::$objects[$alias]=$object; } static function get($name) { //获取对象 return self::$objects[$name]; } function _unset($alias) { //从全局树移除对象 unset(self::$onjects[$alias]); } }
$alias はエイリアスを表し、自分で設定します
をファクトリーに追加しますmode
Register::set('db1',$db);
Register::$objects['db1'];
4: アダプター モード
さまざまなツールのさまざまな関数インターフェイスをカプセル化します。簡単に呼び出せる統合 API。例:mysql、
mysqli、
PDO。
interface Database { function connect($host,$user,$password,$dbname); function query($sql); function close(); }次に、異なるツール関数を使用して同じインターフェイスを実装します。
5: 戦略パターン
利点:特定の動作とアルゴリズムのセットをクラスにカプセル化して、特定の特定の動作に適応させます。コンテキストは、論理的な判断を特定の実装から分離し、ハードコーディングから切り離しを実現し、IOC、依存関係の反転、および反転制御を可能にします。 実装:1. ストラテジー インターフェイス ファイル (UserStrategy.php) を定義し、ストラテジー インターフェースを定義して、ストラテジーを宣言します
FemaleUserStrategy.php、
MaleUserStrategy.php) を定義し、戦略インターフェイスを実装して、戦略メソッド
class Page { protected $strategy; function index() { if($request->get('female')) { $strategy=new FemaleUserStrategy(); } else { $strategy=new MaleUserStrategy(); } $this->strategy->method(); } public function __construct(UserStrategy $strategy) { $this->strategy=$strategy; } }
6 をオーバーライドします。 : データ オブジェクト マッピング モード##利点: オブジェクトとデータ ストレージをマッピングすると、オブジェクトに対する操作がデータ ストレージに対する操作にマッピングされます。これは、ORM の実装メカニズムでもあります。
class Model { public $id; public $name; public $email; …… function __construct($id) { //构造函数,调用class时自动执行,用来初始化。 //查询逻辑 } function __destruct() { //析构函数,当class调用完成后自动执行,用它来销毁实例,释放资源。 //增删改逻辑 } }
7: オブザーバー パターン使用:
トリガー クラス
Event <pre class="brush:js;toolbar:false;"><?php
namespace App\Events;
abstract class Event
{
//逻辑代码
}</pre>
Listening クラス
<pre class="brush:php;toolbar:false;"><?php
namespace App\Listeners;
use App\Events\SomeEvent;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
class EventListener
{
/**
* Create the event listener.
*
* @return void
*/
public function __construct()
{
//
}
/**
* Handle the event.
*
* @param SomeEvent $event
* @return void
*/
public function handle(SomeEvent $event)
{
//
}
}</pre>
利点:
オブジェクトのステータスが変化すると、それに依存するすべてのオブジェクトが通知を受け取り、自動的に更新され、Low が実装されます。結合、非侵入的な通知および更新メカニズム。
8: プロトタイプ パターン # はファクトリ パターンに似ており、オブジェクトの作成に使用されます。違いは、プロトタイプ パターンが最初にあることです。プロトタイプ オブジェクトを作成します。その後、プロトタイプ オブジェクトのクローンを作成して新しいオブジェクトを作成します。プロトタイプ モードは、大きなオブジェクトの作成に適しており、メモリのコピーのみが必要です。
$Object = new Object(); $object_1 = clone $Object; $object_2 = clone $Object;
9: デコレータ パターンクラスの機能を変更または追加するには、従来の方法は、それを継承するサブクラスを作成することです。 、クラスメソッドを再実装します。デコレータ パターンでは、実行時にデコレータ オブジェクトを追加するだけで、クラスの機能を動的に追加または変更できます。
従来の方法:
class Method2 extends Method { function doSomething() { echo "<div style='color:red'>" parent::doSomething(); echo "</div>"; } } interfa Decorator { //定义装饰器接口 function beforeAction(); function afterAction(); //more decoratorMethod…… } class SomeClass { protected $decorators = []; function addDecorator(Decorator $decorator) { $this->decorators[] = $decorator; } function beforeMethod() { foreach ($this->decorators as $row) { $row->beforeAction(); } } function afterMethod() { $decorators = array_reverse($this->decorators); //做一个反转 foreach ($this->decorators as $row) { $row->afterAction(); } } function action() { $this->beforeMethod(); //method; $this->afterMethod(); } } class OneDecorator implements Decorator { protected $datas; function __construct($datas = 'request') { $this->datas = $datas; } function beforeAction() { echo "<div style='color:{$this->datas};'>"; } function afterAction() { echo "</div>"; } } $Object = new \SomeClass(); $Object->addDecorator(new \OneDecorator('blue')); //Add other decorator... $Object->action();
10:迭代器模式
在不需要了解内部实现的前提下,遍历一个聚合对象的内部元素,相对于传统编程方式它可以遍历元素所需的操作。
例如:
Object::all() Iterator extends Traversable { //PHP内置迭代器接口 /* 方法 */ abstract public mixed current (void) abstract public scalar key (void) abstract public void next (void) abstract public void rewind (void) abstract public boolean valid (void) } class ObjectAll implements \Iterator { protected $ids; //所有对象的id protected $index; //迭代器的当前位置 protected $data = array(); //保存从数据库取到的所有对象 function __construct() { //取出所有的id,$ids } function current() { //获取当前的元素的数据,第三个调用 $id = $this->ids[$this->index]['id']; return Object::find($id); } function next() { //获取下一个元素,第四个调用 $this->index ++; } function valid() { //验证当前元素是否还有下一个元素(查询当前是否有数据),第二个调用 return $this->index < count($this->$ids); } function rewind() { //当迭代器执行到末尾时,重置迭代器到整个集合的开头,最先调用 $this->index = 0; } function key() { //获取当前的索引,最后调用 return $this->index; } } $objects = new \ObjectAll(); foreach ($objects as $row) { dump($row->field); //增删改查操作 }
11:代理模式
在客户端与实体之间建立一个代理对象,客户端对实体进行操作全部委派给代理对象,隐藏实体的具体实现细节(slave
读库与master
写库分离)。代理对象还可以与业务代码分离,部署到另外的服务器,业务代码中通过PRC
来委派任务。
interface DBproxy { function getInfo($id); function setInfo($id, $value); } class Proxy implements DBproxy { function get() { //DB::('slave'); query } function set() { //DB::('master'); query } } $proxy = new Proxy(); $proxy->get($id); $proxy->set($id, $value);
相关推荐:最新的五个Laravel视频教程
以上がlaravelはどのようなデザインパターンを使用していますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。