2017-09-21 9 views
0

mir eine Schnittstelle bin mit verschiedenen Zahlungsoptionen zu verarbeiten.Referenz eine Schnittstelle von einem Controller Laravel

Die Sache ist in meinem Controller ich die Bank Slug bekommen, aber auf der Grundlage dieses Slug I, welche Klasse Bank meines Fall entscheiden zu verwenden, um die Zahlung zu verarbeiten. Mein Controller:

public function sendPayment($request, PayBank $bank_transacton) 
{ 

    here I want to reference the SentToBank interface and 
    send payment class that I get in return from checkBankImplementation function// 

    SendToBank()->sendLoanApplication($bank_transaction); 
} 

Methode zur Schnecke zu überprüfen, damit ich weiß, auf welchem ​​Zahlungsdienst an die Schnittstelle gesendet:

public static function checkBankImplementation($bank_slug) { 

    switch ($bank_slug) { 

    case "firstbank": 
     return new app\FirstBank\Client(); 
     break; 

    case "secondbank": 
     return new app\SecondBank\Client(); 
     break; 
    default: 

     return null; 
    } 
} 

meine Schnittstelle:

<?php 

namespace App\Banks; 

interface SendToBank { 

    public function sendLoanApplication($bank_transaction); 

} 
+0

Welche Klassen implementieren die SendToBank-Schnittstelle? – marijnz0r

+0

Zwei andere Klassen repräsentieren jeweils eine Bank, die dieselbe Methode haben sendLoanApplication ($ bank_transaction) –

+0

Wenn Sie eine Schnittstelle und nicht eine Implementierung referenzieren möchten, müssen Sie [Implementierung an eine Schnittstelle binden] (https: // laravel. com/docs/5.5/container # binding-interfaces-to-implementations). Aber ich bin mir nicht sicher, ob das in deinem Fall sinnvoll ist. – devk

Antwort

1

1- Ihre app\FirstBank\Client() und app\SecondBank\Client() muss die SendToBank-Schnittstelle implementieren.

2- Von Ihrem Controller haben Sie das richtige Objekt mit Ihrer statischen Methode zu erstellen.

3- Rufen Sie die sendLoanApplication Methode für das Objekt

So etwas:

public function sendPayment($request, PayBank $bank_transacton) 
{ 

    $bankClient = Class::checkBankImplementation($bank_slug); // You need to change the class name with the one actually implementing the checkBandImplementation method and extract the proper $bank_slug from the request 

    $bankClient->sendLoanApplication($bank_transaction); 
} 
+0

Nein. CheckBankImplementation ist eine statische Methode, daher brauchen Sie nur den Klassennamen für den Aufruf, ohne ein neues Objekt mit 'new' zu erstellen. In welcher Klasse hast du diese Methode tatsächlich implementiert? – gbalduzzi

+0

schaltete es auf öffentliche bereits –

+0

Hat es jetzt arbeiten, oder benötigen Sie weitere Hilfe? – marijnz0r

Verwandte Themen