如何在Laravel中使用外墙

2020年12月30日10:49:12 发表评论 46 次浏览

本文概述

外墙是学习Laravel时应了解的关键内容之一。

我花了很多时间弄清楚外墙是如何工作的, 我正在写这篇文章来帮助遇到麻烦的人。

在本文中, 我们将介绍什么是外墙, 如何在Laravel中使用外墙, 如何构建自己的简单外墙等。

什么是外墙?什么是包装纸?

Laravel中的Facade是非静态函数的包装, 将其转换为静态函数。

描述设计模式时也可以使用"包装"一词。包装对象以为其提供简化的界面通常被称为"外观"模式。

简而言之, 包装纸 是门面。

在深入研究外观之前, 重要的是要了解PHP中的静态和非静态函数。

静态方法

在静态方法中, 我们不需要创建类的实例来引用它。静态方法在访问类的属性或方法时使用双冒号(::):

<?php
class Calc {
    const GOLDEN_RATIO = '1.618';
}

echo Calc::GOLDEN_RATIO;  //1.618

保留关键字, 例如自, static和父母用于引用类中的属性或方法:

<?php
class backend {
	private const language = "php";
	public static function language() {
    	echo self::language;
  	}
}

backend::language();  //php

非静态方法

非静态方法要求实例化给定的类。换句话说, 它们需要类的实例才能执行:

<?php
class backend{

	public function language($name){
		
		echo $name;
	}

}


$test = new backend; //creating an instance of the class

$test->language('php'); //php

现在, 我们已经讨论了静态和非静态方法, 我们可以更深入地研究Laravel中的外墙。

Laravel外墙

在里面供应商> laravel>框架> src>照明>支持>外墙目录中有一个文件列表, 这些文件是默认情况下Laravel附带的各种外观。

这是我们的编辑器中目录结构的实际屏幕截图:

如何在Laravel中使用外墙1

让我们使用来自Log.php以更详细地检查外观–相同的解释应适用于任何Laravel应用程序中的所有外观。

Laravel的原木门面

这是Laravel的代码日志记录正面:

<?php

namespace Illuminate\Support\Facades;

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

日志记录是扩展基础外观的类, 该基础外观来自上面的命名空间。

内日志记录类中有一个受保护的访问修饰符, getFacadeAccessor, 该方法的作用是返回日志.

这个立面的名称, 日志将返回, 因此我们可以在Laravel应用程序中的任何位置访问命名的外观, 而无需对其进行初始化。所以我们可以做类似的事情Log :: info('hello there');任何地方都非常容易。

如你所见, Facade使代码更易于阅读, 更有条理, 并使测试容易10倍。

自从了解日志记录从我的一位同事那里, 它一直是我最喜欢的调试工具。

如何在Laravel中创建外观

在本节中, 我们将实现我们自己的外观。这里的主要目的是帮助学习者了解Laravel外墙如何工作。

我们将通过创建一个StudentFacade来做到这一点, 该扩展将从基础Facade扩展属性, 该基础Facade在解析后返回name属性。此name属性将为string类型, 并且每次我们实例化该类时都将返回该属性, 如下所示:

如何在Laravel中使用外墙2

好奇我们将如何实现这一目标?按照我将逐步引导你的步骤进行。

我们不会使用普通的Laravel约定来创建外观, .php文件in应用>外墙然后在另一个提供者在我们最终将其注册到配置>应用.

相反, 我们将解决web.php在 - 的里面路线对于此插图, 因为我们只是试图查看外观在典型的Laravel应用程序中如何在引擎盖下工作。

首先, 让我们开始web.php:

<?php 
class Student{
    public function students(){
        return 'Sean';
    }
}

 app()->bind('student', function(){
 	return new Student;   
 });

我们创建了一个类学生, 并且在其中有一个非静态学生们返回学生数组的方法。

然后我们称捆绑使它始终实例化的方法新生因此我们不再需要手动执行此操作。

接下来, 让我们创建一个基础正面班级仍在同一个web.php:

class Facade{
    public static function __callStatic($name, $args){
        return app()->make(static::getFacadeAccessor())->$name();
    }
    
    protected static function getFacadeAccessor(){
        //override take place 
    }
}

我们稍后可能创建的任何立面都将扩展此基础立面的属性。

内正面课上我们有一个__callStatic 魔术方法可以帮助我们解决静态:: getFacadeAccessor()从容器app()-> make()。有了这些, 我们就可以访问$名称属性。

class StudentFacade extends Facade {
	protected static function getFacadeAccessor(){
    	return 'student';
    }
}

这里, 学生门面继承基础立面的属性。然后我们覆盖getFacadeAccessor()并将返回值设置为每次我们在上面的绑定中实例化时所具有的值学生.

StudentFacade::students(); //output "Sean"

当我们尝试调用创建的外观时, 它会按预期返回" Sean"。现在, 在最后一步中, 我们必须将所有这些步骤放在一起:

<?php

class Student{
    public function students(){
        return 'Sean';
    }
}

 app()->bind('student', function(){
    return new Student;   
 }); 
 
 
 class Facade{
    public static function __callStatic($name, $args){
        return app()->make(static::getFacadeAccessor())->$name();
    }
    
    protected static function getFacadeAccessor(){
        //override take place 
    }
}

class StudentFacade extends Facade {
    protected static function getFacadeAccessor(){
        return 'student';
    }
}

//log or die it to the output
dd(StudentFacade::students());
如何在Laravel中使用外墙3

总结

我希望到本课程结束时, 你能够拓宽你对外墙工程的知识。如果你有任何疑问或希望继续进行对话, 请随时向我发送推文。

参考文献

Laravel入门教程-烟气

编程中的WRAPPER是什么, 它有什么帮助?- 堆栈溢出

一盏木

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: