2016-04-19 9 views
1

Ich habe Dienste, die @request_stack erfordern, um Parameter abzurufen.Wie erhalten Sie @ request_stack-Dienst im Kontext von app/console?

Jetzt möchte ich bestimmte Funktionalität auf Konsolenbefehle verfügbar machen, die über ./app/console//aufrufbar sind. Im Kontext eines ./app/console gibt es jedoch keine @request_stack, dennoch kann man Argumente eingeben.

Um dieses Problem zu beheben, erstelle ich jetzt im Grunde zwei Dienste, eine grundlegende, nur auf die Parameter warten, und eine in der Lage, die @request_stack zu verwenden.

Dennoch mag ich nicht, dass es zwei Möglichkeiten gibt, die Daten im anforderungsbasierten Fluss und über die app/console abgerufen werden.

Daher frage ich mich, wie ich bin einfach wollen die Daten, die über die Anfrage per Default kommt auch über die Konsole Argumente eingegeben werden können:

Kann ich Setup eine benutzerdefinierte request_stack eine Anforderung während einer Simulation Konsolenbefehl?

+0

Während Sie einen benutzerdefinierten Befehl schreiben, der 'ContainerAwareCommand' erweitert - in den Methoden' execute() 'und' configure() 'können Sie den Anforderungs-Stack wie' $ this-> getContainer() -> get ('request_stack') '.Aber eine Sache, die ich nicht verstehe, ist - was ist 'request_stack' in Kommandozeilenbefehlen? –

+0

@HimelNagRana ​​Momentan holt meine Dienste ihre notwendigen Parameter über den request_stack. Jetzt möchte ich sie über Konsolenargumente setzen. Um ein großes Refactoring zu vermeiden, suche ich nach einer Möglichkeit, meine Dienste so zu halten, wie sie sind, und somit eine Stack-Anfrage zu erstellen, obwohl dies nicht die optimale Lösung ist. – k0pernikus

+0

Nun, in diesem Fall können Sie - wie bereits erwähnt - in Ihrer benutzerdefinierten Befehlsklasse auf '@ request_stack' zugreifen und diese verwenden, wie Sie möchten. –

Antwort

1

Als ich dieses Problems war die Untersuchung, stolperte ich über Anfragestapel Push-Verfahren, in dem eine Warnung bereits im doc-Block an Ort und Stelle war:

/** 
* Pushes a Request on the stack. 
* 
* This method should generally not be called directly as the stack 
* management should be taken care of by the application itself. 
*/ 
public function push(Request $request) 
{ 
    $this->requests[] = $request; 
} 

So, während es möglich wäre, es so zu tun, Ich habe mich gegen den Ansatz meiner ursprünglichen Frage entschieden und stattdessen meine Bewerbung umgestaltet.

ich einen context Wertobjekt erstellt haben, die nur die Parameterdaten enthält:

/** 
* Context 
**/ 
class Context 
{ 
    /** 
    * @var string 
    */ 
    private $countryCode; 

    /** 
    * Context constructor. 
    * @param string $countryCode 
    */ 
    public function __construct($countryCode = '') 
    { 
     $this->countryCode = $countryCode; 
    } 

    /** 
    * @return string 
    */ 
    public function getCountryCode() 
    { 
     return $this->countryCode; 
    } 
} 

Und ein ContextFactory, die den Zusammenhang mit der Anfrage Stapel erstellt:

class ContextFactory extends RequestAwareService 
{ 
    /** 
    * ContextFactory constructor. 
    * @param RequestStack $stack 
    */ 
    public function __construct(RequestStack $stack) 
    { 
     $this->setRequestStack($stack); 
    } 

    /** 
    * @return Context 
    */ 
    public function create() 
    { 
     return new Context($this->request->getCountryCode()); 
    } 
} 

(Die RequestAwareService ist nur eine Hilfsklasse, um die Anfrage leichter zu analysieren.)

Ich definierte dann die Dienstleistungen in meinem Bündel services.yml:

context.factory: 
    class: Kopernikuis\MyBundle\Service\Config\ContextFactory 
    arguments: 
     - '@request_stack' 

context: 
    class: Kopernikuis\MyBundle\Service\Config\Context 
    factory: 
     - '@context.factory' 
     - create 

Statt die @request_stack die Injektion, bin Injektion ich mein @context Wert jetzt Objekts, das auch als jetzt die Hierarchie der Verringerung nur ein Dienst analysiert die request_stack einmal den Vorteil hatte, und ich habe auch bemerkt, dass bestimmte Funktionalität viel einfacher, da ich Parameter aus Methodenaufrufen entfernen konnte, da sie alle vom Kontextobjekt bereitgestellt wurden.

Und in meinen benutzerdefinierten Befehlen, kann ich meinen Kontext

protected function execute(InputInterface $input, OutputInterface $output) 
{ 
    // @todo: use variable from InputInterface 
    $context = new Context('fnordfoo'); 
    $this->getContainer()->set('context', $context); 
} 

Mit dem neu gewonnenen Wissen, ich stimme nicht zu mit meiner ursprünglichen Absicht zu versuchen, manuell, um die @request_stack ersetzen Sie einfach.

Refactoring der Code-Basis, nicht unbedingt die @request_stack Refactoring war eine solidere Wahl.