Mappen-structuur OOP applicatie
ik heb al een aantal interessante topics gevonden over de mappen structuur in een (MVC) webapplicatie maar toch geraak ik er nog niet helemaal uit. Ook na het bekijken van de mappen structuur van o.a. Symfony zag ik het licht nog niet.
Laten we beginnen bij het begin, ik heb momenteel deze bestanden in deze structuur:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/lib
/Jds
/Article
/Article.php (Domain-object)
/ArticleMapper.php (Mapper)
/Container
/Container.php (de service container die ik gebruik)
/Services.php (de configuratie van de app die alles in de container steekt)
/Loader
/AutoLoader.php
/Store
/Storage
/DatabaseStorage.php
/PDODatabaseStorage.php
/SessionStorage.php
/User
/User.php (domain object)
/UserMapper.php
/index.php
/Jds
/Article
/Article.php (Domain-object)
/ArticleMapper.php (Mapper)
/Container
/Container.php (de service container die ik gebruik)
/Services.php (de configuratie van de app die alles in de container steekt)
/Loader
/AutoLoader.php
/Store
/Storage
/DatabaseStorage.php
/PDODatabaseStorage.php
/SessionStorage.php
/User
/User.php (domain object)
/UserMapper.php
/index.php
Ik denk dat bijvoorbeeld het mapje User en Article daar niet in horen want dat zijn specifieke objecten bij deze applictie en die horen niet in mijn lib.
Laten we de applicatie dan even uitbreiden om het een beetje realistischer te maken. Er zijn twee acties: login en register. Hiervoor maken we dus een controller en een view aan. Dan komt de lijst er ongeveer zo uit te zien denk ik.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
/lib
/Jds
/Container
/Container.php (de service container die ik gebruik)
/Services.php (de configuratie van de app die alles in de container steekt)
/Loader
/AutoLoader.php
/Store
/Storage
/DatabaseStorage.php
/PDODatabaseStorage.php
/SessionStorage.php
/controller
/login.php
/register.php
/model
/Article
/Article.php (Domain-object)
/ArticleMapper.php (Mapper)
/User
/User.php (domain object)
/UserMapper.php
/view
/login.php
/register.php
/index.php
/Jds
/Container
/Container.php (de service container die ik gebruik)
/Services.php (de configuratie van de app die alles in de container steekt)
/Loader
/AutoLoader.php
/Store
/Storage
/DatabaseStorage.php
/PDODatabaseStorage.php
/SessionStorage.php
/controller
/login.php
/register.php
/model
/Article
/Article.php (Domain-object)
/ArticleMapper.php (Mapper)
/User
/User.php (domain object)
/UserMapper.php
/view
/login.php
/register.php
/index.php
Nu heb ik nog één twijfelgeval. Waar hoort services.php? Misschien toch in een config mapje? Tenslotte is dat een bestand dat ook voor elke applicatie anders is.
Wie brengt raad en tips?
Bedankt!
Jasper
Gewijzigd op 10/01/2013 11:01:51 door Jasper DS
Jasper, waarom jij ook niet je eigen framework schrijven ;-)))
services.php hoort inderdaad in een config mapje, samen met andere configuration files.
Flip -- op 10/01/2013 18:17:27:
misschien vind je PSR-0 interessant
http://phpmaster.com/autoloading-and-the-psr-0-standard/
http://phpmaster.com/autoloading-and-the-psr-0-standard/
Ik gebruik wel die autoloader en de structuur die daar aan de mappen gegeven word komt toch ongeveer overeen met die van mij niet?
@ozzie, dat lijkt me inderdaad een goede oefening.
@wouter, waarom zou jij me dat niet aanraden? Daar leer je toch juist erg veel van?
-------
Toch nog een kleine aanpassing, horen de model, controller en view niet in een mapje app?
Gewijzigd op 11/01/2013 10:35:08 door Jasper DS
Je kan dan gaan werken op een manier die voor jou handig is en waar jij je prettig bij voelt. Het is wel een tijdrovend proces, en je zult jezelf vaak tegenkomen. Maar uiteindelijk wordt het dan wel jouw tool waarmee jijzelf prettig kunt werken. En dat laatste is, wat mij betreft, heel belangrijk. En zoals je zelf al aangeeft, je leerter enorm veel van.
Tevens is het ook meteen een idioot moeilijke klus. Je kunt beter eerst ervaring opdoen met een framework voordat je begint met je eigen framework. Hierdoor kun je inspiratie op doen, ontwikkel je een programmeerstijl en wordt je een betere developer.
Tevens vind ik dat je de laatste tijd veel progress maakt in het maken van applicaties in OO, een framework maken is van compleet andere orde en dat zou ervoor zorgen dat je progress in het maken van OO apps stopt, wat ik erg jammer vind.
Quote:
Toch nog een kleine aanpassing, horen de model, controller en view niet in een mapje app?
Nee, maar wat je tegenwoordig (symfony en zf2) ziet is dat ze models, controllers en views opdelen in bundles.
Ik weet dat het niet makkelijk is maar ik zit in de volgende situatie. Ik heb een opdracht: het maken van een webshop. Nu wil ik dat niet in producerele PHP doen omdat ik vind dat ik al genoeg grote projecten zo heb gemaakt en dat het ook echt gewoon tijd is om OO te gaan werken. Dus ik zou inderdaad met een bestaand framework kunnen gaan werken en dan leer ik hoe ik bepaalde acties moet doen bij dat specifiek framework. Maar eigenlijk wil ik eerst weten wat ik doe en wat er achter de schermen gebeurt voordat ik het ga gebruiken. Ten tweede moet ik héél mijn applicatie kunnen uitleggen. Als ze aan mij vragen waarvoor dient dat bestand uit framework X is de kans erg groot dat ik daar niet op kan antwoorden.
Dus als ik zelf een object georiënteerde webshop kan maken dan pas is het tijd voor andere frameworks.
Morgen ga ik verder met mijn service container in mijn ander topic.
Gewijzigd op 13/01/2013 23:18:12 door Jasper DS
Kijk anders eens naar Silex, zoals al eerder is geopperd.
Niet bang zijn, je kan het!
Wouter J op 11/01/2013 13:41:09:
Nee, maar wat je tegenwoordig (symfony en zf2) ziet is dat ze models, controllers en views opdelen in bundles.
Ik was nog eens bij zend gaan kijken en daar zag ik de map appellation met daarin de mapjes default, blog en news met elk hun eigen MVC-mappen.
Is dat beter dan alle controllers bij elkaar zetten in de map controller, hetzelfde met de views en models?
Als je met bundels gaat werken lijkt het me logisch om al je MVC mappen te gaan scheiden. Anders is het hele principe van een bundel ook verdwenen he ;)
Nicky, volgens mij ben ik het iets groter aan het aanpakken dan wat jij daar hebt. Er moet ruimte zijn voor een map apps (waar models views en controllers inzitten + project gerelateerde bestanden), een map lib die bestaat uit een map met mijn framework (dus de basis die eigenlijk voor elk project hetzelfde is zoals routing, storage klassen, db-adabtors) en andere libs die ik inlaad zoals de Doctrine querybuilder en de symfony Yaml parser. Tot slot is er nog de public map met images , css en js maar die is niet erg belangrijk.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
app/
cache/
... eventuele cache bestanden
config/
... configuratie bestanden
... bootstrap bestanden
src/
... applicatie specifieke code bijv:
Controller/
HelloController.php
templates/
Hello/
default.html.twig
features/
...
vendor/
... libraries, zoals je Framework en Symfony en Doctrine
web/
... publieke code bijv:
assets/
css/
styles.css
index.php
composer.json
phpunit.xml.dist
.gitignore
.travis.yml
.behat.yml
cache/
... eventuele cache bestanden
config/
... configuratie bestanden
... bootstrap bestanden
src/
... applicatie specifieke code bijv:
Controller/
HelloController.php
templates/
Hello/
default.html.twig
features/
...
vendor/
... libraries, zoals je Framework en Symfony en Doctrine
web/
... publieke code bijv:
assets/
css/
styles.css
index.php
composer.json
phpunit.xml.dist
.gitignore
.travis.yml
.behat.yml
Gewijzigd op 07/02/2013 10:42:29 door Jasper DS
De autoloader van Composer is heel erg goed, dus in principe kan je gewoon de Composer-autoloader gebruiken.
Er is wel iets vreemds met composer / git. Ik kan zonder problemen swiftmailer op halen maar als ik symfony/yaml probeer binnen te halen word git plotseling niet meer herkent als opdracht...
Je haalt toch packages binnen via je composer.json config bestand? En om dan vervolgens "composer update" te doen?
Kun je misschien je composer.json bestand laten zien en de complete output uit de console?