Laravel 创建自定义 Facades 类的例子

使用Laravel框架必不可少的会用到它很多强大的门面类(Facades),门面提供了一个“静态”接口到服务容器中绑定的类,官方文档阐述了如何使用系统自带的缓存门面,我们这里演示如何创建并使用一个自定义的门面类。

注:本教程基于上一节服务提供者做部分代码修改,不熟悉的请参阅。
我们首先创建一个需要绑定到服务容器的Test类:

<?php

namespace App\Facades;

class Test
{
    public function doSomething()
    {
        echo 'This is TestClass\'s method doSomething';
    }
}
然后创建一个静态指向Test类的门面类TestClass:

<?php

namespace App\Facades;

use Illuminate\Support\Facades\Facade;

class TestClass extends Facade
{
    protected static function getFacadeAccessor()
    {
        return 'test';
    }
}

接下来我们要在服务提供者中绑定Test类到服务容器,修改TestServiceProvider类如下:

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use App\Services\TestService;
use App\Facades\Test;

class TestServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap the application services.
     *
     * @return void
     */
    public function boot()
    {

    }

    /**
     * Register the application services.
     *
     * @return void
     */
    public function register()
    {
        $this->app->singleton('test',function(){
            //return new TestService();
            return new Test;
        });

        $this->app->bind('App\Contracts\TestContract',function(){
            return new TestService();
        });
    }
}

再然后需要到配置文件config/app.php中注册门面类别名:

'aliases' => [

    ...//其他门面类别名映射

    'TestClass' => App\Facades\TestClass::class,
],

最后修改TestController代码如下:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use App\Http\Requests;
use App\Http\Controllers\Controller;

use App;
use TestClass;
use App\Contracts\TestContract;

class TestController extends Controller
{

    public function __construct(TestContract $test){
        $this->test = $test;
    }

    /**
     * Display a listing of the resource.
     *
     * @return Response
     */
    public function index()
    {
        // $test = App::make('test');
        // $test->callMe('TestController');
        //$this->test->callMe('TestController');

       TestClass::doSomething();
    }

    ...//其他方法
}

注意:不要忘了在调用门面类TestClass的文件顶部使用use TestClass;引入TestClass,否则将不能正确调用。
好了,我们可以去浏览器中测试了,访问http://laravel.app:8000/test,页面将会输出:

This is TestClass's method doSomething

实现 Facades 功能另一篇文章

1. 实现Laravel的自动加载功能

首先建立目录app/lib/Myapp,然后添加目录到composer.json中

1 "autoload": {       
2     "psr-0":{
3         "Myapp":"app/lib"
4     }
5 }

2. 实现功能类

实现能能类 app/lib/Myapp/Test.php

 1 <?php
 2 /**
 3  * @author brudeke
 4  */
 5 namespace Myapp;
 6 class Test{
 7     public function do(){
 8         echo 'this is a class';
 9     }
10 }

3. 实现ServiceProvider

实现app/lib/Myapp/TestServiceProvider.php ,该类主要是将功能类添加到Ioc容器:

<?php
/**
 * @author brudeke
 */
namespace Myapp;

use Illuminate\Support\ServiceProvider;

class TestServiceProvider extends ServiceProvider{

    public function register()  {
        $this->app['test'] = $this->app->share(
            function ($app) {
                return new \Myapp\Test();
        });
    }
}

4. 实现Facade 实例

实现app/lib/Myapp/Facades/TestFacades.php, 该类的主要美化,实现成员函数类似静态方法的调用形式

 1 <?php
 2 /**
 3  * @author brudeke
 4  */
 5 namespace Myapp\Facades;
 6
 7 use Illuminate\Support\Facades\Facade;
 8
 9 class  TestFacades extends Facade{
10     protected static function getFacadeAccessor()
11     {
12         return 'test';
13     }
14 }

5. 加载ServiceProvider

在app/config/app.php 中的providers中添加如下配置:

1 'providers' => array(  
2   'Myapp\TestServiceProvider'
3 ),
在app/config/app.php 中的aliases中添加别名:

1 'aliases' => array(
2     'TestClass'            =>  'Myapp\Facades\TestFacades',
3 ),
接下来就可以在项目中以TestClass::do()的形式使用该功能类了

时间: 2024-10-18 07:37:56

Laravel 创建自定义 Facades 类的例子的相关文章

【COCOS2DX-LUA 脚本开发之五】LUA 使用OOP(面对对象思想编程),免BINDING创建自定义LUA类

本站文章均为 李华明Himi 原创,转载务必在明显处注明: 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/lua-game/1282.html 上一篇中,向童鞋们介绍了如何自定义类binding到Lua中供给使用的教程,那么本篇将介绍利用OOP思想在在Lua中进行创建一个自定义类.    首先Himi来向大家讲解如何在Lua中不binding来自定义lua类,其实这种方式在Cocos2dx的Lua Samples已经为我们做好了例子,就看童鞋们是否

