login  Naam:   Wachtwoord: 
Registreer je!
 Forum

PHP ORM framework (Opgelost)

Offline Martijn2008 - 16/03/2013 15:28
Avatar van Martijn2008PHP beginner Hallo allemaal,

Ik heb een database gerealiseerd op een MySQL server. De database is gevuld met tabellen, attributen en foreign keys.

Graag zou ik de gehele database willen omzetten naar PHP objecten en properties, zodat ik niet in PHP queries hoef te schrijven. Ik heb gehoord dat dit mogelijk is met een ORM-tool. Weet iemand welke tool ik kan gebruiken en hoe ik dit het beste kan aanpakken?

Alvast bedankt.

Martijn

19 antwoorden

Gesponsorde links
Offline WouterJ - 16/03/2013 20:32
Avatar van WouterJ HTML gevorderde Ik ben een enorme Doctrine2 fan, maar je kunt ook eens kijken naar Propel oid.
Bedankt door: Martijn2008
Offline Martijn2008 - 16/03/2013 20:52 (laatste wijziging 16/03/2013 20:58)
Avatar van Martijn2008 PHP beginner Bedankt voor je antwoord. Ik ben op zoek naar een aanpak die ik snel kan leren, zodat ik de applicatie in rap tempo kan bouwen. Ik zag net dat Doctrine2 ook in Zend Framework kan worden gebruikt, alleen is dat framework naar mijn mening te uitgebreid voor de toepassing die ik wil gaan bouwen. Bovendien, heb ik niet veel ervaring met ZF2. Tips?

Bij Propel zie ik in de manual dat ik alsnog in een xml bestand het design van de database moet uitwerken. Is het niet mogelijk dat dit direct vanuit het DBMS-systeem wordt gelezen? Dat ik enkel een programma hoef uit te voeren. Net als bijvoorbeeld Microsoft LinQ to SQL...
Offline WouterJ - 16/03/2013 23:01
Avatar van WouterJ HTML gevorderde ORM is het mappen van relationele data (de database) naar object data (de entities). Hoe dat gedaan moet worden weet een ORM niet, daarvoor heeft hij een vorm van configuratie nodig. Doctrine2 werkt met Annotations, Xml of Yaml als configuratie en Propel alleen met Xml.

Over frameworks zou ik altijd Symfony2 aanraden. Die wordt in veel meer applicaties gebruikt (bijv. Doctrine2 gebruikt een paar componenten), bevat standaard Doctrine2 en heeft veel betere documentatie (al kan dat een beetje bevooroordeeld zijn, aangezien ik een Core Documtation team member ben...)
Offline Martijn2008 - 17/03/2013 15:51 (laatste wijziging 17/03/2013 23:47)
Avatar van Martijn2008 PHP beginner Hoe ben je Core Documtation team member geworden?
Bevooroordeeld of ben je gewoon een PRO met Symfony2?

Ik heb gekozen voor PropelORM voor entities. Inmiddels heb ik de entities werkend. Van een bestaande database heb ik de entities gegenereerd. Dat was echt super simpel, een paar regels code, in de terminal van Ubuntu.

