控制器中的构造函数如何重写为提供者?

How constructor in controller rewrite into provider?

我有这个控制器可以与 MailChimp 一起使用:

class MailchimpController extends Controller
{
    private $MC_API_KEY;
    private $MailChimp;

    public function __construct()
    {
        $this->CHIMP_KEY = getenv('CHIMP_KEY');
        $this->MailChimp = new MailChimp($this->CHIMP_KEY);
    }

    public function index()
    {
        return $this->MailChimp->get('test');
    }

    public function show($test)
    {
        return $this->MailChimp->get("test/$test");
    }
}

如何将此构造函数重写为服务提供者?

app/Providers/AppServiceProvider.php中在register()中将class绑定到服务容器:

$this->app->bind(MailChimp::class, function () {
    return new MailChimp(getenv('CHIMP_KEY'));
});

现在在您的控制器中您有 2 个选项:

首先是通过app helper解决:

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

或者使用依赖注入:

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

提供者@register:

不处理 'env' 并从配置中提取它(出于缓存原因)。

$this->app->bind(MailChimp::class, function ($app) {
    return new MailChimp($app['config']['services']['mailchimp']['key']);
});

控制器构造函数:

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

对于外观,您 'could try' 只需使用 Real-time Facade

use Facades\SomeNamespace\MailChimp as MailChimp;

public function blah()
{
    MailChimp::get(...);
}