本书未发布

Facade

未匹配的标注

根据 Dictionary.com 的说法,“facade” 这个词指的是“某种东西的表面或者幻觉”。 在建筑学中,这个术语指的是建筑物的正面。

Laravel 中的 facade 是一个将静态方法调用重定向到底层类的动态方法的类。 Facade 的目标是为访问底层类的功能提供一种令人难忘且富有表现力的语法。

一个使用 facade 的流畅 API 的例子:

MessageFactory::sentBy($user)
    ->withTopic('Example message')
    ->withMessage($body)
    ->withReply($replyByFrank)
    ->create();

Facade 是如何工作的

要了解更多关于Facade及其工作方式的信息,请参考优秀的Laravel 文档

如何创建Facade

让我们假设我们提供了一个 Calculator 类作为包的一部分,并希望使这个类作为 facade 可用。

首先在 src/ 目录中创建 Calculator.php 文件。 为了简单点,计算器提供了一个  add()subtract() 和 clear()方法。 所有方法都返回对象本身,从而允许一个流式的 API (链式方法调用,比如:->add()->subtract()->subtract()->result())。

// 'src/Calculator.php'
<?php

namespace JohnDoe\BlogPackage;

class Calculator
{
    private $result;

    public function __construct()
    {
        $this->result = 0;
    }

    public function add(int $value)
    {
        $this->result += $value;

        return $this;
    }

    public function subtract(int $value)
    {
        $this->result -= $value;

        return $this;
    }

    public function clear()
    {
      $this->result = 0;

      return $this;
    }

    public function getResult()
    {
        return $this->result;
    }
}

除了这个类,我们将在一个新的 src/facades 文件夹中创建 facade:

// 'src/Facades/Calculator.php'
<?php

namespace JohnDoe\BlogPackage\Facades;

use Illuminate\Support\Facades\Facade;

class Calculator extends Facade
{
    protected static function getFacadeAccessor()
    {
        return 'calculator';
    }
}

最后,我们在服务提供者的服务容器中注册绑定:

// BlogPackageServiceProvider.php
namespace JohnDoe\BlogPackage;

public function register()
{
  $this->app->bind('calculator', function($app) {
      return new Calculator();
  });
}

在从适当的名称空间导入 Calculator facade 后,终端用户现在可以使用 Calculator facade: use JohnDoe\BlogPackage\Facades\Calculator; 。 但是,Laravel 允许我们注册一个别名,该别名可以在根命名空间中注册 facade。 我们可以在 composer.json 文件的 "providers" 下面的 "alias" 键下定义我们的别名:

"extra": {
    "laravel": {
        "providers": [
            "JohnDoe\\BlogPackage\\BlogServiceProvider"
        ],
        "aliases": {
            "Calculator": "JohnDoe\\BlogPackage\\Facades\\Calculator"
        }
    }
}

我们的 facade 现在不再需要导入,并且可以从根命名空间在项目中使用。

本文章首发在 LearnKu.com 网站上。

本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。

原文地址:https://learnku.com/docs/laravel-package...

译文地址:https://learnku.com/docs/laravel-package...

上一篇 下一篇
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
贡献者:1
讨论数量: 0
发起讨论 只看当前版本


暂无话题~