Zum Inhalt springen

Dependency Injection: Object Manager

Erstellt am 16. April 2013 · 7 Antworten · letzte Antwort am 19. April 2013

Tags: Frage

BjoernBoba ·

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:
http://forge.typo3.org/projects/typo3v4-mvc/wiki/Dependency_Injection_%28DI%29

Mein betroffener Controller sieht folgendermaßen aus:

<?php
namespace TYPO3\Survey\Controller;

/**
 *
 *
 * @package survey
 * @license http://www.gnu.org/licenses/gpl.html GNU General Public License, version 3 or later
*
*/
class SurveyController extends \TYPO3\CMS\Extbase\Mvc\Controller\ActionController {
	/**
	 * @var Tx_Extbase_Object_ObjectManagerInterface 
	 */
	protected $objectManager;

	/**
	 * Injects the object manager
	 *
	 * @param Tx_Extbase_Object_ObjectManagerInterface $objectManager
	 * @return void
	 */
	public function injectObjectManager(Tx_Extbase_Object_ObjectManagerInterface $objectManager) {
		$this->objectManager = $objectManager;
	}

	/**
	 * surveyRepository
	 *
	 * @var \TYPO3\Survey\Domain\Repository\SurveyRepository
	 * @inject
	 */
	protected $surveyRepository;

	/**
	 * action list
	 *
	 * @return void
	 */
	public function listAction() {
		$surveys = $this->surveyRepository->findAll();
		$this->view->assign('surveys', $surveys);
	}

	/**
	 * action show
	 *
	 * @param \TYPO3\Survey\Domain\Model\Survey $survey
	 * @return void
	 */
	public function showAction(\TYPO3\Survey\Domain\Model\Survey $survey) {
		$newSession = $this->objectManager->create('Tx_Survey_Domain_Model_Session');

		for ($i = 1; $i <= $survey->getQuestions()->count(); $i++) {
			$newAnswer = $this->objectManager->create('Tx_Survey_Domain_Model_Answer');
			$newSession->addAnswer($newAnswer);
		}					}
		
		$this->view->assign('survey', $survey);
	}

}
?>

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

LuP ·

Hallo,

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

/**
 * @param \TYPO3\CMS\Extbase\Object\ObjectManagerInterface $objectManager
 * @return void
 */
public function injectObjectManager(\TYPO3\CMS\Extbase\Object\ObjectManagerInterface $objectManager) {
	$this->objectManager = $objectManager;
}

VG,
LuP

kainobi ·

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

BjoernBoba ·

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 ·
BjoernBoba schrieb

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

nein, auf gar keinen Fall! Immer schön bei der DI bleiben.

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

VG,
LuP

LuP ·

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

VG,
LuP

BjoernBoba ·

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 🙂