Utilizzando il contenitore controllori
get()
è solo una funzione scorciatoia fornita dal Symfony base Controller class per accedere al contenitore.
Il controller deve estendere questa classe per utilizzare questa funzione:
namespace Acme\ExampleBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
class DefaultController extends Controller
{
// your actions
}
Se non si vuole dipendere da questa classe (per alcuni motivi) è possibile estendere ContainerAware
per ottenere il contenitore iniettato e lo usano come nel get()
scorciatoia:
namespace Acme\ExampleBundle\Controller;
use Symfony\Component\DependencyInjection\ContainerAware;
class DefaultController extends ContainerAware
{
public function exampleAction()
{
$myService = $this->container->get('my_service');
// do something
}
}
Creazione di controllori sui propri
controllori non sono definiti come i servizi per impostazione predefinita, è possibile definirli, ma non è necessario per ottenere il contenitore. Se viene effettuata una richiesta, il framework di routing determina il controller, che deve essere chiamato. Quindi il controllore viene costruito e il contenitore viene iniettato tramite il metodo setContainer()
.
Ma se si costruisce il controller da solo (in un test o altrove), è necessario iniettare il contenitore da solo.
$controller = new DefaultController();
$controller->setContainer($container);
// $container comes trough DI or anything else.
fonte
2013-09-25 11:17:01
deprecato dalla versione 2.8, da rimuovere in 3.0. Utilizzare invece ContainerAwareTrait. – jan
@jan Puoi vedere quanti anni ha la risposta? Puoi vedere questa è una voce wiki della comunità? Vai e aggiorna modifica quella risposta invece di deridere è deprecato ... –