Laravel 依赖注入,Facades 类最简单的使用

依赖注入

直接形式

public function index(Request $request){

}

public function index(Test $test)
    {
        echo $test->testSay();

    }

这里都是依赖注入的一种表现,它们的本质是 new 类 然后复制给一个变量代替 。

操作指南:

  • 可以定义一个类(非抽血,接口类),然后直接注入即可。

绑定形式

我们在 app/Providers/ 下任意一个注册提供者在 register 里面注册一下我们的要执行的类

class AppServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        $this->app->bind('Test', function ($app) {
            return new \App\PayServices\Test();
        });

    }
}

test 类

<?php
namespace App\PayServices;

class Test
{
    public function testSay(){
        return 'This is testSay';
    }
}

那么我们现在要来输出怎么输出呢

 public function index(Test $test1)
    {
        echo $test1->testSay();
        echo '<br/>';

        $test2=app('Test');
        echo $test2->testSay();
        echo '<br/>';

        $test3=app()->make('Test');
        echo $test3->testSay();

        echo '<br/>';
        $test4 = resolve('Test');

        echo $test4->testSay();

    }

我们可以通过这4种形式进行调用输出

app()函数和resolve 等同于别名函数

 function resolve($name, array $parameters = [])
    {
        return app($name, $parameters);
    }

    function app($abstract = null, array $parameters = [])
    {
        if (is_null($abstract)) {
            return Container::getInstance();
        }

        return Container::getInstance()->make($abstract, $parameters);
    }

Facades类

我们将我们的类实现静态方法,我们通过Facades 之后可以轻易将我们的类转成任意静态方法,例如刚才的例子:TestFacade::testSay()
此类可定义任意位置,需要继承 Illuminate\Support\Facades\Facade,原理很简单,调用PHP的__callStatic()

<?php

namespace App;

use Illuminate\Support\Facades\Facade;

class TestFacade extends  Facade
{
    protected static function getFacadeAccessor()
    {
        return 'Test';
     }

}

相关知识: call()和 callStatic() 方法

  • 当对象访问不存在的方法时,__call()方法会被自动调用
  • 当对象访问不存在的静态方法时,__callStatic()方法会被自动调用

门面

我们在Facades类 定义了,我们还可以将它转成门面,相当于一个别名,这样我们就可以直接写引入类,即可找到别名
config/app.php

 'aliases' => [
      'Test6'=>\App\TestFacade::class
 ]
use Test6;
class HomeControlle extends Controller
{
    public function index(Test $test1)
    {
        echo $test1->testSay();
        echo '1.<br/>';

        $test2=app('Test');
        echo $test2->testSay();
        echo '2.<br/>';

        $test3=app()->make('Test');
        echo $test3->testSay();

        echo '3.<br/>';
        $test4 = resolve('Test');

        echo $test4->testSay();

        echo '4.<br/>';
        echo TestFacade::testSay();
        echo '5.<br/>';
        echo Test6::testSay();
        echo '6.<br/>';

    }
}

这样我们的输出结果是一样的。

评论区 (0)

没有记录
支持 markdown,图片截图粘贴拖拽都可以自动上传。

相关帖子

黑白课堂

如果你在.env文件下配置了变量参数,在路由缓存下会无效

| 最后更新 2020-12-11 03:05:43
3347 0
黑白课堂

laravel之Artisan命令操作,以及自己编写Artisan Console命令

| 最后更新 2021-01-13 14:24:58
3316 0
黑白课堂

JWT(JSON Web Token)是一个非常轻巧的规范。这个规范允许我们使用JWT在用户和服务器之间传递安全可靠的信息。 一个JWT实际上就是一个字符串,它由三部分组成,头部、载荷与签名

| 最后更新 2021-01-13 14:25:29
3301 0
黑白课堂

扩展一个指令在blade模板中使用。

| 最后更新 2020-12-11 03:04:51
2801 0
黑白课堂

所有Laravel应用启动的中心,所有Laravel的核心服务都是通过服务提供者启动,服务提供者是应用配置的中心. >这里需要了解下IOC(控制反转)也叫依赖注入

| 最后更新 2021-01-11 03:14:14
2885 0
黑白课堂

控制对资源的访问权限,这个权限不同于RBAC(角色的权限访问控制),比如,只能操作自己的信息,可以说是拟补RBAC的更加细腻的权限。

| 最后更新 2021-01-13 14:24:00
2798 0
黑白课堂

黑白课堂 · 技术专家

专业PHP开发

年度VIP 站长创业者玉树凌风每天醒来0收入
查看更多

最新视频课程