Symfony 2.6 - custom class

Symfony 2.6 - custom class
2015-05-23T18:53:37+02:00
2015-05-24T14:15:26+02:00
2022-10-15T22:25:44+02:00
DarkRaptor
Sziasztok!

most kezdtem neki a Symfony2 kitanulásának és egy egyszerű dologban elakadtam. Adott egy controller és egy saját class.

controller:

namespace AppBundle\Controller; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; use Symfony\Bundle\FrameworkBundle\Controller\Controller; use AppBundle\Libraries\Engine; class UrlController extends Controller { public function indexAction($url) { $Engine = new Engine(); $Engine->getLanguageCodeById(1);
class:

namespace AppBundle\Libraries; class Engine { public $DBConnection; public function __construct() { $this->DBConnection = $this->getDBConnection(); } public function getDBConnection() { $em = $this->getDoctrine()->getEntityManager(); $connection = $em->getConnection(); return $connection; }
a problémám az, hogy a saját class-ban a

$this->getDoctrine()->getEntityManager();
kód az alábbi hibaüzenetet dobja:

Attempted to call method "getDoctrine" on class "AppBundle\Libraries\Engine

hogy lehetne azt megoldani, hogy a saját class-on belül is tudjam használni az EntityManagert?

köszönöm!
Mutasd a teljes hozzászólást!
Az elso valaszomban linkeltem a service container-t...

ebben az esetben a //... helyén meg kell adnom egy táblanevet és egy elsődleges kulcs azonosítót (különben hibát dob), pedig nálam pont ez volt a lényeg, hogy ez egy globális class lenne mindenféle adatbázis művelettel, tehát itt különböző táblák is lehetnek.


Teljesen felre erted az orm lenyeget es csak sima mysql wrapper-kent szeretned hasznalni a doctrine-t amit ugyan megtehetsz de nagyon rossz szokas.
Szerintem olvasd at a symfony doksi doctrine-re vonatkozo reszet.
Roviden a lenyeg, hogy ahelyett, hogy asszociativ tombokbe kerdezed le az adatokat a db-bol letrehozol egy Entity osztalyt (pl SiteLanguage) ami csak egy php-s megfeleloje az adatbazisod egy soranak. Majd letrehozol melle egy EntityRepository-t (pl SiteLanguageRepository) ami az entity-hez kapcsolodo lekereseket tartalmazza(pl getAllByLanguage, getAllBySite es amugy nehany alap dolgot orokol eleve az EntityRepository-tol pl getById).
Igy jobban szeparalhatod a kulonbozo modelleket ami jo dolog ellentetben azzal amit szeretnel.
Mutasd a teljes hozzászólást!

  • Nincs definialva a $this->getDoctrine az Engine osztalyon(miert is lenne a UrlController-is a Controller-tol orokli).
    Atpasszolhatod a konstruktorban a controllerbol:
    // controller: $engine = new Engine($this->getDoctrine); //class: class Engine { public $doctrine; public $DBConnection; public function __construct($doctrine) { $this->doctrine = $doctrine; $this->DBConnection = $this->getDBConnection(); } public function getDBConnection() { $em = $this->doctrine->getEntityManager(); $connection = $em->getConnection(); return $connection; }

    De nezz utana a dependency injectionnek es a symfony-s service containernek mert nem jo otlet manualisan peldanyositani a fuggosegeket(new Engine($doctrine)).
    Amugy meg nem ertem, hogy mit szeretnel elerni nem sok ertelme van ennek a kodnak...
    Mutasd a teljes hozzászólást!
  • Az Engine osztályban tárolnám el a globális metódusokat, tehát amiket bármelyik controller használhat. Tegyük föl, hogy van egy nyelvválasztóm minden oldalon és minden oldalnak külön controllere van. A nyelvválasztásnál jön egy id és vissza szeretném kapni az ehhez tartozó language code-ot, azaz:

    public function getLanguageCodeById($language_id) { $statement = $this->DBConnection->prepare("SELECT name FROM site_languages WHERE language_id=:language_id LIMIT 1"); $statement->bindValue("language_id", $language_id); $statement->execute(); $results = $statement->fetchAll(); return $results[0]["name"]; }
    a lényeg az, hogy az Engine egy közös osztály, amit bármelyik controllerből meghívhatok és ezen osztályon belül szükségem lenne adatbázis műveletekre is, de ugyanakkor kell majd session kezelés is és ha az adatbázist nem tudtam elérni az osztályon belül, akkor gyanítom, hogy a sessionkezelő metódusokat se fogom tudni elérni. Erre kéne valami megoldás.

    köszi!
    Mutasd a teljes hozzászólást!
  • Mutasd a teljes hozzászólást!
  • köszönöm a segítséget, de rátaláltam erre a cikkre és nekem pontosan erre volt szükségem (az elfogadott megoldás a lényeg):

    symfony2 - using multiple connections in a repository or class

    tehát a kulcsszó: Service


    Amit Te javasoltál (Custom Repository Classes), az azért nem jó, mert...

    /**
    * @ORM\Entity(repositoryClass="AppBundle\Entity\ProductRepository")
    */
    class Product
    {
    //...
    }

    ebben az esetben a //... helyén meg kell adnom egy táblanevet és egy elsődleges kulcs azonosítót (különben hibát dob), pedig nálam pont ez volt a lényeg, hogy ez egy globális class lenne mindenféle adatbázis művelettel, tehát itt különböző táblák is lehetnek.

    köszönöm a segítséget!
    Mutasd a teljes hozzászólást!
  • Az elso valaszomban linkeltem a service container-t...

    ebben az esetben a //... helyén meg kell adnom egy táblanevet és egy elsődleges kulcs azonosítót (különben hibát dob), pedig nálam pont ez volt a lényeg, hogy ez egy globális class lenne mindenféle adatbázis művelettel, tehát itt különböző táblák is lehetnek.


    Teljesen felre erted az orm lenyeget es csak sima mysql wrapper-kent szeretned hasznalni a doctrine-t amit ugyan megtehetsz de nagyon rossz szokas.
    Szerintem olvasd at a symfony doksi doctrine-re vonatkozo reszet.
    Roviden a lenyeg, hogy ahelyett, hogy asszociativ tombokbe kerdezed le az adatokat a db-bol letrehozol egy Entity osztalyt (pl SiteLanguage) ami csak egy php-s megfeleloje az adatbazisod egy soranak. Majd letrehozol melle egy EntityRepository-t (pl SiteLanguageRepository) ami az entity-hez kapcsolodo lekereseket tartalmazza(pl getAllByLanguage, getAllBySite es amugy nehany alap dolgot orokol eleve az EntityRepository-tol pl getById).
    Igy jobban szeparalhatod a kulonbozo modelleket ami jo dolog ellentetben azzal amit szeretnel.
    Mutasd a teljes hozzászólást!
  • köszönöm, utánaolvasok ezeknek... valóban szebb megoldás lenne így.
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd