Jquery中文网 www.jquerycn.cn
Jquery中文网 >  脚本编程  >  php  >  正文 Laravel 创建自定义 Facades 类的例子

Laravel 创建自定义 Facades 类的例子

发布时间:2017-12-12   编辑:www.jquerycn.cn
jquery中文网为您提供Laravel 创建自定义 Facades 类的例子等资源,欢迎您收藏本站,我们将为您提供最新的Laravel 创建自定义 Facades 类的例子资源
在Laravel 应用程序中, facade 是提供从容器中访问对象的类。Facade 类实现了该机制。Laravel的facades,和其他自定义的facades,都需要继承基类Facade,下面来看一篇关于创建自定义 Facades 类的例子了,这个其实只要学php的都知道如何来创建类。

使用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()的形式使用该功能类了

您可能感兴趣的文章:
Laravel 创建自定义 Facades 类的例子
Laravel 5.1中进行自定义包开发的例子
搭建php Laravel框架教程详解
Laravel 中利用MailThief实现邮件发送例子
Laravel的Container/ServiceProvider/Facade之间的关系
Laravel使用支付宝进行支付开发实例
Laravel Notifynder 扩展实现 Laravel 应用的消息通知功能
Laravel 深入理解控制反转(IoC)和依赖注入(DI)
Laravel中如何给图片加水印?
LARAVEL 中使用 VUE 组件化开发例子

[关闭]