精华内容
下载资源
问答
  • Laravel框架设计模式的使用

    千次阅读 2019-01-13 19:46:50
    1:工厂模式 例如:Auth::user() 此处Auth这个类就是工厂中的方法,Auth是注册树中的别名。 好处: 类似于函数的封装,使对象有一个统一的生成(实例化)入口。当我们对象所对应的类的类名发生变化的时候,我们...

    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;
    
            }
    
    }
    

    声明一个类的私有或者保护的静态变量,构造方法声明为私有(不允许外部进行new操作),如果不存在则实例化它,然后返回,如果存在则直接返回。

    3:注册树模式

    使用:

    config/app里的aliases数组便是一个注册树

    好处:

    注册树模式就是使用数组结构来存取对象,工厂方法只需要调用一次(可以放到系统环境初始化这样的地方),以后需要调用该对象的时候直接从注册树上面取出来即可,不需要再调用工厂方法和单例模式。

    实现方法:

    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表示别名,自己设定

    在工厂模式中添加

    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),定义策略接口,声明策略

    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:数据对象映射模式

    好处:将对象和数据存储映射起来,对一个对象的操作会映射为对数据存储的操作,这也是ORM的实现机制。

    class Model {
    
            public $id;
    
            public $name;
    
            public $email;
    
            ……
    
            function __construct($id) {
    
                   //构造函数,调用class时自动执行,用来初始化。
    
                   //查询逻辑
    
            }
    
            function __destruct() {
    
                   //析构函数,当class调用完成后自动执行,用它来销毁实例,释放资源。
    
                   //增删改逻辑
    
            }
    
    }
    

    7:观察者模式

    使用:

    Event::fire(new /event);

    好处:

    当一个对象状态发生改变时,依赖它的对象全部会收到通知并自动更新,实现低耦合,非侵入式的通知与更新机制。

    (PS:有关abstract和interface:http://blog.csdn.net/sunlylorn/article/details/6124319)

    实现:

    EventGenerator.php                                            //事件产生者
    
    abstract class EventGenerator{
    
             private $obserers = array();                        //观察者对事件发生者不可见
    
             function addObsever(Observer $observer) {
    
                     $this->obserers[] = $observer;
    
            }
    
            function ontify() {                                        //逐个调用观察者的handle方法
    
                     foreach ($this->obserers as $observer){
    
                             $observer->handle();
    
                     }
    
            }
    
    }
    
    event.php                                                           //事件类
    
    class Event extends EventGenerator{
    
            function trigger(){
    
                    $this->ontify();
    
            }
    
    }
    
    Observer.php                                                             //观察者接口
    
    interface Observer {
    
            function update($event_info = null);                    //更新操作,可接受事件信息参数
    
    }
    
    Observer1.php                                                           //EventListener
    
    class Observer1 implements Observer {
    
            function handle($event_info = null){
    
                    echo "逻辑1";
    
            }
    
    }
    
    index.php                                                                   //Controller中function
    
    $event = new \Event();
    
    $event->addObsever(new \Observer1());
    
    $event->trigger();
    

    8:原型模式

    与工厂模式类似,用于创建对象,不同在于:原型模式是先创建好一个原型对象,再通过clone原型对象来创建新的对象,原型模式适用于大对象的创建,仅需要内存拷贝即可。

    $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);
    

    12:MVC结构(非设计模式,而是一种工程组织结构)

    1:model——数据和存储的封装

    2:view——展现层的封装

    3:controller——逻辑层(业务代码,功能)的封装

    展开全文
  • 工厂模式 例如:Auth::user() 此处Auth这个类就是工厂中的方法,Auth是注册树中的别名。 好处: 类似于函数的封装,使对象有一个统一的生成(实例化)入口。当我们对象所对应的类的类名发生变化的时候,我们只...

    工厂模式

    例如:Auth::user()

    此处Auth这个类就是工厂中的方法,Auth是注册树中的别名。

    好处:

    类似于函数的封装,使对象有一个统一的生成(实例化)入口。当我们对象所对应的类的类名发生变化的时候,我们只需要改一下工厂类类里面的实例化方法即可。

    单例模式

    好处:

    对象不可外部实例化并且只能实例化一次,节省资源。

    实现方式

    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;
    
            }
    
    }
    

    声明一个类的私有或者保护的静态变量,构造方法声明为私有(不允许外部进行new操作),如果不存在则实例化它,然后返回,如果存在则直接返回。

    3:注册树模式

    使用:

    config/app里的aliases数组便是一个注册树

    好处:

    注册树模式就是使用数组结构来存取对象,工厂方法只需要调用一次(可以放到系统环境初始化这样的地方),以后需要调用该对象的时候直接从注册树上面取出来即可,不需要再调用工厂方法和单例模式。
     

    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]);
    
            }
    
    }
    

    观察者模式

     

    展开全文
  • mark 转载于:https://www.cnblogs.com/easma/p/6956038.html

    mark

    转载于:https://www.cnblogs.com/easma/p/6956038.html

    展开全文
  • 使用过arave框架的朋友都知道...首先应该了解laravel框架的架构模式设计核心,laravel 框架是使用服务组件化的开发模式开发的,laravel框架就是由不同的服务组件构成的)laravel 里面多个服务提供者构成了la...

    010b4541915afc2847d5660e84d561b1.png

    使用过arave框架的朋友都知道laravel框架里面除了提供一些基本的功能(如控制器、视图、模型)之外,还有中间件、门面、契约等,这些东西是如何在laravel框架运用起来的呢?今天就和大家详聊一下。

    首先应该了解laravel框架的架构模式(设计核心,laravel 框架是使用服务组件化的开发模式开发的,laravel框架就是由不同的服务组件构成的)

    laravel 里面多个服务提供者构成了laravel组件。分层设计:把相同功能的类库放在同一个文件夹里面。
    laravel框架有多个类组成服务,由多个服务组成组件。类 -> 服务 -> 组件
    laravel使用组件化的开发模式,多个类 -> 服务 -> 组件,多个类组成服务,多个服务构成组件。
    多个组件提供不同的服务,然后多个服务构成我们的项目。

    请求生命周期
    大概的流程如图:

    5984b22a665db5d64c23bcb13a1e5b9e.png

    理论上,生命周期主要有这么些阶段,但其中,开发者大多数只需关注路由、中间件、控制器、闭包函数、逻辑处理等几步
    当然,每一步的内部,还是会有更多细化的执行流程,在这里,一般不深入研究框架或改造框架,很少会细化研究,但研究底层,依旧是学习的好选择。

    服务
    说的就是提供给你所需要的东西,在laravel里面所提供的服务有 认证服务、数据库服务、缓存服务、队列服务等等。laravel框架所有服务都定义在了app/config/app.php 里面

    服务提供者
    可以给你提供一组服务的东西就是服务提供者,laravel里面如上所示其实定义的服务器提供者,比如IlluminateAuthAuthServiceProvider::class,提供认证服务的服务提供者。IlluminateCacheCacheServiceProvider::class,提供缓存服务的服务提供者

    好处:开发者可以节省下更多的精力去处理项目逻辑,且不同开发个体之间能达到一定默契,最重要的是,项目达到分层解耦,业务逻辑只依赖于服务,并不依赖于服务底层的实现。
    解耦之后,我们可以任意升级或自定义服务的底层实现,只要确保底层类实现了该服务

    总结:其实服务是一个抽象的概念,服务器提供者是完成这个抽象概念的具体实施者

    服务容器
    把所有的服务放在一个盒子里,存放服务的容器。laravel里面的服务容器位于 vendor/laravel/frameworksrcilluminateContainerContainer.php.
    Container.php 就是laravel框架的服务容器。

    契约
    用来规划服务提供者的格式、方法、参数等,给服务提供者规范了一定约束。所以在框架里面所有的契约都是接口,这样才能规范服务提供者。

    门面
    门面再一次展示了Laravel在设计上的优秀,它让Laravel变得更加灵活易扩展,那么它的概念是:
    1 为开发者提供服务容器中服务的静态代理
    2 它对服务访问方式做了补充,之前使用服务必须获取服务的实例,再调用服务的方法,但使用facade,就可以直接把服务当静态对象来调用了。
    3 config/app.php中服务别名alias大多数都使用了facade
    4 使用facade是有风险的,并不是用的越多越好,这在手册上有少量的介绍,但具体的,还是需要开发中去发现

    laravel框架总体架构图

    42d9d406002bbcac3008139b9ad2ce7f.png


    如上图所示:laravel框架是由多个服务组件构成的 -> 服务提供者(最下面的不同的服务组件)。
    Foundation 的 Application 用来创建服务提供者,创建好之后保存在Container 的 Container 的服务容器里面,交由他管理,Application 要继承 Container。
    为了约定服务提供者提供的服务,我们定义一个规范,这就是契约

    对于我们的用户(最上面的用户)想使用laravel框架,必须通过控制器来使用(上面的Controller),使用laravel框架主要是使用laravel里面的服务提供者(上面的 new 服务),这样就是最传统的开发模式,和服务器容器没有直接关系,如果laravel这样设计的话,基本上和其他框架一样,没有任何优势。所以一般不怎么做。

    由于有契约,契约是服提供者的接口,所以我们也可以直接使用契约,new 服务旁边的黄色线。使用契约用注入的方式,这样使用的不好之处是如果一个方法里面使用多个契约的话,我们就得注入多个契约,这样代码看起来不优雅。

    于是laravel里面就出现了门面,门面的出现方便我们优雅的调用服务器提供者的类。由于每个服务提供者的类太长了如:
    IlluminateCookieCookieServiceProvider::class,
    IlluminateDatabaseDatabaseServiceProvider::class,
    所以又引出了别名,使用别名之后 简化了我们调用的服务提供者的类。

    事件:laravel里面的模型里面的事件,比如用户对数据库操作时做的一个监听。对整个项目运行进行监听,有监听的动作。类似tp5里面的钩子和行为。

    中间件:做用户的请求做一定的过滤。

    展开全文
  • laravel 管道设计模式

    2017-04-27 16:47:00
     所谓管道(Pipeline)设计模式,就是把数据传递给一个任务队列,由任务队列按次序依次对数据进行加工处理。在laravel框架中,这里的数据就是http请求,任务队列包含了一个又一个的中间件。  类比1:以流水线或...
  • Laravel模块化入门工具包是laravel框架入门工具包,用于模块化设计模式,优雅的语法。 Laravel入门套件是根据的开源软件。 要求 PHP 7.4或更高版本 如何使用 制作模块 php artisan module:make Inventory 在模块内...
  • 2.2 Laravel框架中的设计模式  当你没有学一门更好的编程语言之前,你一直以为自己所用的是最好的。  服务容器:可以将服务理解为系统运行中需要的东西,如对象、文件路径、系统配置等,服务容器就是这些东西的...
  • 使用过Larave框架的朋友都知道...首先应该了解laravel框架的架构模式设计核心,laravel 框架是使用服务组件化的开发模式开发的,laravel框架就是由不同的服务组件构成的)laravel 里面多个服务提供者构成了la...
  • 第5章到第14章分别从某个方面介绍Laravel框架是如何构建和使用的,包括程序的生命周期、服务容器和数据库等,同时也将其中的一些构建技术剥离开,使读者可以学习该框架的构建技术和思想,如设计模式的内容;...
  • laravel框架整体架构

    千次阅读 2019-01-12 23:24:49
    首先应该了解laravel框架的架构模式设计核心,laravel 框架是使用服务组件化的开发模式开发的,就像钢铁侠一样,钢铁侠每个部位就是一个组件,laravel框架就是由不同的服务组件构成的。 la...
  • 第5章到第14章分别从某个方面介绍Laravel框架是如何构建和使用的,包括程序的生命周期、服务容器和数据库等,同时也将其中的一些构建技术剥离开,使读者可以学习该框架的构建技术和思想,如设计模式的内容;...
  • 更多文章访问小编的技术博客:goofyy技术宅小编技术博客网址: http://www.goofyy.com前几天小编写了一篇MVC框架简述,大概笼统的说了一下,这次小编结合着Laravel框架给大家具体演示。开发坏境:Laravel版本: 5.0.22...
  • 第5章到第14章分别从某个方面介绍Laravel框架是如何构建和使用的,包括程序的生命周期、服务容器和数据库等,同时也将其中的一些构建技术剥离开,使读者可以学习该框架的构建技术和思想,如设计模式的内容;...
  • 第5章到第14章分别从某个方面介绍Laravel框架是如何构建和使用的,包括程序的生命周期、服务容器和数据库等,同时也将其中的一些构建技术剥离开,使读者可以学习该框架的构建技术和思想,如设计模式的内容;...
  • 使用过larave框架的朋友都知道laravel...首先应该了解laravel框架的架构模式(设计核心,laravel 框架是使用服务组件化的开发模式开发的,laravel框架就是由不同的服务组件构成的)laravel 里面多个服务提供者构成了la...
  • 该软件包是一种称为的著名设计模式的实现。 但是,为了简化和优化SQL SELECT查询,它使用邻接表来查询直接的父/子关系。 内容: 示例→ 示例→ 示例→ 范例→ 范例→ 例子→ 示例→ 示例→ 安装 强烈建议使用安装...
  • 在 Gof 总结的 24 种设计模式中,用来分离类的创建与调用的工厂模式和单例模式的应用非常广泛 ,今天我们就来看一下这些模式在 Laravel 框架的 ORM 搜索结果缓存功能中的应用。 ORM 模式介绍 在使用 Laravel ...
  • 非常适合应用各种开发模式,作为一个框架,它为你准备好了一切,composer是php的未来,没有composer,php肯定要走向没落 laravel框架最大的特点和优秀之处就是集合了php比较新的特点,以及各种各样的设计模式,Ioc模式,依赖...
  • PHP书籍包括PHP设计模式.pdf、PHP应用程序安全编程.pdf、Laravel框架关键技术解析.pdf。
  • 1.1、IoC是什么 Ioc—Inversionof Control,即“控制反转”,不是什么技术,而是一种设计思想。在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。如何理解好Ioc呢?理解...
  • 第5章到第14章分别从某个方面介绍Laravel框架是如何构建和使用的,包括程序的生命周期、服务容器和数据库等,同时也将其中的一些构建技术剥离开,使读者可以学习该框架的构建技术和思想,如设计模式的内容;...
  • 基于PHP+MySQL 的Laravel 框架技术,分析电子商务新模式威客系统平台认知的要求和流程,设计电商威客平台的 功能模块以及数据库,应用PHP 编程实现B/S 架构的电商威客平台系统
  • Laravel框架的中间件使用:从请求进来到响应返回,经过中间件的层层包装,这种场景很适合用到一种设计模式---装饰器模式。  装饰器模式的作用,多种外界因素改变对象的行为。使用继承的方式改变行为不太被建议。 ...
  • 0. laravel框架中 服务容器是整个系统功能调度配置的核心,在系统运行过程中动态的为系统提供需要的服务 从而实现了解耦 0. 服务提供者是所有 Laravel 应用程序引导启动的中心, Laravel 的核心服务器、注册服务容器...
  • 学习过Spring框架的人一定都会听过Spring的IoC(控制反转) 、DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC 、DI这两个概念是模糊不清的,是很难理解的,今天和大家分享网上的一些技术大牛们对Spring...

空空如也

空空如也

1 2 3 4 5 ... 12
收藏数 232
精华内容 92
关键字:

laravel框架设计模式