class-举个在xml文件中通过全限定类名调用自定义的类的例子

问题描述 举个在xml文件中通过全限定类名调用自定义的类的例子 举个在xml文件中通过全限定类名调用自定义的view的例子 关键代码如何的,谢谢解答 解决方案 http://www.educity.cn/wenda/82552.html

《Cocos2d 跨平台游戏开发指南(第2版)》一1.7 创建自定义精灵类

1.7 创建自定义精灵类 前面我们只是考虑如何把一个精灵添加到场景中,然而,以后可能想要一个单独的精灵类,以便你能为它添加自己的行为.在这一部分,我们将讨论如何通过扩展基本的CCSprite类来创建自定义的精灵类. 1.7.1 准备工作 让我们一起看一下如何创建一个自定义精灵类,它拥有自己的运动,并且更新函数. 为此,我们要先创建新文件. 1.在菜单栏中,依次选择File-New-File,在iOS的Source下,选择Cocoa Touch Class,单击Next按钮,如图1-19所示. 2

Groovy探索 自定义Range 一 一个简单的自定义Range类

这将是一个系列的文字,用来扩展我们对于自定义Range类的使用思路.也许我们在Groovy语言的编码不知不觉的使用到了Range类,甚至没有觉察到它的存在:或者我们在Groovy语言的编码过程中,常常惊叹于使用Range类的方便,但仅仅是惊叹而已,我们没有付之行动:或者我们想在实际编码中使用自定义的Range类,但却找不到使用它的适当地方.等等,所有这些,希望在读完我们的这个系列后,我们能够将被动的使用Range类,转化为主动的使用我们自定义的Range类. Groovy语言引入的一个重要概念就

【COCOS2DX-LUA 脚本开发之四】使用TOLUA++编译PKG,从而创建自定义类让LUA脚本使用

本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/lua-game/1259.html 此篇基本[COCOS2DX(2.X)_LUA开发之三]在LUA中使用自定义精灵(LUA脚本与自创建类之间的访问)及LUA基础讲解 在Lua第三篇中介绍了,如何在cocos2dx中使用Lua创建自定义类供Lua脚本调用使用,当时出于Himi对Lua研究不够深入,所以当时使用了笨方法手动添加的方式进行的,那么

Knockoutjs之创建自定义bindings的例子介绍

最近在使用Knockoutjs开发移动端,初次搞移动端的前端,碰到了许多问题,现在讲讲创建自定义bindings(不知道怎么翻译这个单词好,索性用英文了). 在开发的过程中,起初没有考虑click事件在移动端会存在延迟300ms的问题(其实我一开始也知道这个问题,打算先把功能做完再处理这个问题).做完之后发现click事件的用户体验实在是太差了,然后换成touchstart事件,但发现touchstart事件在用户滑动页面时容易误触发,所以找了一个tap事件的插件https://github.c

JFC/Swing活学活用之创建自定义图像组件

创建 引言 本文将讲述如何应用JFC/Swing内建的图像组件来创建完全自定义的基于图像的用户接口. 大多数Swing应用程序是通过标准VM提供的,或者是客户提供的外观和感觉(L&F)来获取它们的外在展示.L&F是一个完整的体系架构,VM需要做很多内在的工作,并且它还不是完全自定义的.举个例子来说吧,在基于L&F的前提下,我们可以创建一个按钮,看起来有点像交通岗上的"红灯",随之而来的在你的应用中所有的按钮就都有了这样的"相貌".然而有时我们

在ASP.NET Atlas中创建自定义的Behavior

asp.net|创建 English Version: http://dflying.dflying.net/1/archive/120_build_your_own_behaviors_in_aspnet_atlas.html Atlas中的Behavior定义了当控件的某个事件被触发时的行为.Behavior可以看作是一种封装了的DHTML的事件,例如click和hover等.Behavior同样可以是一个组件,可被attach到某个Atlas客户端控件上,以提供这个Atlas客户端控件更高

在ASP.NET Atlas中创建自定义Behavior

asp.net|创建 Atlas中的Behavior定义了当控件的某个事件被触发时的行为.Behavior可以看作是一种封装了的DHTML的事件,例如click和hover等.Behavior同样可以是一个组件,可被attach到某个Atlas客户端控件上,以提供这个Atlas客户端控件更高级,更丰富的功能,例如一些复杂的拖放(drag & drop),自动完成,浮动等功能.Behavior将被定义在某个Atlas控件的behaviors集合中. 从Atlas文档以及源文件中,我们可以知道Atl