[gelöst] 6. Arbeiten mit der Datenbank.. Beispiel endet in FatalError

Nachdem das Problem von gestern aus Kapitel 5.2 nicht mehr bestand sollte es rasch weitergehen, aber leider stoße ich nun in Kapitel 6 schon wieder auf ein Problem, welches sich auch nach 2 Stunden Recherche noch nicht beheben lässt…

Das Anlegen des eigenen Repository hatte noch wie beschrieben funktioniert, doch beim Zugriff auf besagtes Repository über „LoremQuestions\Subscriber\Detail“ per

$em = $this->container->get('models');
$repository = $em->getRepository(Question::class);

bekommt man lediglich einen Fatal Error im Frontend

Fatal error: Uncaught Error: Call to a member function get() on null in /home/vagrant/www/shopware/custom/plugins/LoremQuestions/Subscriber/Detail.php on line 27

tauscht man nun

$em = $this->container->get('models');

gegen zum Beispiel so etwas…

$em = Shopware()->Container()->get('models');

oder

$em = Shopware()->Models();

kommt zwar kein FatalError mehr, funktionieren will es aber trotzdem nicht…

 

Schon alles mögliche versucht, aber es will nicht funktionieren… Nach 2 Stunden sieht der Code nun so aus:

	public function onPostDispatchDetail(\Enlight_Event_EventArgs $args) {
		/** @var \Shopware_Controllers_Frontend_Detail $detailController */
		$detailController = $args->getSubject();
		$view = $detailController->View();

		/** @var ModelManager $em */
		//$em = Shopware()->Container()->get('models');
		//$plugin = Shopware()->Container()->get('kernel')->getPlugins()['LoremQuestions'];
		//$controller = $em->getRepository(Question::class);
		//$entityManager->getRepository(Question::class);
		//$em = Shopware()->Models();
		//$repository = $em->getRepository("Repository");
		//$em = $this->container->get('models');
		// $repository = $this->container->get('models')->getRepository(Question::class);
		//$repository = $em->getRepository(Question::class);
		//$repository = Shopware()->Models()->getRepository( __DIR__."/../Models");
		// $repository = Shopware()->Models()->getRepository( $this->getPath() ."/../Models");
		//$repository = Shopware()->Models()->getRepository("/../Models");
		$em = Shopware()->Models();
		$repository = $em->getRepository(Question::class);
		/*
		$articleId = $view->getAssign('sArticle')['articleID'];
		$query = $repository->getQuestionQuery($articleId);
		$result = $query->getArrayResult();
		*/
		$result = array();
		$view->assign('lorem_faq', $result);
	}

 

Aus dem Fatal Error wurden mitlerweile „Es ist ein Fehler aufgetreten“ - Meldungen wie:

Class ‚Repository‘ does not exist in vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/MappingException.php on line 96

oder

Class ‚LoremQuestions\Subscriber\Question‘ does not exist in vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/MappingException.php on line 96

Den Pfad zum Repository anzugeben mit und ohne Dateiname und oder Dateiendung funktioniert genauso wenig…

Darüber hinaus führt die immer wieder beschriebene Pfadangabe „$this->getPath()“ ebenfalls zu einem Fatal Error an dieser Stelle…

Ich könnte das zwar jetzt über den QueryBuilder realisieren, aber das kann ja nicht Sinn der Übung sein, zumal das Repository dann überhaupt nicht genutzt würde…

Noch jemand eine Idee…? …

So, nach ca. 5 Stunden noch immer kein Stück weiter…

Fest steht nun lediglich (nach manigfaltigen Errors), dass es $this unter der Klasse „Detail“ nicht gibt.

Hier kann lediglich mit „$args->“ oder „Shopware->“ gearbeitet werden…

 

