Lumen 5创建Facade类

Laravel的Facade,实际上是对service container中的service provider的一层包装,使用魔术方法__callStatic调用service provider类的方法。拿Log Facade来探究一下。

<?php

namespace Illuminate\Support\Facades;

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

Facade类只需要重写父类中的getFacadeAccessor方法,返回一个字符串即可。
返回的log代表什么,有什么用?

到框架的service container里看个究竟

<?php

namespace Laravel\Lumen;

use Monolog\Logger;
use Illuminate\Support\Str;
use Illuminate\Http\Request;
use Illuminate\Support\Composer;
use Monolog\Handler\StreamHandler;
use Illuminate\Container\Container;
use Monolog\Formatter\LineFormatter;
use Illuminate\Filesystem\Filesystem;
use Illuminate\Support\Facades\Facade;
use Illuminate\Support\ServiceProvider;
use Zend\Diactoros\Response as PsrResponse;
use Illuminate\Config\Repository as ConfigRepository;
use Symfony\Bridge\PsrHttpMessage\Factory\DiactorosFactory;

class Application extends Container
{
    /**
     * Register the core container aliases.
     *
     * @return void
     */
    protected function registerContainerAliases()
    {
        $this->aliases = [
            'Illuminate\Contracts\Foundation\Application' => 'app',
            'Illuminate\Contracts\Auth\Factory' => 'auth',
            'Illuminate\Contracts\Auth\Guard' => 'auth.driver',
            'Illuminate\Contracts\Cache\Factory' => 'cache',
            'Illuminate\Contracts\Cache\Repository' => 'cache.store',
            'Illuminate\Contracts\Config\Repository' => 'config',
            'Illuminate\Container\Container' => 'app',
            'Illuminate\Contracts\Container\Container' => 'app',
            'Illuminate\Database\ConnectionResolverInterface' => 'db',
            'Illuminate\Database\DatabaseManager' => 'db',
            'Illuminate\Contracts\Encryption\Encrypter' => 'encrypter',
            'Illuminate\Contracts\Events\Dispatcher' => 'events',
            'Illuminate\Contracts\Hashing\Hasher' => 'hash',
            'log' => 'Psr\Log\LoggerInterface',    // 重点在这里
            'Illuminate\Contracts\Queue\Factory' => 'queue',
            'Illuminate\Contracts\Queue\Queue' => 'queue.connection',
            'request' => 'Illuminate\Http\Request',
            'Laravel\Lumen\Routing\UrlGenerator' => 'url',
            'Illuminate\Contracts\View\Factory' => 'view',
        ];
    }

    /**
     * Register container bindings for the application.
     *
     * @return void
     */
    protected function registerLogBindings()
    {
        $this->singleton('Psr\Log\LoggerInterface', function () {
            if ($this->monologConfigurator) {
                return call_user_func($this->monologConfigurator, new Logger('lumen'));
            } else {
                return new Logger('lumen', [$this->getMonologHandler()]);
            }
        });
    }
}

当我们调用Log::info时,实际上调用的是Psr\Log\LoggerInterface的info方法,Psr\Log\LoggerInterface可以看做Log的代理,Log有需要时,转发给代理,由代理决定具体的执行。有了Facade,代码可读性更高,不需要解具体的内部实现。

进一步说

Log::info()
// 等同于
app('log')->info()  // app('log')创建了什么?请看Application::registerLogBindings

开始创建一个Facade

第一步,实现一个service provider

代码大致如下

<?php
namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Illuminate\Http\Request;
use App\Logger;

/**
 * Class LogServiceProvider
 * @package App\Providers
 */
class LogServiceProvider extends ServiceProvider
{

    public function register()
    {
        // TODO: Implement register() method.
        $this->app->singleton('mylog', function($app) {
            return new Logger();
        });
    }

}

第二步,注册service provider

在bootstrap/app.php文件添加代码

$app->register(App\Providers\LogServiceProvider::class);

第三步,创建Facade类

<?php
namespace App\Library\Facade;

use Illuminate\Support\Facades\Facade;

class Mylog extends Facade
{
    public static function getFacadeAccessor()
    {
        return 'mylog';
    }
}

就是这么简单。

容易看出,Facade类带来了好处,也带来了坏处,比如:PHPStorm的代码跟踪就拿Facade无能为力了。

关于Laravel 5 Service container与service provider,可以参考
Laravel5 container & service provider

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 您可以使用Lumen来构建API和Microservices,以及快速构建和维护您的应用程序后端。具体操作方法可以参考官方文档,可以了解更多关于如何使用Lumen的信息:https://lumen.laravel.com/docs/5.6 ### 回答2: UE5 Lumen是虚幻引擎5中全新的全局光照系统,它能够提供卓越的视觉效果和更高质量的实时光照渲染。下面我将简要介绍UE5 Lumen的一些使用方法。 首先,启用Lumen需要确保项目使用的是虚幻引擎5。在项目设置中,可以找到“Renderer Settings(渲染设置)”并将全局光照模式切换为“Lumen”。 使用Lumen之后,您可以通过调整Lumen的各种参数和属性来获得期望的光照效果。在虚幻编辑器中,可以通过在“World Settings(世界设置)”面板中找到Lumen相关的设置。可以调整光源的影响范围、默认反射率、灯光传播速度等。 此外,Lumen还通过使用Virtual Shadow Maps(虚拟阴影贴图)的方式提供了一个方便的动态阴影解决方案。这些虚拟阴影贴图将在运行时生成,可以覆盖较大范围的场景并提供更高质量的动态阴影效果。 Lumen还提供了自适应全局光照(ALGI)功能,这意味着光照会根据场景中的物体进行实时计算,以提供更真实的光照效果。在项目中启用ALGI后,可以在“World Settings”面板中的Lumen设置下找到对应选项。 最后,Lumen还支持与虚幻引擎5中的其他特性和工具的集成。例如,您可以将LumenLumen的虚拟光源、物理基础解算器和其他虚幻引擎5功能一起使用,以获得更出色的效果。 总之,UE5 Lumen是虚幻引擎5中一款非常强大和灵活的全局光照系统。通过了解和使用Lumen相关的设置和功能,开发者可以在项目中获得更真实、更高质量的光照效果。 ### 回答3: UE5 Lumen是一项用于实时光线追踪的技术,以下是关于如何使用UE5 Lumen的相关信息。 首先,要使用UE5 Lumen,您需要打开UE5编辑器并创建一个新的项目或打开现有的项目。然后,您需要确保您的项目使用的是UE5版本,因为Lumen仅在UE5中可用。 一旦项目打开,您可以通过导航到“项目设置”>“引擎”>“渲染器设置”来启用Lumen。在这里,您可以找到一些Lumen相关的选项以及不同的属性进行调整。这些属性包括光线传输的距离、光照强度、间接光照的质量等等。 在设置完Lumen的属性后,您可以在场景中开始使用Lumen。您可以在场景中添加光源,并通过调整其属性来控制光照的参数,例如光照强度、颜色等等。 Lumen将根据这些光源的位置和属性来计算场景的光照效果。 另外,您还可以使用Lumen的虚拟光源功能。虚拟光源是一种模拟真实光源的方法,允许您创建没有直接光照但会产生间接光照效果的区域。您可以在场景中将虚拟光源放置在需要间接光照的区域,并调整其属性以实现所需的效果。 值得注意的是,Lumen需要消耗较多的计算资源,因此在使用Lumen时需要权衡计算性能和图形质量。您可以在场景中选择性地启用Lumen,以确保在处理复杂场景时获得平衡的性能和效果。 总的来说,UE5 Lumen是一项强大的实时光线追踪技术,可以为UE5项目带来真实而逼真的光影效果。通过在项目设置中启用Lumen,并合理调整光源的属性,您可以在场景中使用Lumen并在渲染时体验到其带来的改进。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值