Dependency Injection: Object Manager [Gelöst]

  • 0 x
    25 Beiträge
    0 Hilfreiche Beiträge
    16. 04. 2013, 15:12

    Bei meiner Extension wollte ich zum Erstellen neuer Objekte mit einem Object Manager arbeiten.
    Dazu bin ich in meinem Controller analog zu dem Beispiel von forge.typo3.org vorgegangen. Hier ist noch der Link dazu:
    [url=http://forge.typo3.org/projects/typo3v4-mvc/wiki/Dependency_Injection_%28DI%29]http://forge.typo3.org/projects/typo3v4-mvc/wiki/Dependency_Injection_%28DI%29[/url]

    Mein betroffener Controller sieht folgendermaßen aus:

    1. <?php
    2. namespace TYPO3\Survey\Controller;
    3.  
    4. /**
    5.  *
    6.  *
    7.  * @package survey
    8.  * @license http://www.gnu.org/licenses/gpl.html GNU General Public License, version 3 or later
    9. *
    10. */
    11. class SurveyController extends \TYPO3\CMS\Extbase\Mvc\Controller\ActionController {
    12. /**
    13. * @var Tx_Extbase_Object_ObjectManagerInterface
    14. */
    15. protected $objectManager;
    16.  
    17. /**
    18. * Injects the object manager
    19. *
    20. * @param Tx_Extbase_Object_ObjectManagerInterface $objectManager
    21. * @return void
    22. */
    23. public function injectObjectManager(Tx_Extbase_Object_ObjectManagerInterface $objectManager) {
    24. $this->objectManager = $objectManager;
    25. }
    26.  
    27. /**
    28. * surveyRepository
    29. *
    30. * @var \TYPO3\Survey\Domain\Repository\SurveyRepository
    31. * @inject
    32. */
    33. protected $surveyRepository;
    34.  
    35. /**
    36. * action list
    37. *
    38. * @return void
    39. */
    40. public function listAction() {
    41. $surveys = $this->surveyRepository->findAll();
    42. $this->view->assign('surveys', $surveys);
    43. }
    44.  
    45. /**
    46. * action show
    47. *
    48. * @param \TYPO3\Survey\Domain\Model\Survey $survey
    49. * @return void
    50. */
    51. public function showAction(\TYPO3\Survey\Domain\Model\Survey $survey) {
    52. $newSession = $this->objectManager->create('Tx_Survey_Domain_Model_Session');
    53.  
    54. for ($i = 1; $i <= $survey->getQuestions()->count(); $i++) {
    55. $newAnswer = $this->objectManager->create('Tx_Survey_Domain_Model_Answer');
    56. $newSession->addAnswer($newAnswer);
    57. } }
    58.  
    59. $this->view->assign('survey', $survey);
    60. }
    61.  
    62. }
    63. ?>

    Allerdings wird nun bei einem Aufruf der Seite, auf der das Plugin liegt, folgender Fehler angezeigt:
    Class TYPO3\Survey\Controller\Tx_Extbase_Object_ObjectManagerInterface does not exist

    ReflectionException thrown in file
    C:\xampp\htdocs\prog01\typo3\sysext\extbase\Classes\Object\Container\ClassInfoFactory.php in line 99.

    Ich hoffe, dass mir hierbei jemand weiterhelfen kann, bzw. sagen kann wieso diese Klasse nicht gefunden wird.
    Denn es ist ja keine von mir erstellte Klasse, sondern eine in Extbase bestehende.
    Ich bin für jede Hilfe dankbar!
    Daher schonmal Danke im voraus.

    Mit freundlichen Grüßen
    BjoernBoba


  • 1
  • LuP LuP
    Jedi-Meister
    0 x
    496 Beiträge
    1 Hilfreiche Beiträge
    18. 04. 2013, 14:21

    Hallo,

    wenn Du schon beim namespace bist, solltest Du auch dabei bleiben.

    1. /**
    2.  * @param \TYPO3\CMS\Extbase\Object\ObjectManagerInterface $objectManager
    3.  * @return void
    4.  */
    5. public function injectObjectManager(\TYPO3\CMS\Extbase\Object\ObjectManagerInterface $objectManager) {
    6. $this->objectManager = $objectManager;
    7. }

    VG,
    LuP

  • kainobi kainobi
    Jedi-Ritter
    0 x
    141 Beiträge
    0 Hilfreiche Beiträge
    18. 04. 2013, 16:00

    Übrigens ist der ObjectManager bereits im AbstractController vorhanden, du musst den also hier nicht mehr injecten.

  • 0 x
    25 Beiträge
    0 Hilfreiche Beiträge
    18. 04. 2013, 16:48

    Ja das mit dem Namespace stimmt, das ist nicht einheitlich. Das löst allerdings das Problem nicht.

    Also kann ich den dann einfach mit new ObjectManager() erstellen?

  • LuP LuP
    Jedi-Meister
    0 x
    496 Beiträge
    1 Hilfreiche Beiträge
    18. 04. 2013, 18:41

    [quote="BjoernBoba"]
    Also kann ich den dann einfach mit new ObjectManager() erstellen?
    [/quote]
    nein, auf gar keinen Fall! Immer schön bei der DI bleiben.

    Mir ist vorhin nicht aufgefallen, aber TYPO3 als Vendor-Name darfst Du [u]nicht[/u] in eigener Erweiterung nutzen.

    VG,
    LuP

  • LuP LuP
    Jedi-Meister
    0 x
    496 Beiträge
    1 Hilfreiche Beiträge
    18. 04. 2013, 18:50

    Habe den Post von kainobi übersehen, aber ich stimme ihm zu. Der ObjectManager steht Dir bereits aus dem AbstractController zur Verfügung.

    VG,
    LuP

  • 0 x
    25 Beiträge
    0 Hilfreiche Beiträge
    18. 04. 2013, 22:12

    Wie muss ich denn dann damit verfahren?
    Also wenn ich ihn nicht injecten muss, ihn aber auch nicht mit new erstellen soll.

    Und was heißt als "Vendor-Name"?

    Schonmal vielen Dank für eure bisherigen Antworten :)

  • 0 x
    25 Beiträge
    0 Hilfreiche Beiträge
    19. 04. 2013, 21:13

    Ist gelöst. Vielen Dank für die Antworten :)

  • 1