Der Code zur Zeit:

 'onPostDispatchDetail'
		];
	}

	public function onPostDispatchDetail(\Enlight_Event_EventArgs $args) {
		/** @var \Shopware_Controllers_Frontend_Detail $detailController */
		$detailController = $args->getSubject();
		$view = $detailController->View();

		/** @var ModelManager $em */
		//use Shopware()->Container()->get('kernel')->getPlugins()['LoremQuestions']->getPath()."/Models" as questions;
		//$em = Shopware()->Container()->get('models');
		//$controller = $em->getRepository(Question::class);
		//$entityManager->getRepository(Question::class);
		//$em = Shopware()->Models();
		//$repository = $em->getRepository("Repository");
		//$em = $this->container->get('models');
		// $repository = $this->container->get('models')->getRepository(Question::class);
		//$repository = $em->getRepository(Question::class);
		//$repository = Shopware()->Models()->getRepository( __DIR__."/../Models");
		// $repository = Shopware()->Models()->getRepository( $this->getPath() ."/../Models");
		//$repository = Shopware()->Models()->getRepository("/../Models");
		//$em = Shopware()->Container()->get('models');
		//die("YOOOOOOOO HERE".print_r($em,true).""); //$repository = $em->getRepository(Question::class);
		// $repository = Shopware()->Models()->getRepository('Shopware\Models\Customer\Customer');
		$path = Shopware()->Container()->get('kernel')->getPlugins()['LoremQuestions']->getPath();
		$path = str_replace("/","\\",$path)."\Models\Question";
		$repository = Shopware()->Models()->getRepository($path);
		/*
		$articleId = $view->getAssign('sArticle')['articleID'];
		$query = $repository->getQuestionQuery($articleId);
		$result = $query->getArrayResult();
		*/
		$result = array();
		$view->assign('lorem_faq', $result);
	}
}

wirft folgendes Ergebnis im Frontend

Class ‚home\vagrant\www\shopware\custom\plugins\LoremQuestions\Models\Question‘ does not exist in vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/MappingException.php on line 96

Mit

$repository = Shopware()->Models()->getRepository("Shopware\Models\Customer");

scheint es auch zu funktionieren, jedoch nicht mit den eigens generierten Models…

 

Das funktioniert übrigends weder mit „\Models“, noch mit „\Models\Question“ oder in sonst einer Kombination…

Daraufhin hatte ich versucht die Models in „LoremQuestions.php“ erst einmal über …

$this->registerCustomModels();

… in der Funktion „install“ zu registrieren, das führt allerdings dazu, dass beim (Re-)Installieren des Plugins das Backend scheinbar nicht mehr aus dem „Installieren…“ hinausspringt und ewig weiterläuft…

 

Im Forum hatte ich ähnliche Fehlermeldungen gefunden, da hieß es lediglich „mach am Besten mal ein PHP-Update, du benutzt ja noch 5.3!“, allerdings wurde mit der Shopware-Vagrant-Box PHP 7.0.2 direkt mitinstalliert, das sollte also nicht das Problem in diesem Fall sein…

 

Ich kann doch nicht die einzige Person sein, die darüber fällt, das scheint mir ein recht fundamentales Problem zu sein :confused:

 

Wooooh! Es hat nun endlich hingehauen (und das nach nur 5 1/2 Stunden! x_X’)

 

Sollte jemand über das gleiche Problem stolpern, hier der funktionierende Code für die Datei „LoremQuestions/Subscriber/Detail.php“ :

 

 'onPostDispatchDetail'
		];
	}

	public function onPostDispatchDetail(\Enlight_Event_EventArgs $args) {
		/** @var \Shopware_Controllers_Frontend_Detail $detailController */
		$detailController = $args->getSubject();
		$view = $detailController->View();

		/** @var \LoremQuestions\Models\Repository $repository */
		$repository = Shopware()->Container()->get('models')->getRepository(questions::class);
		
		$articleId = $view->getAssign('sArticle')['articleID'];
		$query = $repository->getQuestionQuery($articleId);
		$result = $query->getArrayResult();
		
		$view->assign('lorem_faq', $result);
	}
}

 

 

1 „Gefällt mir“