`
weiqingfei
  • 浏览: 315408 次
  • 性别: Icon_minigender_1
  • 来自: 黑洞
社区版块
存档分类
最新评论

Laravel中,一个Facade模式的调用例

    博客分类:
  • PHP
 
阅读更多

 

<?php

namespace Illuminate\Support\Facades;

/**
 * @see \Illuminate\Auth\AuthManager
 * @see \Illuminate\Auth\Guard
 */
class Auth extends Facade
{
    /**
     * Get the registered name of the component.
     *
     * @return string
     */
    protected static function getFacadeAccessor()
    {
        return 'auth';
    }
}

 [auth]的注册

 

 

<?php

namespace Illuminate\Auth;

use Illuminate\Support\ServiceProvider;

class AuthServiceProvider extends ServiceProvider
{

    protected function registerAuthenticator()
    {
        $this->app->singleton('auth', function ($app) {
            // Once the authentication service has actually been requested by the developer
            // we will set a variable in the application indicating such. This helps us
            // know that we need to set any queued cookies in the after event later.
            $app['auth.loaded'] = true;

            return new AuthManager($app);
        });

        $this->app->singleton('auth.driver', function ($app) {
            return $app['auth']->driver();
        });
    }

}

 由于不存在这个方法

Illuminate\Auth\AuthManager->guest() 

 所以调用父类的以下方法

 

 

<?php

namespace Illuminate\Support;

use Closure;
use InvalidArgumentException;

abstract class Manager
{
    public function __call($method, $parameters)
    {
        return call_user_func_array([$this->driver(), $method], $parameters);
    }
}

 $this->driver()也就是

 

 

    public function driver($driver = null)
    {
        $driver = $driver ?: $this->getDefaultDriver();

        // If the given driver has not been created before, we will create the instances
        // here and cache it so we can return it next time very quickly. If there is
        // already a driver created by this name, we'll just return that instance.
        if (!isset($this->drivers[$driver])) {
            $this->drivers[$driver] = $this->createDriver($driver);
        }

        return $this->drivers[$driver];
    }

 

 

$this->getDefaultDriver()也就是

 

<?php

namespace Illuminate\Auth;

use Illuminate\Support\Manager;

class AuthManager extends Manager
{
    public function getDefaultDriver()
    {
        return $this->app['config']['auth.driver'];
    }

}

 $this->app['config']['auth.driver'];其实就是config目录下,auth.php文件的driver设值

 

<?php

return [
'driver' => 'eloquent',

 那么上面的$this->createDriver($driver);就是

<?php

namespace Illuminate\Support;

use Closure;
use InvalidArgumentException;

abstract class Manager
{

     */
    protected function createDriver($driver)
    {
        $method = 'create'.ucfirst($driver).'Driver';

        // We'll check to see if a creator method exists for the given driver. If not we
        // will check for a custom driver creator, which allows developers to create
        // drivers using their own customized driver creator Closure to create it.
        if (isset($this->customCreators[$driver])) {
            return $this->callCustomCreator($driver);
        } elseif (method_exists($this, $method)) {
            return $this->$method();
        }

        throw new InvalidArgumentException("Driver [$driver] not supported.");
    }
}

 也就是

<?php

namespace Illuminate\Auth;

use Illuminate\Support\Manager;

class AuthManager extends Manager
{

    /**
     * Create an instance of the Eloquent driver.
     *
     * @return \Illuminate\Auth\Guard
     */
    public function createEloquentDriver()
    {
        $provider = $this->createEloquentProvider();

        return new Guard($provider, $this->app['session.store']);
    }

}

 所以auth最终就是Guard

 

 

分享到:
评论

相关推荐

    Laravel开发-symfonys-facade

    Laravel的Facade设计模式是其强大功能的一部分,它使得开发者可以简单地调用服务容器中的服务,而无需实例化对象。下面将详细介绍这个主题。 **1. Facade原理** Laravel的Facade实际上是一个静态代理,它在幕后通过...

    Laravel开发-facade-resolver

    当调用一个外观方法时,服务容器会根据预定义的绑定找到并实例化相应的类。服务容器通过解析类的构造函数来解决依赖注入,使代码更易于测试和扩展。 **3. 解析过程** - **外观名称到类名的映射**:每个外观类都有一...

    Laravel开发-laravel-onenet

    Laravel OneNet扩展可能提供一个Facade,允许开发者通过简单的静态调用来调用OneNet的API。 3. **Models**: 可能会定义一些Eloquent模型,对应于OneNet平台上的资源,如设备、数据点等,方便进行数据库操作。 4. *...

    Laravel开发-laravel-money

    在Laravel框架中,"laravel-money"是一个用于处理货币计算和格式化的库,尤其适合在电子商务或财务应用中使用。这个库提供了便利的方法来处理货币的加减、转换和格式化,使得开发者能更专注于业务逻辑,而不是基础的...

    一个简单的以redis为基础发布celery任务的laravel扩展包

    2. Facade:为方便调用Celery提供的功能,扩展包可能提供了一个Facade,类似于Laravel的`Queue`和`Cache`,使得调用命令更加简洁。 3. 配置文件:配置文件可能包含了连接Redis的参数,以及Celery的设置,如worker...

    Laravel开发-laravel-omnipay

    1. **服务提供者**:`laravel-omnipay` 提供了一个 Laravel 服务提供者,可以自动注册 Omnipay 到 Laravel 的服务容器中,简化配置过程。 2. **中间件**:通过 Laravel 的中间件,可以轻松地对支付请求进行处理和...

    Laravel开发-hellosign-laravel

    `Laravel-hellosign-laravel` 是一个专门为 Laravel 设计的 HelloSign SDK,方便开发者在 Laravel 应用中轻松实现与 HelloSign 的集成。 Laravel 是一个基于 PHP 的流行开源框架,以其优雅的语法、强大的路由系统和...

    Laravel开发-slack-laravel

    `Razorpay/Slack` 包提供了 Laravel 4 和 5 的支持,包括一个 Laravel 的服务容器绑定(Service Provider)和一个 Facade(外观模式)。服务提供者负责注册包的配置和服务,而 Facade 提供了简洁的调用接口,让...

    Laravel开发-laravel-expedia

    在 Laravel 的服务容器中注册 API 客户端后,我们可以编写一个 facade,为应用提供一个简单的接口来调用 Expedia API。Facade 提供了一个静态的接口,背后其实是通过依赖注入来调用非静态的服务。这样,我们可以在...

    Laravel开发-laravel-newsletter

    在本文中,我们将深入探讨 Laravel 开发中的一个重要组件——`laravel-newsletter`。这个开源项目是为 Laravel 应用程序提供电子邮件订阅管理功能的扩展,它简化了处理用户订阅、发送新闻通讯以及管理邮件列表的过程...

    Laravel开发-alipay

    在IT行业中,Laravel是一个非常流行的PHP框架,以其优雅的设计和强大的功能深受开发者喜爱。本项目“Laravel开发-alipay”专注于在Laravel框架下集成支付宝(Alipay)的服务,使得开发者能够轻松地在自己的应用中...

    Laravel开发-laravel-forecast

    在Laravel中,外观是一种静态代理设计模式,它提供了一个简单的接口来访问复杂系统或服务。LaravelForecast的外观提供了一种简洁的方式来调用forecast php库的方法,例如查询天气预报。使用外观,开发者可以避免在...

    Laravel开发-easemob-facades

    在Laravel框架中,"Facades"是一种设计模式,它为开发者提供了简单、静态的调用接口,实则背后依赖于服务容器。Easemob是企业级的即时通讯(IM)云服务,用于构建聊天功能。将Easemob与Laravel结合,通过Facades进行...

    Laravel开发-laravel-translation

    在本文中,我们将深入探讨Laravel开发中的一个重要组件——`laravel-translation`。这个包为Laravel框架提供了强大的多语言支持,不仅限于传统的PHP数组,还扩展到了数据库和缓存存储,使得管理和维护多语言网站变得...

    Laravel开发-laravel-captcha

    【Laravel开发-laravel-captcha】是针对Laravel框架的一个扩展包,主要目的是为了实现验证码功能。在Web应用中,验证码是一种防止恶意机器人或者自动化脚本进行操作的安全机制,例如防止垃圾邮件、刷票等行为。这个...

    Laravel开发-facades

    在Laravel中,每个Facade都有一个对应的类,这个类通常位于`\Illuminate\Support\Facades`命名空间下。例如,`App::make('foo')`实际上会调用服务容器来创建并返回`'foo'`绑定的类实例。Facades的静态方法调用会被...

    Laravel开发-resolver

    当你在类的构造函数或方法中声明一个依赖时,Laravel会在运行时自动提供这个依赖的实例。这减少了代码的耦合度,使得每个组件只关注自己的职责。 2. **服务绑定**: 服务容器的核心是服务绑定。你可以将一个类或...

    Laravel开发-firebase-laravel

    在Firebase控制台上创建一个新的Web应用,获取JSON配置文件,然后在Laravel的`.env`文件中设置相应的环境变量,例如: ``` FIREBASE_DATABASE_URL=https://your-project-id.firebaseio.com/ FIREBASE_SERVICE_...

    Laravel开发-laravel-from-scratch

    "Laravel 开发 - Laravel from Scratch" 是一个教程,旨在帮助初学者或有经验的开发者逐步学习并掌握 Laravel 框架,从而能够构建高效、可维护的 Web 应用程序。 ### 1. 安装与环境配置 在开始 Laravel 之旅之前,...

    Laravel开发-laravel-repository

    Laravel Repository的实现通常会创建一个自定义的服务提供者,将Repository实例注册到容器中,以便在应用的其他部分通过依赖注入来使用。 3. 创建Repository接口:首先,我们需要定义一个Repository接口,该接口...

Global site tag (gtag.js) - Google Analytics