Laravel - использование CacheManager в качестве зависимости - PullRequest
0 голосов
/ 03 июля 2018

Я пытаюсь использовать класс CacheManager в качестве зависимости в моем сервисе:

<?php

declare(strict_types=1);

namespace App;

use GuzzleHttp\Client;
use Illuminate\Cache\CacheManager;

class MatrixWebService implements WebServiceInterface
{
    public function __construct(Client $client, CacheManager $cache)
    {
        $this->client = $client;
        $this->cache = $cache;
    }
}

Поскольку может быть несколько реализаций WebserviceInterface, мне нужно определить его в AppServiceProvider соответственно:

$this->app->bind(WebServiceInterface::class, function () {
    return new MatrixWebService(
        new Client(),
        $this->app->get(CacheManager::class)
    );
});

Проблема в том, что когда я пытаюсь использовать свой сервис, Laravel не может разрешить CacheManager класс (вместо этого есть некоторая замена для cache):

[2018-07-02 22:45:26] local.ERROR: Class cache does not exist {"exception":"[object] (ReflectionException(code: -1): Class cache does not exist at /var/www/html/vendor/laravel/framework/src/Illuminate/Container/Container.php:769)
[stacktrace]
#0 /var/www/html/vendor/laravel/framework/src/Illuminate/Container/Container.php(769): ReflectionClass->__construct('cache')
#1 /var/www/html/vendor/laravel/framework/src/Illuminate/Container/Container.php(648): Illuminate\\Container\\Container->build('cache')
#2 /var/www/html/vendor/laravel/framework/src/Illuminate/Container/Container.php(610): Illuminate\\Container\\Container->resolve('cache')
#3 /var/www/html/app/Providers/AppServiceProvider.php(28): Illuminate\\Container\\Container->get('Illuminate\\\\Cach...')
...

Есть идеи, как правильно к этому подойти?

1 Ответ

0 голосов
/ 03 июля 2018

Когда ваше приложение имеет несколько реализаций интерфейса, контекстное связывание полезно:

namespace App;

use GuzzleHttp\Client;
use Cache\Repository;

class MatrixWebService implements WebServiceInterface
{
    public function __construct(Client $client, Repository $cache)
    {
        $this->client = $client;
        $this->cache = $cache;
    }
}

// AppServiceProvider.php
public function register()
{
     $this->app->bind(WebServiceInterface::class, MatrixWebServiceInterface::class);

     // bind MatrixWebService
     $this->app->when(MatrixWebService::class)
               ->needs(Repository::class)
               ->give(function () {
                   return app()->makeWith(CacheManager::class, [
                       'app' => $this->app
                   ]);
               });

     // bind some other implementation of WebServiceInterface
     $this->app->when(FooService::class)
               ->needs(Repository::class)
               ->give(function () {
                   return new SomeOtherCacheImplementation();
               });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...