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.
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? –
@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
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. –