Dépendances insolubles (Laravel 8)
P粉729198207
P粉729198207 2023-12-13 10:13:44
0
1
462

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粉729198207
P粉729198207

répondre à tous(1)
P粉458913655

É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;
}
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal