Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP][SF2][Symfony2]Korzystanie z serwisu poza kontrolerem
Geniesis
post 21.03.2016, 19:57:10
Post #1





Grupa: Zarejestrowani
Postów: 53
Pomógł: 5
Dołączył: 4.12.2013
Skąd: Śląsk

Ostrzeżenie: (0%)
-----


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).
Go to the top of the page
+Quote Post
ohm
post 21.03.2016, 20:44:31
Post #2





Grupa: Zarejestrowani
Postów: 618
Pomógł: 143
Dołączył: 22.12.2010

Ostrzeżenie: (0%)
-----


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');

Ten post edytował ohm 21.03.2016, 20:46:50
Go to the top of the page
+Quote Post
Geniesis
post 22.03.2016, 14:25:44
Post #3





Grupa: Zarejestrowani
Postów: 53
Pomógł: 5
Dołączył: 4.12.2013
Skąd: Śląsk

Ostrzeżenie: (0%)
-----


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ć).
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 28.03.2024 - 16:13