Rumah  >  Artikel  >  rangka kerja php  >  Apakah corak reka bentuk yang digunakan oleh laravel?

Apakah corak reka bentuk yang digunakan oleh laravel?

青灯夜游
青灯夜游asal
2021-09-17 12:26:165992semak imbas

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.

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. . .

1: Corak kilang

Contohnya:

Auth::user()

Di sini

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/appaliases

Faedah:

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. mysqliPDOPelaksanaan: Isytiharkan badan kaedah bersatu dalam kelas antara muka, dan kemudian biarkan kelas berbeza melaksanakan antara muka ini dan menulis semula kaedah abstraknya.

Kemudian gunakan fungsi alat yang berbeza untuk melaksanakan antara muka yang sama.
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 strategi

UserStrategy.php2 ,

), melaksanakan antara muka strategi dan mengatasi kaedah strategi

FemaleUserStrategy.phpMaleUserStrategy.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

EventKelas mendengar

<?php

namespace App\Events;

abstract class Event
{
    //逻辑代码
}

EventListenerFaedah:

<?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=&#39;color:red&#39;>"

                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 = &#39;request&#39;) {

                 $this->datas = $datas;

        }

        function beforeAction() {

                  echo "<div style=&#39;color:{$this->datas};&#39;>";

        }

        function afterAction() {

                  echo "</div>";

        }

}

$Object = new \SomeClass();

$Object->addDecorator(new \OneDecorator(&#39;blue&#39;));

//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][&#39;id&#39;];

                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::(&#39;slave&#39;);
                query

        }

        function set() {
                //DB::(&#39;master&#39;);
                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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel sebelumnya:Adakah laravel mvc?Artikel seterusnya:Adakah laravel mvc?