Exploration approfondie de la façon d'utiliser les interfaces/contrats dans Laravel
P粉517090748
P粉517090748 2024-02-17 14:27:04
0
1
401

J'essaie d'augmenter mes connaissances PHP/Laravel, donc lors de la création de nouvelles fonctionnalités, j'essaie de travailler avec des interfaces.

Pour planter le décor : Notre société a changé de prestataire de prélèvement plusieurs fois au cours de l'année et j'ai souhaité créer cette interface pour rendre les futurs changements plus « échafaudés ».

Ma structure de code :

Interface d'application DirectDebitInterface

interface DirectDebitInterface {
    public function createAccount($account);
    // additional methods
}

Application Service DirectDebitClientsBottomline

class Bottomline implements DirectDebitInterface {
    public function getAccount(String $reference)
    {
        // do external API call, return back data
    }
}

AppProvidersAppServiceProvider @register

$this->app->bind(
    DirectDebitInterface::class,
    config('services.direct_debit_clients.' . // Bottomline
    config('services.direct_debit_clients.default') . '.class') // App\Services\DirectDebit\Clients\Bottomline::class
);

Mon utilisation actuelle fonctionne mais ne me semble pas correcte, voici un point de terminaison de test utilisant la méthode getAccount() :

public function getAccount(DirectDebitInterface $directDebitInterface)
{
    dd($directDebitInterface->getAccount('OS10129676'));
}

Ma première question est la suivante : je n'ai jamais vu personne utiliser une interface dans les paramètres de variables d'une classe ?

Ma deuxième question est la suivante : j'utilise Livewire pour charger des données, mais je n'arrive pas à comprendre comment utiliser l'interface.

Voici l'exemple de code pour ma deuxième question :

Exemple AppHttpLivewire

public function mount(Account $account)
{
    self::getDirectDebitAccount();
}

private function getDirectDebitAccount(DirectDebitInterface $directDebitInterface)
{
    dd($directDebitInterface->getAccount($reference));
}

Le code ci-dessus échoue car la méthode nécessite la transmission d'un paramètre, mais je ne peux pas non plus instancier la classe car il s'agit d'une interface.

En plus d'avoir l'impression qu'il y a quelques lacunes fondamentales dans mes connaissances... il semble que je sois sur la bonne voie, mais mon utilisation des classes/interfaces n'est pas configurée correctement.

Des suggestions sur la façon d'appeler cette interface depuis une méthode ou est-ce que ça ne va pas quelque part ?

Là,

P粉517090748
P粉517090748

répondre à tous(1)
P粉615829742

Vous effectuez une injection de dépendances basée sur une méthode, ce qui est parfaitement valide mais sans doute moins courant que l'injection de dépendances basée sur un constructeur. Les deux ont des résultats similaires, c'est-à-dire en injectant les dépendances requises, la principale différence est la portée des dépendances (méthode vs classe).

Dans un environnement Laravel/PHP standard, l'injection de constructeur pourrait ressembler à ceci :

private DirectDebitInterface $directDebitor;

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

public function doSomething(string $account)
{
    dd($this->directDebitor->getAccount($account));
}

Livewire est légèrement différent dans le sens où vous n'utilisez pas la fonction __construct函数在Component中,而是需要使用mount().

public function mount(DirectDebitInterface $directDebitor)
{
    $this->directDebitor = $directDebitor;
}

En supposant que vous ayez correctement configuré le conteneur de servicesbindings dans , tout devrait fonctionner correctement.

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal