1515 * @author Sven Baumann <baumann.sv@gmail.com>
1616 * @author Kim Wormer <hallo@heartcodiert.de>
1717 * @author Ingolf Steinhardt <info@e-spin.de>
18+ * @author David Molineus <david.molineus@netzmacht.de>
1819 * @copyright 2013-2025 Contao Community Alliance.
1920 * @license https://github.com/contao-community-alliance/dc-general/blob/master/LICENSE LGPL-3.0-or-later
2021 * @filesource
3334use ContaoCommunityAlliance \DcGeneral \Factory \DcGeneralFactory ;
3435use ContaoCommunityAlliance \Translator \TranslatorInterface as CcaTranslator ;
3536use Contao \Backend ;
36- use Contao \Config ;
3737use Contao \Controller ;
3838use Contao \CoreBundle \Framework \ContaoFramework ;
3939use Contao \CoreBundle \Picker \PickerBuilderInterface ;
4040use Contao \CoreBundle \Picker \PickerInterface ;
41- use Contao \Environment ;
4241use Contao \StringUtil ;
4342use Contao \Validator ;
4443use Contao \Widget ;
4544use InvalidArgumentException ;
46- use Symfony \Component \DependencyInjection \ContainerAwareInterface ;
47- use Symfony \Component \DependencyInjection \ContainerAwareTrait ;
48- use Symfony \Component \DependencyInjection \ContainerInterface as SymfonyContainerInterface ;
4945use Symfony \Component \EventDispatcher \EventDispatcherInterface ;
5046use Symfony \Component \HttpFoundation \Request ;
5147use Symfony \Component \HttpFoundation \RequestStack ;
5248use Symfony \Component \HttpFoundation \Response ;
5349use Symfony \Component \HttpFoundation \Session \Attribute \AttributeBagInterface ;
54- use Symfony \Component \HttpFoundation \Session \SessionInterface ;
5550use Symfony \Component \HttpKernel \Exception \BadRequestHttpException ;
5651use Symfony \Component \Routing \Attribute \Route ;
5752use Symfony \Contracts \Translation \TranslatorInterface ;
6459 * Handles the backend tree.
6560 *
6661 * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
67- *
68- * @psalm-suppress DeprecatedInterface
69- * @psalm-suppress DeprecatedTrait
7062 */
7163#[Route("/contao/cca " , defaults: ['_scope ' => 'backend ' , '_token_check ' => true ])]
72- class BackendTreeController implements ContainerAwareInterface
64+ class BackendTreeController
7365{
74- /** @psalm-suppress DeprecatedTrait */
75- use ContainerAwareTrait;
66+ public function __construct (
67+ private ContaoFramework $ framework ,
68+ private RequestStack $ requestStack ,
69+ private TranslatorInterface $ translator ,
70+ private CcaTranslator $ ccaTranslator ,
71+ private EventDispatcherInterface $ eventDispatcher ,
72+ private PickerBuilderInterface $ pickerBuilder ,
73+ ) {
74+ }
7675
7776 /**
7877 * Handles the installation process.
@@ -120,38 +119,23 @@ public function generalTreeUpdateAction()
120119
121120 private function initializeAndExtractRequest (): Request
122121 {
123- $ container = $ this ->container ;
124- assert ($ container instanceof SymfonyContainerInterface);
125-
126- $ framework = $ container ->get ('contao.framework ' );
127- assert ($ framework instanceof ContaoFramework);
122+ $ this ->framework ->initialize ();
128123
129124 /**
130125 * @psalm-suppress InternalMethod
131126 * @var Controller $controller
132127 */
133- $ controller = $ framework ->getAdapter (Controller::class);
128+ $ controller = $ this -> framework ->getAdapter (Controller::class);
134129 $ controller ->loadLanguageFile ('default ' );
135130
136- $ requestStack = $ container ->get ('request_stack ' );
137- assert ($ requestStack instanceof RequestStack);
138-
139- $ currentRequest = $ requestStack ->getCurrentRequest ();
140- assert ($ currentRequest instanceof Request);
131+ $ currentRequest = $ this ->requestStack ->getCurrentRequest ();
132+ if (null === $ currentRequest ) {
133+ throw new BadRequestHttpException ('No request found. ' );
134+ }
141135
142136 return $ currentRequest ;
143137 }
144138
145- private function getTranslator (): TranslatorInterface
146- {
147- $ container = $ this ->container ;
148- assert ($ container instanceof SymfonyContainerInterface);
149- $ translator = $ container ->get ('translator ' );
150- assert ($ translator instanceof TranslatorInterface);
151-
152- return $ translator ;
153- }
154-
155139 /**
156140 * Run the controller and parse get the response template.
157141 *
@@ -167,19 +151,16 @@ private function runBackendTree(Request $request)
167151 {
168152 [, $ treeSelector ] = $ this ->getTemplateData ($ request );
169153
170- $ container = $ this ->container ;
171- assert ($ container instanceof SymfonyContainerInterface);
172-
173154 $ template = new ContaoBackendViewTemplate ('be_main ' );
174155 $ template
175156 ->set ('isPopup ' , true )
176157 ->set ('main ' , $ treeSelector ->generatePopup ())
177158 ->set ('theme ' , Backend::getTheme ())
178- ->set ('language ' , $ container -> get ( ' request_stack ' ) ->getCurrentRequest ()->getLocale ())
159+ ->set ('language ' , $ this -> requestStack ->getCurrentRequest ()? ->getLocale())
179160 ->set (
180161 'title ' ,
181162 StringUtil::specialchars (
182- $ this ->getTranslator () ->trans (
163+ $ this ->translator ->trans (
183164 'treePicker ' ,
184165 ['%table% ' => $ treeSelector ->foreignTable ],
185166 'dc-general '
@@ -219,7 +200,7 @@ private function runBackendTreeBreadCrumb(Request $request)
219200 ->set ('language ' , $ GLOBALS ['TL_LANGUAGE ' ])
220201 ->set (
221202 'title ' ,
222- StringUtil::specialchars ($ this ->getTranslator () ->trans ('treepickerManager ' , [], 'dc-general ' ))
203+ StringUtil::specialchars ($ this ->translator ->trans ('treepickerManager ' , [], 'dc-general ' ))
223204 )
224205 ->set ('charset ' , 'utf-8 ' );
225206
@@ -269,19 +250,11 @@ private function runBackendTreeUpdate(Request $request)
269250
270251 $ modelId = ModelId::fromSerialized ($ picker ->getConfig ()->getExtra ('modelId ' ));
271252
272- $ container = $ this ->container ;
273- assert ($ container instanceof SymfonyContainerInterface);
274- $ translator = $ container ->get ('cca.translator.contao_translator ' );
275- assert ($ translator instanceof CcaTranslator);
276-
277- $ dispatcher = $ container ->get ('event_dispatcher ' );
278- assert ($ dispatcher instanceof EventDispatcherInterface);
279-
280253 $ factory = new DcGeneralFactory ();
281254 $ general = $ factory
282255 ->setContainerName ($ modelId ->getDataProviderName ())
283- ->setTranslator ($ translator )
284- ->setEventDispatcher ($ dispatcher )
256+ ->setTranslator ($ this -> ccaTranslator )
257+ ->setEventDispatcher ($ this -> eventDispatcher )
285258 ->createDcGeneral ();
286259
287260 $ dataProvider = $ general ->getEnvironment ()->getDataProvider ();
@@ -339,18 +312,10 @@ private function getTemplateData(Request $request, bool $valueFromRequest = fals
339312 throw new BadRequestHttpException ('No picker was given here. ' );
340313 }
341314
342- $ container = $ this ->container ;
343- assert ($ container instanceof SymfonyContainerInterface);
344- $ pickerBuilder = $ container ->get ('contao.picker.builder ' );
345- assert ($ pickerBuilder instanceof PickerBuilderInterface);
346- $ picker = $ pickerBuilder ->createFromData ($ getPicker );
315+ $ picker = $ this ->pickerBuilder ->createFromData ($ getPicker );
347316 assert ($ picker instanceof PickerInterface);
348317 $ treeSelector = $ this ->prepareTreeSelector ($ picker );
349- //$session = $container->get('session');
350- $ requestStack = $ container ->get ('request_stack ' );
351- assert ($ requestStack instanceof RequestStack);
352- $ session = $ requestStack ->getSession ();
353- assert ($ session instanceof SessionInterface);
318+ $ session = $ this ->requestStack ->getSession ();
354319 $ sessionBag = $ session ->getBag ('contao_backend ' );
355320 assert ($ sessionBag instanceof AttributeBagInterface);
356321 $ value = $ picker ->getConfig ()->getValue ();
@@ -393,27 +358,14 @@ private function prepareTreeSelector(PickerInterface $picker)
393358 throw new InvalidArgumentException ('The field name contains invalid characters ' );
394359 }
395360
396- $ container = $ this ->container ;
397- assert ($ container instanceof SymfonyContainerInterface);
398-
399- $ requestStack = $ container ->get ('request_stack ' );
400- assert ($ requestStack instanceof RequestStack);
401- $ session = $ requestStack ->getSession ();
402- assert ($ session instanceof SessionInterface);
403-
361+ $ session = $ this ->requestStack ->getSession ();
404362 $ sessionBag = $ session ->getBag ('contao_backend ' );
405363 assert ($ sessionBag instanceof AttributeBagInterface);
406364
407- $ translator = $ container ->get ('cca.translator.contao_translator ' );
408- assert ($ translator instanceof CcaTranslator);
409-
410- $ dispatcher = $ container ->get ('event_dispatcher ' );
411- assert ($ dispatcher instanceof EventDispatcherInterface);
412-
413365 $ itemContainer = (new DcGeneralFactory ())
414366 ->setContainerName ($ modelId ->getDataProviderName ())
415- ->setTranslator ($ translator )
416- ->setEventDispatcher ($ dispatcher )
367+ ->setTranslator ($ this -> ccaTranslator )
368+ ->setEventDispatcher ($ this -> eventDispatcher )
417369 ->createDcGeneral ();
418370
419371 $ definition = $ itemContainer ->getEnvironment ()->getDataDefinition ();
0 commit comments