gpt4 book ai didi

php - Laravel ServiceProvider 的 register() 方法究竟是如何工作的?

转载 作者:可可西里 更新时间:2023-10-31 23:37:06 25 4
gpt4 key购买 nike

我是 PHPLaravel 的新手。我按照本教程将 reCAPTCHA 支持添加到我的 Laravel 应用程序中的页面:

http://tutsnare.com/how-to-use-captcha-in-laravel-5/

无论如何,我的疑问与验证码严格无关,而是与之前教程的内容有关:

如您所见,它添加了这个服务提供商:

'providers' => [
Anhskohbo\NoCaptcha\NoCaptchaServiceProvider::class,
],

根据我阅读官方文档的理解:https://laravel.com/docs/5.4/providers

ServiceProvider 是注册我的应用程序在启动时使用的“组件”的东西。

但这到底是什么意思呢?

我正在尝试理解它研究之前的 NoCaptchaServiceProvider 类并将其与文档进行比较。

这是它的代码:

<?php

namespace Anhskohbo\NoCaptcha;

use Illuminate\Support\ServiceProvider;

class NoCaptchaServiceProvider extends ServiceProvider
{
/**
* Indicates if loading of the provider is deferred.
*
* @var bool
*/
protected $defer = false;

/**
* Bootstrap the application events.
*/
public function boot()
{
$app = $this->app;

$this->bootConfig();

$app['validator']->extend('captcha', function ($attribute, $value) use ($app) {
return $app['captcha']->verifyResponse($value, $app['request']->getClientIp());
});

if ($app->bound('form')) {
$app['form']->macro('captcha', function ($attributes = []) use ($app) {
return $app['captcha']->display($attributes, $app->getLocale());
});
}
}

/**
* Booting configure.
*/
protected function bootConfig()
{
$path = __DIR__.'/config/captcha.php';

$this->mergeConfigFrom($path, 'captcha');

if (function_exists('config_path')) {
$this->publishes([$path => config_path('captcha.php')]);
}
}

/**
* Register the service provider.
*/
public function register()
{
$this->app->singleton('captcha', function ($app) {
return new NoCaptcha(
$app['config']['captcha.secret'],
$app['config']['captcha.sitekey']
);
});
}

/**
* Get the services provided by the provider.
*
* @return array
*/
public function provides()
{
return ['captcha'];
}
}

它包含:

1) register() 方法:

public function register()
{
$this->app->singleton('captcha', function ($app) {
return new NoCaptcha(
$app['config']['captcha.secret'],
$app['config']['captcha.sitekey']
);
});
}

它只是将东西绑定(bind)到服务容器中。在这种情况下,它采用存储在 .env 文件中的 2 个值。这些值包含重新验证码字符串。

我的疑问是:在应用程序启动时,Laravel 调用了 register() 方法,但究竟发生了什么?

register() 方法的这一部分是什么意思?

$this->app->singleton('captcha', function ($app) {
return new NoCaptcha(
$app['config']['captcha.secret'],
$app['config']['captcha.sitekey']
);
});
  • $this 是谁?我认为它是 NoCaptchaServiceProvider 实例(但我不太确定),是它还是我遗漏了什么?

  • $this->app 是什么意思? app 是方法还是属性?

  • 什么意思 $this->app->singleton('captcha'.....});我认为它有点像一个工厂,实现了某物的单个实例……但究竟是什么在 build ?它是 **NoCaptcha 实例吗?

  • 我认为之前单例构建的逻辑是通过inner函数实现的:

     function ($app) {
    return new NoCaptcha(
    $app['config']['captcha.secret'],
    $app['config']['captcha.sitekey']
    );

这里我有两个疑问:

第一个是:谁将 $app 传递给这个函数?是不是像一个空的变量\对象,稍后会填充?还是以某种方式注入(inject)?

这个函数好像是创建单例的逻辑。因为放在里面:

singleton('captcha', function ($app) {
return new NoCaptcha(
$app['config']['captcha.secret'],
$app['config']['captcha.sitekey']
);
});

那是什么意思呢?这意味着当 singleton() 方法被调用时,这个函数返回一个新的 NoCaptcha 对象被执行,它代表我的单例创建逻辑?

那么这意味着 PHP 以某种方式实现了函数式编程范式

最佳答案

$this 指的是 NoCaptchaServiceProvider。

NoCaptchaServiceProvider 扩展了服务提供商。它具有属性 $app,它是 \Illuminate\Contracts\Foundation\Application 又名 Laravel 应用程序的一个实例。

当创建一个新的服务提供者时,Laravel 将应用程序实例注入(inject)到服务提供者的构造函数中:

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

因此,使用 $this->app,您将检索 laravel 应用程序实例

应用程序实例 扩展了Container 类,后者具有singleton() 方法。它只是在容器中注册一个共享绑定(bind)。

public function singleton($abstract, $concrete = null)
{
$this->bind($abstract, $concrete, true);
}

编辑:请注意,这些 namespace 指的是契约,而不是实际的类。

服务容器所做的是将接口(interface)绑定(bind)到给定的实现。契约(或接口(interface))只是告诉类应该实现哪些方法。

例如:我们有 UserRepository,它有 UserRepositoryContract,告诉我们某个实现需要函数 all() 和 find()。我们将该 Contract 绑定(bind)到 EloquentUserRepository,它只是一个实现这些方法并使用 Eloquent 返回 all() 和 find() 的类。

现在我们唯一需要做的就是设置绑定(bind)并使用 UserRepositoryContract 作为实例而不是 EloquentUserRepository。

如果我们以后想使用 Redis,我们只需要创建一个实现相同方法的 RedisUserRepository 类,更改容器中的绑定(bind)即可。现在所有 UserRepositoryContract 实例都将使用 Redis 而不是 Eloquent。

关于php - Laravel ServiceProvider 的 register() 方法究竟是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42325393/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com