Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][SF2][Symfony2]Korzystanie z serwisu poza kontrolerem
Forum PHP.pl > Forum > PHP > Frameworki
Geniesis
Witam, mam dosyć banalny problem:
chcę wywoływać zapytania z poziomu modelu zamiast kontrolera, oczywiście w kontrolerze nie jest to problem, ponieważ mamy metodę getDoctrine().
Jako, że wywoływanie owego obiektu zamierzam używać w wielu modelach postanowiłem utworzyć obiekt ParentModel z którego będą poszczególne dziedziczyć.

przykład:
  1. class DefaultController extends Controller
  2. {
  3. public function indexAction()
  4. {
  5. $defaultModel = new DefaultModel(); //linia 13
  6. // $sectionList = $defaultModel->getAllSections();

DefaultModel:
  1. class DefaultModel extends ParentModel
  2. {
  3. public function getAllSections()
  4. {
  5. $qb = $this->em->createQuery('SELECT ts FROM UserBundle\Entity\TopicSections ts');
  6. return $qb->getResult();
  7. }

ParentModel:
  1. class ParentModel
  2. {
  3. protected $em;
  4.  
  5. public function __construct(EntityManager $em)
  6. {
  7. $this->em = $em;
  8. }

Services.yml:
  1. services:
  2. userbundle.model.parent_model:
  3. class: UserBundle\Model\ParentModel
  4. arguments: [ @doctrine.orm.entity_manager ]


Wg tego co znalałem w internecie wszystko powinno ładnie działać: routing wywołuje kontroler, w kontrolerze tworzę instancję obiektu, który w rodzicu tworzy $em, który jest niezbędny do zapytań, ale (oczywiście) tak nie jest.
  1. Catchable Fatal Error: Argument 1 passed to UserBundle\Model\ParentModel::__construct() must be an instance of Doctrine\ORM\EntityManager, none given, called in /var/www/forum/src/UserBundle/Controller/DefaultController.php on line 13 and defined


Tutaj pytanie: co w poszczególnych krokach zrobiłem źle, że pojawia się owy błąd zamiast poprawnie wykonać kod? (Czy fakt dodania wpisu w service nie powinien powodować uniknięcie owego błędu?)
Chcę unikać przekazywania z kontrolera $em do modelu.

Tutaj mam jeszcze rozkwinę odnośnie działania Symfony:
Jeżeli framework szczyci się MVC to dlaczego zapytania domyslnie możemy tworzyć w kontrolerze? (Do tej pory zawsze spotykałem się z strukturą: kontroler wywołuje metodę z modelu w której jest owo zapytanie składane, model zwraca gotowe dane do kontrolera).
ohm
Cytat(Geniesis @ 21.03.2016, 19:57:10 ) *
Tutaj mam jeszcze rozkwinę odnośnie działania Symfony:
Jeżeli framework szczyci się MVC to dlaczego zapytania domyslnie możemy tworzyć w kontrolerze? (Do tej pory zawsze spotykałem się z strukturą: kontroler wywołuje metodę z modelu w której jest owo zapytanie składane, model zwraca gotowe dane do kontrolera).


To tak, symfony2(/3) nigdy nie był definiowany jako framework MVC, sam twórca o tym wspomina
http://fabien.potencier.org/what-is-symfony2.html

Kolejna rzecz, to owszem, możesz sobie tworzyć zapytania w kontrolerze (taka swoboda), ale raczej powinieneś tworzyć je w Repository. Model, a raczej Entity, służy do mapowania danych z bazy (i w drugą stronę). Resztę logiki powinieneś zawrzeć w kontrolerze (i ewentualnie poszczególnych serwisach)

Przejrzyj sobie przykładowe demo https://github.com/symfony/symfony-demo i powinieneś mniej więcej zrozumieć logikę symfony.


Apropos Twojego kodu, to musiałbyś DefaultModel zarejestrować jako service i wstrzykiwać mu EntityManagera, wtedy w kontrolerze możesz sobie pobrać serwis przez $this->get('userbundle.model.default_model');
Geniesis
Dzięki za wyjaśnienie oraz linki, w końcu przeskoczyłem ten błąd w rozumowaniu i wszystko stało się znacznie jaśniejsze (finalnie zapytania przeniosłem do NazwaEncjiRepository, utworzyłem folder utils, którego pliki po przez serwis można odczytywać).
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.