Rumah > Artikel > rangka kerja php > Apakah corak reka bentuk yang digunakan oleh laravel?
Persekitaran pengendalian tutorial ini: sistem Windows7, versi Laravel6, komputer Dell G3. Artikel ini memperkenalkan anda kepada beberapa corak reka bentuk yang biasa digunakan dalam Laravel yang telah anda gunakan, tetapi anda mungkin tidak mengetahuinya. . .Corak reka bentuk yang digunakan oleh laravel: mod kilang, mod tunggal, mod pokok pendaftaran, mod penyesuai, mod strategi, mod pemetaan objek data, mod pemerhati, mod prototaip, mod penghias, mod lelaran, mod Ejen, dsb.
1: Corak kilang
Contohnya:Auth::user()
Kelas ini di kilang kaedah, Auth
ialah alias dalam pepohon pendaftaran. Auth
Faedah:
Sama seperti enkapsulasi fungsi, objek mempunyai entri generasi bersatu (instantiation). Apabila nama kelas kelas yang sepadan dengan objek kita berubah, kita hanya perlu menukar kaedah instantiasi dalam kelas kilang.2: Corak Singleton
Faedah:
Objek tidak boleh dibuat seketika secara luaran dan hanya Boleh digunakan sekali untuk menjimatkan sumber. Kaedah pelaksanaan: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; } }Isytihar pembolehubah statik peribadi atau dilindungi kelas, isytiharkan pembina sebagai persendirian (operasi baharu luaran tidak dibenarkan), dan nyatakannya jika ia tidak exist , dan kemudian kembali, jika wujud, kembali terus.
3: Mod pepohon pendaftaran
Gunakan:
di dalam >Suatu tatasusunan ialah pokok pendaftaranconfig/app
aliases
Mod pokok pendaftaran menggunakan struktur tatasusunan untuk mengakses objek, dan kaedah kilang hanya perlu dipanggil sekali (boleh diletakkan dalam sistem Permulaan Persekitaran (seperti permulaan persekitaran), apabila anda perlu memanggil objek pada masa hadapan, anda boleh terus mengeluarkannya dari pokok pendaftaran, dan tidak perlu memanggil kaedah kilang dan mod tunggal.
Kaedah pelaksanaan:
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]); } }mewakili alias, tetapkan sendiri
$alias
dan tambahkan
di kilang mod
Register::set(‘db1’,$db);
Sebarang panggilan tempat lain hanya perlu memanggil daftar untuk membaca
Register::$objects[‘db1’];
4: Mod penyesuai Ingkapsulkan antara muka fungsi yang berbeza bagi alatan yang berbeza ke dalam API bersatu untuk memudahkan panggilan. Seperti:
,, mysql
. mysqli
PDO
Pelaksanaan: Isytiharkan badan kaedah bersatu dalam kelas antara muka, dan kemudian biarkan kelas berbeza melaksanakan antara muka ini dan menulis semula kaedah abstraknya.
interface Database { function connect($host,$user,$password,$dbname); function query($sql); function close(); }
5: Corak strategi Faedah:
Merangkumkan set tingkah laku dan algoritma tertentu ke dalam kelas untuk menyesuaikan tertentu tertentu konteks memisahkan pertimbangan logik daripada pelaksanaan khusus, mencapai pengekodan keras kepada penyahgandingan, dan membolehkan IOC, penyongsangan kebergantungan dan kawalan penyongsangan.
Pelaksanaan:
1 Tentukan fail antara muka strategi (
), tentukan antara muka strategi, isytiharkan strategiUserStrategy.php
2 ,
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: Mod pemetaan objek data
Faedah : Gabungkan objek dan Storan data dipetakan, dan operasi pada objek dipetakan kepada operasi pada penyimpanan data Ini juga merupakan mekanisme pelaksanaan ORM.
class Model { public $id; public $name; public $email; …… function __construct($id) { //构造函数,调用class时自动执行,用来初始化。 //查询逻辑 } function __destruct() { //析构函数,当class调用完成后自动执行,用它来销毁实例,释放资源。 //增删改逻辑 } }7: Mod pemerhati
Gunakan:
Kelas pencetus Event
Kelas mendengar
<?php namespace App\Events; abstract class Event { //逻辑代码 }
EventListener
Faedah:
<?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) { // } }Apabila status objek berubah, semua objek yang bergantung padanya akan menerima pemberitahuan dan dikemas kini secara automatik, mencapai gandingan rendah , pemberitahuan tidak mengganggu dan mekanisme kemas kini. 8: Mod prototaip
Sama seperti mod kilang, ia digunakan untuk mencipta objek Perbezaannya ialah: mod prototaip mula-mula mencipta objek prototaip , dan kemudian cipta objek baharu dengan mengklonkan objek prototaip Mod prototaip sesuai untuk penciptaan objek besar dan hanya memerlukan penyalinan memori.
$Object = new Object(); $object_1 = clone $Object; $object_2 = clone $Object;9: Corak penghias
Untuk mengubah suai atau menambah kefungsian kelas, cara tradisional ialah menulis subkelas Inherit ia dan melaksanakan semula kaedah kelas. Corak penghias hanya perlu menambah objek penghias pada masa jalan untuk menambah atau mengubah suai fungsi kelas secara dinamik.
Kaedah tradisional: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视频教程
Atas ialah kandungan terperinci Apakah corak reka bentuk yang digunakan oleh laravel?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!