Maison  >  Questions et réponses  >  le corps du texte

Dépendances insolubles (Laravel 8)

En utilisant le package "jasny/sso", j'obtiens l'erreur suivante :

IlluminateContractsContainerBindingResolutionException
Unresolvable dependency resolving [Parameter #0 [ <required> callable $getBrokerInfo ]] in class JasnySSOServerServer

JasnySSOServerServer.php Interne :

/**
 * Class constructor.
 *
 * @phpstan-param callable(string):?array{secret:string,domains:string[]} $getBrokerInfo
 * @phpstan-param CacheInterface                                          $cache
 */
public function __construct(callable $getBrokerInfo, CacheInterface $cache)
{
    $this->getBrokerInfo = Closure::fromCallable($getBrokerInfo);
    $this->cache = $cache;

    $this->logger = new NullLogger();
    $this->session = new GlobalSession();
}

J'ai aussi essayé :

php artisan route:clear
composer dump-autoload    
php artisan optimize:clear

Quelqu'un peut-il signaler le problème ici ?

P粉729198207P粉729198207285 Il y a quelques jours399

répondre à tous(1)je répondrai

  • P粉458913655

    P粉4589136552023-12-14 00:13:30

    Étant donné que jasny/sso n'est pas un package Laravel, il ne doit pas être enregistré auprès du conteneur sans un ensemble d'instructions spécifiques sur la façon de l'instancier en fonction de son constructeur.

    Ajoutez le code suivant dans la méthode AppServiceProviderregister() :

    $this->app->bind(\Jasny\SSO\Server\Server::class, function($app) {
       $myCallable = function() {
           // do what you gotta do..
       };
    
       return new \Jasny\SSO\Server\Server($myCallable, $app->make(CacheInterface::class));
    });
    

    À partir de là, vous pouvez effectuer les opérations suivantes depuis n'importe où dans l'application :

    /** @var \Jasny\SSO\Server\Server $jasnyServer **/
    $jasnyServer = app()->make(\Jasny\SSO\Server\Server::class);
    $jasnyServer->changeTheWorld(true);
    

    Il remplira automatiquement le constructeur avec l'appelable et la CacheInterface que nous avons configurés dans la liaison (vous pouvez également utiliser $app->singleton() au lieu de la liaison si vous n'avez besoin que d'une seule instance de cette classe qui existe tout au long de l'exécution du script).


    Normalement, tout ce que vous enregistrez dans le conteneur sera affecté par l'injection de dépendances de Laravel, vous ne pouvez donc pas utiliser de types inconnus dans le constructeur car Laravel n'a aucun moyen de savoir ce qu'est callable, et cette erreur sera générée lorsque cela se produit.

    En général, si vous pouvez contrôler cela, vous pouvez supprimer la fonction appelable du constructeur et utiliser un setter sur la classe.

    private $callableFunc = null;
    
    public function setCallable(callable $func) : void
    {
        $this->callableFunc = $func;
    }
    

    répondre
    0
  • Annulerrépondre