Dependency Injection bei Utility Classes im ActionController

  • MorphexX MorphexX
    Padawan
    0 x
    46 Beiträge
    0 Hilfreiche Beiträge
    19. 09. 2011, 20:02

    Guten Abend zusammen.

    Seit kurzer Zeit beschäftige ich mich mit dem interessanten Thema der Dependency Injection und komme gerade nicht so recht weiter.

    Kann es sein, dass die Dependency Injection im Extbase ActionController nicht für Utility-Klassen funktioniert?

    1. <?php
    2. /**
    3.  * Foo of the bar
    4.  */
    5. class Tx_Foo_Controller_ContentToolsController extends Tx_Extbase_MVC_Controller_ActionController {
    6.  
    7. /**
    8. * @var Tx_Foo_Utility_Div
    9. */
    10. protected $divObj;
    11.  
    12. /**
    13. * Dependency injection of the Div Object
    14.   *
    15. * @param Tx_Foo_Utility_Div $divObj
    16.   * @return void
    17. */
    18. public function injectDivObj(Tx_Foo_Utility_Div $divObj) {
    19. $this->divObj = $divObj;
    20. }
    21.  
    22. /**
    23. * @return void
    24. */
    25. public function indexAction() {
    26. $this->divObj->fooBar();
    27. }
    28.  
    29. ...
    30.  
    31. }

    Das Resultat im FE lautet: [b]Fatal error: Call to a member function fooBar() on a non-object...[/b]

    Vielen Dank im Voraus, ich bin für jede Hilfe dankbar.
    Einen schönen Abend!


  • 1
  • MorphexX MorphexX
    Padawan
    0 x
    46 Beiträge
    0 Hilfreiche Beiträge
    20. 09. 2011, 17:08

    Ich antworte mir dann einfach einmal selbst. :D
    Das Problem konnte ich derweil wie folgt selbst lösen.

    Zuerst erstelle ich einen abstrakten Controller:

    1. <?php
    2. /**
    3.  * Abstract base controller for the mighty Foo of the bar extension
    4.  */
    5. abstract class Tx_Foo_Controller_AbstractController extends Tx_Extbase_MVC_Controller_ActionController {
    6.  
    7. /**
    8. * Put your helper functions below this useless comment
    9. */
    10.  
    11.  
    12.  
    13. }

    Und dann habe ich meinen ursprünglichen Controller noch einmal bearbeitet und é voilà: Dependency Injection rennt:

    1. <?php
    2. /**
    3.  * Foo of the bar
    4.  */
    5. class Tx_Foo_Controller_BarController extends Tx_Foo_Controller_AbstractController {
    6.  
    7. /**
    8. * @var Tx_Foo_Utility_Div
    9. */
    10. protected $divObj;
    11.  
    12. /**
    13. * Dependency injection of the Div Object
    14.   *
    15. * @param Tx_Foo_Utility_Div $divObj
    16.   * @return void
    17. */
    18. public function injectDivObj(Tx_Foo_Utility_Div $divObj) {
    19. $this->divObj = $divObj;
    20. }
    21.  
    22. /**
    23. * @return void
    24. */
    25. public function indexAction() {
    26. $this->divObj->fooBar();
    27. }
    28.  
    29. ...
    30.  
    31. }

    //Edit: Sorry, ist im zweiten Code-Beispiel nicht so recht ersichtlich. Ich erweitere in Tx_Foo_Controller_BarController nicht mehr Tx_Extbase_MVC_Controller_ActionController, sondern nun meine abstrakte Klasse Tx_Foo_Controller_AbstractController

  • BFSven BFSven
    R2-D2
    0 x
    106 Beiträge
    2 Hilfreiche Beiträge
    07. 12. 2011, 11:47

    Hallo,

    kannst Du Dir irgendwie erklären, wie das zusammenhängen könnte?
    Warum sollte die DI funktionieren nur weil der Controller nun von einem abstrakten Controller erbt?

  • aemka aemka
    Jedi-Ratsmitglied
    0 x
    562 Beiträge
    9 Hilfreiche Beiträge
    08. 12. 2011, 21:31

    DI ist in TYPO3 4.5 nur in Controllern implementiert.
    In TYPO3 4.6 geht es in Controller, Models und Repositories. Kann gut sein, dass es nicht in Utility Classes geht.

    http://www.aemka.de/

  • 1