Korzystanie pojemnik w kontrolerach
get()
jest tylko funkcją skrótu dostarczone przez Symfony base Controller class aby uzyskać dostęp do pojemnika.
Twój kontroler musi rozszerzyć tę klasę aby skorzystać z tej funkcji:
namespace Acme\ExampleBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
class DefaultController extends Controller
{
// your actions
}
Jeśli nie chcesz polegać na tej klasie (z jakichś powodów) można rozszerzyć ContainerAware
aby pojemnik wstrzykiwany i używać go jak w get()
skrótu:
namespace Acme\ExampleBundle\Controller;
use Symfony\Component\DependencyInjection\ContainerAware;
class DefaultController extends ContainerAware
{
public function exampleAction()
{
$myService = $this->container->get('my_service');
// do something
}
}
Tworzenie kontrolerów na własnych
kontrolery nie są zdefiniowane jako usługi domyślnie można je zdefiniować, ale nie jest konieczne, aby uzyskać kontener. Jeśli zostanie wysłane żądanie, struktura routingu określa kontroler, który musi zostać wywołany. Następnie kontroler zostaje skonstruowany, a pojemnik jest wstrzykiwany za pomocą metody setContainer()
.
Ale jeśli sam zbudujesz kontroler (w teście lub gdziekolwiek indziej), musisz samodzielnie wstrzyknąć pojemnik.
$controller = new DefaultController();
$controller->setContainer($container);
// $container comes trough DI or anything else.
przestarzałe od wersji 2.8, do usunięcia w wersji 3.0. Zamiast tego użyj ContainerAwareTrait. – jan
@jan Możesz zobaczyć, ile lat ma odpowiedź? Widzisz, że jest to wpis wiki społeczności? Idź i zaktualizuj, edytuj tę odpowiedź, zamiast kpić ze swojej nieaktualnej ... –