Terugkomend op jouw voorstel om het Symfony2 Framework te gebruiken, is dat net zo simpel en snel als het genereren van de entities van die database? Ik wil namelijk snel, zeer snel een applicatie in elkaar fabrieken. De database die ik gebruik bestaat uit 15 tabellen, is het bijvoorbeeld mogelijk om van die tabellen automatisch 15 CRUD-controllers te genereren. Dat er enkel nog een paar zaken hoeven te worden bijgeschaafd? Dat zou namelijk wel relaxt zijn..
Offline WouterJ - 18/03/2013 08:57
Avatar van WouterJ HTML gevorderde Als je doctrine2 gebruikt in Symfony2 dan kun je het generate:doctrine:crud command gebruiken die automatisch een CRUD controller maakt (meer info: http://symfony...._crud.html )
Bedankt door: Martijn2008
Offline Martijn2008 - 18/03/2013 13:07 (laatste wijziging 18/03/2013 15:51)
Avatar van Martijn2008 PHP beginner Super, dat is precies wat ik zoek. Ik ga vanmiddag kijken of ik het werkend kan krijgen. Bedankt!

Symphony2 heb ik nu werkend. Ziet er nice uit, vooral die status/settings bar op de demo page met informatie over het aantal gedraaide queries, parsetime, geheugen gebruik, debug mode etc. Duidelijke en korte documentatie trouwens, dat scheelt veel leeswerk .

Als ik het goed begrijp kan ik met die link die je stuurde de controllers genereren. Ik zoek nog een functie om van mijn bestaande database een ORM te genereren, zoiets als dit van Propel. Kan ik Propel laten samenwerken met Symphony2 of zal ik moeten overstappen naar Doctrine2? Of begreep ik je daarnet verkeerd?

Inmiddels geprobeerd de entities te genereren voor DOCTRINE2. Ik volg deze tutorial. Met de database uit de tutorial wordt de xml wel gegenereerd, echter gebruik ik mijn database en niet die van de tutorial, dit geeft de volgende foutmelding:

  1. [Doctrine\DBAL\DBALException]
  2. Unknown database type bit requested, Doctrine\DBAL\Platforms\MySqlPlatform
  3. may not support it.


Op dat probleem heb ik gegoogled en heb de volgende mogelijke oplossing gevonden, alleen die werkt niet. Zelfde foutmeling!
Inmiddels heb ik dit kunnen oplossen door datatype te veranderen van BIT naar BOOLEAN.

Volgend issue. Deze regel code:

  1. php app/console doctrine:mapping:import AcmeBlogBundle annotation


geeft deze foutmelding:

  1. [InvalidArgumentException]
  2. Bundle "AcmeBlogBundle" does not exist or it is not enabled. Maybe you forg
  3. ot to add it in the registerBundles() method of your AppKernel.php file?

Weet je toevallig hoe ik die fix?
Offline WouterJ - 18/03/2013 16:20
Avatar van WouterJ HTML gevorderde
Citaat:
Kan ik Propel laten samenwerken met Symphony2 of zal ik moeten overstappen naar Doctrine2? Of begreep ik je daarnet verkeerd?

Je kan ook met Propel werken. Symfony heeft geen echte DB layer. Het komt standaard met Doctrine2, maar je kan alles gebruiken wat je wilt.

Die command die ik net gaf is alleen maar voor Doctrine2. De PropelBundle komt wel met wat andere commands, maar niet met een CRUD generate command.

Citaat:
Weet je toevallig hoe ik die fix?

Ga naar /app/AppKernel.php, zoek de registerBundles method en voeg in de $bundles array jouw bundle toe, zoals ook uitgelegd is in de documentatie: http://symfony....ation.html (het is verstandig om eerst de book articles te lezen, deze vormen de basis van al je Symfony kennis, de cookbook articles zijn allemaal leuke 'tips and tricks' articles)
Offline Martijn2008 - 18/03/2013 19:55 (laatste wijziging 18/03/2013 21:34)
Avatar van Martijn2008 PHP beginner Haha, je hebt al de nodige ervaring zo te zien. Ik kom steeds verder.. de module is aangemaakt met routing etc. Inmiddels loop ik tegen een issue aan om de CRUD- controller te genereren aan de hand van mijn entity.

  1. [Doctrine\ORM\Mapping\MappingException]
  2. Class "Acme\BlogBundle\Entity\" is not a valid entity or mapped supe
  3. r class.


Dezelfde als deze, maar jammer genoeg geen oplossing.

Overigens, nog een vraagje, bij het genereren van die CRUD-controller krijg ik de volgende vraag: Wat wordt doet : Post achter die module naam? Ik kan dat niet zo snel ergens terugvinden..
Antwoord: Het is de tabel naam. Het probleem is daarmee dus ook opgelost. Modulenaam:Tabelnaam

  1. Welcome to the Doctrine2 CRUD generator
  2.  
  3. This command helps you generate CRUD controllers and templates.
  4.  
  5. First, you need to give the entity for which you want to generate a CRUD.
  6. You can give an entity that does not exist yet and the wizard will help
  7. you defining it.
  8.  
  9. You must use the shortcut notation like AcmeBlogBundle:Post.
  10.  
  11. The Entity shortcut name:


Cool. Ik heb nu CRUD-controllers werkend!!! Nu moet ik de velden nog kunnen customizen. De aanmaakdatum van een record geef je bijvoorbeeld niet op met 3 dropdownboxen, dat automatisch te gebeuren. Welke IDE gebruik je eigenlijk? NetBeans lijkt niet goed overweg te kunnen met namespaces.

Goede tip trouwens om Symphony icm Doctrine te gebruiken. Je kan echt super snel een app maken!
Offline WouterJ - 18/03/2013 23:10
Avatar van WouterJ HTML gevorderde
Citaat:
Haha, je hebt al de nodige ervaring zo te zien.

Het mooie van veel aan de documentatie werken is dat je weet waar je alles kan vinden, dat helpt heel erg als je andere mensen moet helpen 

Citaat:
De aanmaakdatum van een record geef je bijvoorbeeld niet op met 3 dropdownboxen, dat automatisch te gebeuren.

Als dit ook een vraag is. Kijk eens naar livecycle callbacks in entities, bijv. het PrePersist event. Hiermee kun je dan makkelijk de aanmaakdatum instellen:
  1. <?php
  2.  
  3. namespace Acme\DemoBundle\Entity\Post;
  4.  
  5. use Doctrine\ORM\Mapping as ORM;
  6.  
  7. /**
  8.  * @ORM\Entity
  9.  * @ORM\HasLiveCycleCallbacks
  10.  */
  11. class Post
  12. {
  13. /**
  14.   * @ORM\Column(type="datetime")
  15.   */
  16. private $creationDate;
  17.  
  18. // ...
  19.  
  20. /**
  21.   * @ORM\PrePersist
  22.   */
  23. public function setCreationDate()
  24. {
  25. $this->creationDate = new \DateTime();
  26. }
  27. }


Of gebruik Doctrine extensions (timestampable) icb met de StofDoctrineExtentionsBundle:
  1. <?php
  2.  
  3. namespace Acme\DemoBundle\Entity\Post;
  4.  
  5. use Gedmo\Mapping\Annotation as ORMExt;
  6. use Doctrine\ORM\Mapping as ORM;
  7.  
  8. /**
  9.  * @ORM\Entity
  10.  * @ORM\HasLiveCycleCallbacks
  11.  */
  12. class Post
  13. {
  14. /**
  15.   * @ORMExt\Timestamplable(on="create")
  16.   * @ORM\Column(type="datetime")
  17.   */
  18. private $creationDate;
  19. }


Citaat:
Welke IDE gebruik je eigenlijk?

Ik gebruik geen IDE, gewoon de lekker krachtige maar zeer simpele Vim. (je moet er wel van kunnen houden, niet iedereen kan dat)

En oh ja, het is Symfony niet Symphony. Symphony was de naam van versie 1, versie 2 heet gewoon symfony.
Offline Stijn - 19/03/2013 00:09
Avatar van Stijn PHP expert @WouterJ: ben ook wat frameworks aan het doornemen en mijn twijfel valt zo tussen het nieuwe ZF2 en Symfony2. Maar het lijkt dat Symfony zo log en zwaar is. Al die library's die meekomen of zie ik dat fout?
Offline Martijn2008 - 19/03/2013 01:21 (laatste wijziging 19/03/2013 01:21)
Avatar van Martijn2008 PHP beginner
Stijn schreef:
@WouterJ: ben ook wat frameworks aan het doornemen en mijn twijfel valt zo tussen het nieuwe ZF2 en Symfony2. Maar het lijkt dat Symfony zo log en zwaar is. Al die library's die meekomen of zie ik dat fout?


Dat valt volgens mij reuze mee. Voornamelijk ligt het aan de eisen en wensen die je aan het framework stelt. Ik wil bijvoorbeeld snel een paar formuliertjes en overzichten genereren. Tot op heden gaat dat vrij snel en gemakkelijk, met dank aan WourterJ voor zijn advies en ondersteuning.

Met een paar regels code in de terminal van Ubuntu kan ik een groot deel van het werk door het framework laten uitvoeren, echter de laatste regels code moet ik toch zelf tikken. Dat levert soms nog wel is wat problemen op, bijvoorbeeld met joins. Waardes uit een join moeten bijvoorbeeld in een dropdownlist worden ingeladen.


Offline WouterJ - 19/03/2013 11:19 (laatste wijziging 08/04/2013 16:57)
Avatar van WouterJ HTML gevorderde Stijn, ik vind het altijd leuk om te horen dat mensen Symfony2 log en zwaar vinden. Zend Framework is namelijk nog veel groter en bied veel minder kans tot het "minder log maken".

Ik weet niet of je je een beetje hebt verdiept in de Symfony2 Internals, maar in principe is het framework opgebouwd uit allemaal losse components die je ook los in je project kunt gebruiken. Het framework heeft dan een FrameworkBundle die al deze components samenvoegt tot een framework.
Het mooie hieraan is dat je heel veel dingen ook in kleine applicaties kunt gebruiken. Ik gebruik zelden het hele framework, vaak slechts een paar componenten.
Je ziet in de PHP wereld ook heel veel applicaties terug met Symfony2 componenten. Ik noem er maar een paar: phpunit, composer, phpbb, drupal8, laravel, behat, ect.

Symfony2 heeft een mooie gedachte van 'niet het wiel opnieuw uitvinden'. Zo laten ze bijv. het loggen over aan Monolog, mag je de database zelf invullen (waarbij ze standaard Doctrine2 meeleveren) en laten ze het mailen aan SwiftMailer en de templating aan Twig over.
Dit kan log over komen, maar ZF heeft dit allemaal in zijn eigen framework gestopt, wat dus het core framework veel groter maakt.

Als ik een Symfony2 applicatie begin sloop ik altijd eerst heel wat dingen eruit. Die JMS*Bundles zijn leuk, maar niet echt nodig. SwiftMailer gebruik ik zelden, ect. Hierdoor biedt het Symfony2 framework je veel mogelijkheid tot het zelf aanpassen en het verkleinen. Je kan het zelfs heel erg verkleinen tot een microframework als Silex.

Symfony2 doet ook veel aan caching. Alleen het allereerste bezoek van de allereerste bezoeker duurt een tijdje (maar dat is toch vaak de developer), daarna is er zoveel gecached dat bijna het hele framework wordt overgeslagen en alleen de cache bestanden worden uitgelezen.

Nog wat andere punten heb ik hier geschreven: http://www.phph...27/#639145
Bedankt door: Stijn, Abbas, Martijn2008
Offline Martijn2008 - 19/03/2013 13:15 (laatste wijziging 20/03/2013 00:03)
Avatar van Martijn2008 PHP beginner
WouterJ schreef:
(...)

Symfony2 heeft een mooie gedachte van 'niet het wiel opnieuw uitvinden'. Zo laten ze bijv. het loggen over aan Monolog, mag je de database zelf invullen (waarbij ze standaard Doctrine2 meeleveren) en laten ze het mailen aan SwiftMailer en de templating aan Twig over.

(...)


Dat vind ik een mooie gedachte. Als 1 ding vaak overschat wordt, dan is dat wel het wiel opnieuw uitvinden.
Ik zou het om die reden bijvoorbeeld handig vinden als wij ons als community focussen op 1 PHP Framework en 1 IDE. Dan kunnen we elkaar nog beter helpen, doordat we elkaars situatie beter kunnen inbeelden.

Gisteren ben ik bijvoorbeeld in Netbeans een Symphony2 project gestart. Ik kon geen nieuwe regel code tikken, doordat Netbeans blijkbaar niet goed functioneert met PHP namespaces. Nu mis ik de intelligence van de IDE, doordat ik nu met een notepad achtige tool werk. Intelligence werkt echt super in Microsoft Visual Studio, echter wil ik nu een applicatie ontwikkelen die zowel op Windows als Linux werkt, vandaar is de keus op PHP gevallen. Als iedereen dezelfde IDE zou gebruiken dan zou dat probleem snel zijn op te lossen. Hetzelfde zou gelden als we voor 1 Framework zouden kiezen.

Hoe denken jullie daarover?

Ik heb nu
1 database: Community (met 2 tabellen: Role en User)
1 Symfony module: CommunityBundle (met 2 controllers: Role en User)

Mijn database ziet er als volgt uit:

  1. CREATE TABLE Role
  2. (
  3. Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  4. Name VARCHAR(255) NOT NULL
  5. )ENGINE=InnoDB;
  6.  
  7. CREATE TABLE User
  8. (
  9. Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  10. FK_RoleID INT NOT NULL,
  11. Firstname VARCHAR(50) NOT NULL,
  12. Lastname VARCHAR(50) NOT NULL,
  13. DayOfBirth DATETIME NOT NULL,
  14. Email VARCHAR(255) NOT NULL,
  15. Password VARCHAR(50) NOT NULL,
  16. CreatedOn TIMESTAMP NOT NULL DEFAULT NOW(),
  17. IP VARCHAR(50) NOT NULL,
  18. CONSTRAINT FOREIGN KEY (FK_RoleID) REFERENCES Role(Id) ON UPDATE CASCADE ON DELETE CASCADE
  19. )ENGINE=InnoDB;


Controller Role werkt perfect, echter controller User geeft een foutmelding op het moment als er 1 record in tabel Role staat:

  1. A "__toString()" method was not found on the objects of type "Proxies\__CG__\Acme\CommunityBundle\Entity\Role" passed to the choice field. To read a custom getter instead, set the option "property" to the desired property path.


Ik heb op die error gegoogled, inmiddels weet ik dat er een custom dropdownlist zal moeten worden geschreven. Alleen ik heb geen idee waar en hoe. Bij het toevoegen en bewerken van een gebruiker wil ik een dropdownlist met een overzicht van alle role namen, welke in tabel user opgeslagen worden met het RoleID.

Opgelost
Volgende code toegevoegd aan class RoleType

  1. public function __toString()
  2. {
  3. return $this->getName();
  4. }


Trouwens, kan ik ook bestanden met Doctrine in m'n database zetten? Dat ik ook daarvoor een CRUD-controller genereer?
Offline cloudstrife - 21/03/2013 07:50
Avatar van cloudstrife PHP beginner Bekijk yii eens. Hiermee kan je op basis van je tabellen crud objecten genereren alsook de nodige forms. Heel makkelijk om aan te passen en in te stappen en bovendien heel wat plugins die het leven echt makkelijker maken.
Bedankt door: Martijn2008
Offline Martijn2008 - 21/03/2013 13:00 (laatste wijziging 21/03/2013 13:26)
Avatar van Martijn2008 PHP beginner
cloudstrife schreef:
Bekijk yii eens. Hiermee kan je op basis van je tabellen crud objecten genereren alsook de nodige forms. Heel makkelijk om aan te passen en in te stappen en bovendien heel wat plugins die het leven echt makkelijker maken.


Gaaf. Bedankt voor de tip! Ik heb al mijn keus gemaakt, Symfony2. Intussen ben ik begonnen met bouwen van de applicatie en heb absoluut geen spijt van mijn framework keus. Met Symfony2 kun je ook entities en CRUD-controllers genereren op basis van een al reeds bestaande database.

Gezien de actieve behulpzame community, de duidelijke documentatie en de eenvoud van Symfony ben ik niet snel van plan over te stappen, mede doordat ik dan weer opnieuw een X-framework zal moeten bestuderen. Bovendien hoef ik weinig regels code te tikken en kan daardoor snel een functionele applicatie in elkaar zetten. Hier< en >daar soms wat aanpassen.

Maar, misschien bouw ik een volgende applicatie wel met het Yii Framework, echter dan zou je me moeten overtuigen, waarom ik voor Yii zou moeten kiezen en niet voor Symfony2 framework? Heeft Yii soms iets wat Symfony2 niet heeft of kan?
Offline cloudstrife - 21/03/2013 19:12
Avatar van cloudstrife PHP beginner Ik zelf ken Symfony niet... Dus uit mijn standpunt vergelijken is moeilijk. Ff google dus: http://vschart.com/compare/yii/vs/symfony

Blijkbaar goed vergelijkbaar met iets meer features in symfony.

Ik ken redelijk wat php en programming in het algemeen maar heb geen zin om uren te spenderen aan het lezen van een manual. Ik ontdek liever iets al doende en met Yii is dit vrij goed gegaan. Unzip, ff een hello world tutorial zoeken en ik was vertrokken. Het leuke was dat ik op enkele uurtjes al een heel mooi resultaat had. Bv: pagination toevoegen: ff parametertje aanpassen, regeltje toevoegen in template en hub het werkt, idem met wysiwyg editor, crud operations, etc.... en wil je toch dat ietsje meer is alles makkelijk aan te passen of uit te breiden. En bovendien ook een goede actieve community en uitgebreide documentatie.

Het leuke aan zo een framework is dat je heel wat lastige zaken voor je kan laten doen en toch mooi controle houdt over je code.
Offline Martijn2008 - 21/03/2013 20:13
Avatar van Martijn2008 PHP beginner Inderdaad, controle houden over de code is belangrijk. Wat heb je al zoal voor apps gebouwd?
Offline Joost - 21/03/2013 20:19
Avatar van Joost PHP expert Allereerst: er bestaat niet zoiets als dat framework X beter is dan framework Y. Elk framework heeft zijn eigen plussen en minnen en dit hangt vaak ook nog af wat je als gebruiker wil of fijn vindt werken. Voordat je echter weet of X je beter ligt dan Y ben ik van mening dat je toch wel enkele redelijke applicaties moet hebben gebouwd in beide frameworks om een goed beeld te hebben.

Ik heb zelf enkele webapplicaties gemaakt met Yii, en ben daar zeker tevreden over. Ik kan je dus ook wel aangeven wat ik goed vind aan Yii. Ik heb nog nooit met Symfony gewerkt, dus een vergelijking kan ik je niet echt geven. Misschien dat ik binnenkort eens een projectje probeer. Het spreekt me namelijk wel aan, meer dan andere frameworks.

De algemene pluspunten - goede documentatie, een actieve community - gelden volgensmij voor elk groter webframework. Ik vind de documentatie van Yii goed. Ze hebben een "definitive guide" waar veel van de basiselementen duidelijk worden uitgelegd, zodat je snel kan beginnen met je eerste applicatie. De API documentatie is ook duidelijk en informatief. Yii heeft een redelijk actieve community, maar die zal waarschijnlijk niet zo groot zijn als die van Symfony. Als ik echter een vraag heb krijg ik vrijwel altijd snel antwoord op hun forum.

Ik vermoed wel de learning curve voor Yii iets minder stijl is dan die van Symfony. Voordeel voor Symfony is dan weer dat, indien je Symfony volledig beheerst, ik vermoed dat je daar een krachtiger framework mee hebt.

Yii heeft als nadeel - of misschien juist als voordeel - dat het wat minder volwassen is dan Symfony. Dit kan nadelig zijn omdat er nog wat kinderziektes in kunnen zitten, maar voordelig omdat er makkelijk vernieuwd kan worden.

Ik vind de code generator van Yii fijn werken om snel mee te starten, die is ook makkelijk aan te passen zodat de gegenereerde code meer naar jouw stijl is. Je kan ook makkelijk externe componenten inladen. Maar daar zal Symfony ook wel iets voor hebben, lijkt me.

Waarvoor Yii wel veel geprezen wordt is de snelheid tov Symfony. Dit was voor mij ook wel een van de redenen om in eerste instantie te kiezen voor Yii. Zie voor een bijvoorbeeld http://www.devs...or-Speed/2/
Offline Martijn2008 - 21/03/2013 22:30
Avatar van Martijn2008 PHP beginner Volgens die test is Symfony inderdaad minder snel met het genereren van pagina's. Wel geinig om te weten dat er best wel grote verschillen zijn kwa executietijd tussen de diverse frameworks.

Ik heb voordat ik begon met bouwen ook gekeken naar de doelgroep van de applicatie, die is tamelijk klein, daarom heb ik gekozen voor een framework waarmee ik vlot kan werken.

Vandaar zou ik ontwikkel- en executie tijd los bekijken, beide beslaan kwaliteitsaspect efficiëntie. Andere kwaliteitsaspecten blijven in die benchmark achterwegen, zoals bijvoorbeeld onderhoudbaarheid (mappen/code structuur) en betrouwbaarheid.
Gesponsorde links
Je moet ingelogd zijn om een reactie te kunnen posten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.273s