cms meerdere websites
Ik ga beginnen met het maken van een eigen cms / framework.
Nu wil ik gaan werken met 3 "secties". Klinkt misschien onduidelijk, maar hopelijk spreekt de uitleg voor zich.
1. in het "www" gedeelte van de server zet ik een aantal bestanden: index.php en images en dergelijke. Met uitzondering van index.php, komen in deze directory (vrijwel) geen php bestanden te staan (uit veiligheidsoverwegingen).
2. in het privé gedeelte van de server maak ik een directory en hier komen de project specifieke bestanden in te staan. Denk aan het mvc model: models, controllers, views... maar dan SPECIFIEK voor het betreffende project / de betreffende website.
3. in het privé gedeelte van de website maak ik nog een directory en hierin komt het framework / cms te staan, denk aan een library en aan het mvc model, maar dan SPECIFIEK voor het framework en cms.
In een schemaatje krijg je dan bijvoorbeeld zoiets:
Code (php)
1
2
3
4
2
3
4
/rootvanserver/bestanden/www/index.php
/rootvanserver/bestanden/www/images/
/rootvanserver/bestanden/project1/
/rootvanserver/bestanden/frameworkcms/
/rootvanserver/bestanden/www/images/
/rootvanserver/bestanden/project1/
/rootvanserver/bestanden/frameworkcms/
Nu zat ik me te bedenken dat het best zo zou kunnen zijn dat er een 2e project komt. Eigenlijk zou het dan raar zijn als ik voor dat 2e project een nieuwe directory zou maken waarin ik nogmaals het framework / cms zou plaatsen. Waarom zou project 2 immers niet gebruik kunnen maken van hetzelfde framework / cms als project 1? Het schemaatje zou er dan als volgt uit zien:
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
/rootvanserver/bestanden/www/index.php
/rootvanserver/bestanden/www/images/
/rootvanserver/bestanden/www/project2/index.php
/rootvanserver/bestanden/www/project2/images/
/rootvanserver/bestanden/project1/
/rootvanserver/bestanden/project2/
/rootvanserver/bestanden/frameworkcms/
/rootvanserver/bestanden/www/images/
/rootvanserver/bestanden/www/project2/index.php
/rootvanserver/bestanden/www/project2/images/
/rootvanserver/bestanden/project1/
/rootvanserver/bestanden/project2/
/rootvanserver/bestanden/frameworkcms/
Nu vraag ik me alleen af hoe het framework weet of hij wordt aangeroepen door project 1 of door project 2? Als het even kan dan wil ik niet handmatig in een configuratiebestandje een website id hoeven in te vullen of iets dergelijks. Ik wil eigenlijk dat dat allemaal automatisch door het framework geregeld wordt. Dus het framework ziet, hé een nieuw project... voor dit project maak ik een nieuw id aan in de database. Als je dan vervolgens via de browser dat project aanroept dan moet het framework op de een of andere manier herkennen dat het om project 1 of project 2 gaat. Maar hoe? Misschien aan de hand van de url, maar dat lijkt me lastig omdat het domein hetzelfde is... project 1 is www.mijnsite.nl en project2 is www.mijnsite.nl/project2. Heeft iemand een goede suggestie hoe ik dit het beste kan aanpakken?
/rootvanserver/application/controllers voor project1
/rootvanserver/application/controllers/project2 voor project2
Of je begint met het maken in plaats van al dat groot denken, weinig doen. Hoeveel maanden zeg je nu al niet dat je begint met het maken van je CMS/framework? Ben zelf ook een denker, wil het ook graag allemaal goed doen, maar soms moet je gewoon die knop om kunnen zetten.
Wat is HMVC? Daarnaast stel ik gewoon een vraag hoe ik iets moet oplossen en daar geef je geen antwoord op. Ik kan dus niks met jouw antwoord.
http://en.wikipedia.org/wiki/Presentation-abstraction-control
Hierarchical-Model-View-Controller (HMVC)
Ikzelf zit ook te denken aan een nieuwe CMS die ik 'from scratch af' ga bouwen, waarbij de core, alle classes e.d. buiten de webroot vallen. Ikzelf ga in de config dan bepalen staat binnen de webroot. welke classes map hij gebruikt. Zo kan je op die manier in de configuratie bepalen welke versie van je CMS te wilt gebruiken. Desnoods kan je zelfs 'forken'...
Hierarchical-Model-View-Controller (HMVC)
Quote:
A variation of MVC similar to PAC was published in an article[2] in JavaWorld Magazine, the authors apparently unaware[3] of PAC which was published 13 years earlier. The main difference between HMVC and PAC is that HMVC is less strict in that it allows the view and model of each agent to communicate directly, thus bypassing the controller.
The Controller has some oversight. The Controller selects the Model and then selects the View, so there is an approval mechanism by the Controller. The Model prevents the View from accessing the data source directly.
The Controller has some oversight. The Controller selects the Model and then selects the View, so there is an approval mechanism by the Controller. The Model prevents the View from accessing the data source directly.
Ikzelf zit ook te denken aan een nieuwe CMS die ik 'from scratch af' ga bouwen, waarbij de core, alle classes e.d. buiten de webroot vallen. Ikzelf ga in de config dan bepalen staat binnen de webroot. welke classes map hij gebruikt. Zo kan je op die manier in de configuratie bepalen welke versie van je CMS te wilt gebruiken. Desnoods kan je zelfs 'forken'...
www.mijnsite.nl en het andere project staat in een subfolder www.mijnsite.nl/subfolder/. Nu wil ik dat beide projecten draaiten op één en hetzelfde framework. Beide projecten moeten dus connecten met het framework. Mijn vraag is... hoe weet het framework of hij door project 1 of door project 2 is aangeroepen (zodat het framework de juiste instellingen, gebruikers etc. kan inladen)?
@Aar: ik weet niet of ik mijn vraag helemaal duidelijk gesteld heb. Maar stel ik heb 2 projecten (/websites) op 1 domein. Eén project staat gewoon in de root op Ozzie PHP op 04/08/2011 21:55:41:
Wat is HMVC?
Een beetje googlen van tijd tot tijd kan toch ook geen kwaad? Anders moet ik overal een uitgebreide uitleg bij gaan typen terwijl je het voor hetzelfde geld helemaal niet gaat gebruiken...
Ozzie PHP op 04/08/2011 21:55:41:
Daarnaast stel ik gewoon een vraag hoe ik iets moet oplossen en daar geef je geen antwoord op. Ik kan dus niks met jouw antwoord.
Ik geef je zelfs twee oplossingen. Hierbij nog een derde oplossing: het ondersteunen van packages die bestaan uit models, controllers, views, config, enz. (wordt ook ondersteund in CodeIgniter vanaf v2.0). Dan maak je dus een 'project2' package die je in het framework kan inladen.
Als ik jou was zou ik voor oplossing nummer twee gaan. De hoofd controller map is voor project1. Maak een map 'project2' en zet daar alle controllers in van project2. Je framework moet er dan voor zorgen dat als je naar http://jewebsite.com/project2/ gaat dat je dan in 'project2' map terecht komt. Zo kan je dat ook doen in CodeIgniter. Neem eens een kijkje (ter inspiratie) op http://codeigniter.com/user_guide/general/controllers.html en dan met name http://codeigniter.com/user_guide/general/controllers.html#subfolders .
Gewijzigd op 04/08/2011 23:20:53 door The Force
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
/rootvanserver/bestanden/www/index.php // dit is de index van project 1
/rootvanserver/bestanden/www/images/ // dit zijn de plaatjes van project 1
/rootvanserver/bestanden/www/project2/index.php dit is de index van project 2
/rootvanserver/bestanden/www/project2/images/ dit zijn de plaatjes van project 2
/rootvanserver/bestanden/project1/ // models, views, controllers project 1
/rootvanserver/bestanden/project2/ // models, views, controllers project 2
/rootvanserver/bestanden/frameworkcms/
/rootvanserver/bestanden/www/images/ // dit zijn de plaatjes van project 1
/rootvanserver/bestanden/www/project2/index.php dit is de index van project 2
/rootvanserver/bestanden/www/project2/images/ dit zijn de plaatjes van project 2
/rootvanserver/bestanden/project1/ // models, views, controllers project 1
/rootvanserver/bestanden/project2/ // models, views, controllers project 2
/rootvanserver/bestanden/frameworkcms/
In de index.php van project 1 geef ik het pad aan naar het frameworkcms en ik include '/rootvanserver/bestanden/project1/index.php'. Ditzelfde doe ik ook voor project 2. Tot nu toe loopt alles dus goed. Project 1 en 2 hebben allebei hun eigen models, views en controllers en maken daarnaast gebruik van het (zelfde) frameworkcms.
Mijn enige vraag is... vanuit '/rootvanserver/bestanden/project1/' en vanuit '/rootvanserver/bestanden/project2/' zal het (zelfde) frameworkcms worden aangeroepen. Echter, hoe weet frameworkcms of hij is aangeroepen door project1 of door project2. Wat is zeg maar de unieke identifier? Moet ik daarvoor het pad van de projecten gebruiken? Dus if $pad == '/rootvanserver/bestanden/project1/' dan ben je website nummer 1 en als het pad '/rootvanserver/bestanden/project2/' is dan ben je website nummer 2? En dan vervolgens het pad in de database opslaan en aan de hand daarvan bepalen om welke website het gaat?
Nogmaals, het gaat mij dus helemaal niet om de structuur, maar alleen maar om de vraag hoe frameworkcms weet door welke project hij is aangeroepen (zodat hij weet welke settings / users in het cms van toepassing zijn).
Is domein url.nl/project1 pak je de config voor die url is url.nl/project2 pak je de confing voor die url.
Of bedoel je dit niet.
Maar ik weet dus niet of ik dat inderdaad zoals jij zegt aan de hand van de url moet doen, of op een andere manier, bijvoorbeeld aan de hand van het pad van het bestand dat het framework aanroept. Het voordeel van het gebruik van een pad is dat dit altijd hetzelfde is, terwijl een url "variabel" is: www.mijnsite.nl/project2, www.mijnsite.nl/project2/contact, www.mijnsite.nl/project2/producten, www.mijnsite.nl/project2/producten/siemens/snelkookpannen enzovoorts. Je moet dan telkens die url gaan ontleden en bepalen bij welk project het hoort. Dan is het gebruik van een pad denk ik handiger.
Alleen ik vraag me dus af of er een handigere / betere manier is. Stel dat je inderdaad aan de hand van het pad zou bepalen om welk project het gaat, dan moet je wel bij iedere pagina-aanroep het pad opvragen. Op de een of andere manier heb ik daar m'n twijfels over...
Zoals ik dus al eerder zei had ik bedacht dat je op mijn framework / cms meerdere projecten kunt draaien (zolang ze op dezelfde server staan uiteraard).
Dus...
www.mijnsite.nl
www.mijnsite.nl/project1
www.mijnsite.nl/project2
project3.mijnsite.nl
enz.
...moeten allemaal kunnen draaien op hetzelfde framework (ze gebruiken dus dezelfde framework php bestanden).
Nu zit ik me alleen iets af te vragen, en dat is het volgende. Het framework heeft een aantal instellingen die worden opgeslagen in de database en ieder project heeft natuurlijk ook eigen instellingen en gegevens in de database staan.
Nu had ik in eerste instantie in al mijn enthousiasme bedacht dat als ik meerdere projecten heb, dat ik dan gewoon alle gegevens in 1 database zet en dat ik dan aan de hand van een website_id bijhoud welke gegevens van toepassing zijn. Dus zit je bijvoorbeeld in project 2 dan zijn alleen de instellingen van project 2 van toepassing.
Maar nu ik er nog eens over nadenk vraag ik me af of dit wel handig is. Stel project 1 gaat over "bijzondere gerechten" en project 2 gaat over "goudvissen"...
Ten eerste moet ik dan alle cms / framework instellingen bij gaan houden met behulp van een website_id. Stel dat je de browser titel van project 1 standaard instelt op "Smakelijk eten!", dan wil je natuurlijk niet dat deze titel ook bij project 2 verschijnt boven een afbeelding van een vissekom gevuld met 10 goudvissen. Kortom, je zult dus voor ieder project alles afzonderlijk bij moeten gaan houden.
Ten tweede komen komen project-specifieke tabellen in 1 database terecht. Dus de tabel "goudvissen" en "gerechten" staan beide in dezelfde database.
Is het dan toch beter om per project gewoon 1 database te hanteren? En dan gewoon alle gegevens (dus zowel de framework instellingen als de project data) telkens in een afzonderlijke database opslaan? (Wat betreft het delen van dezelfde framework bestanden zie ik geen problemen.) Wat is hierover jullie mening? Klopt het wat ik zeg?
Wat is het probleem met het hebben van kernklassen of klassenbibliotheek in een publieke map?
Ik neem aan dat je met "publieke map" een map bedoelt die in de WWW directory staat? Nou, dat is dus precies het probleem. Je hebt je bestanden liever buiten de www directory (dus op het privé deel van de server) in verband met veiligheid. Alles wat buiten de www directory staat, kan namelijk nooit rechtstreeks via een url worden benaderd.
Gewijzigd op 11/08/2011 00:27:18 door Fabian M
Fabian M op 11/08/2011 00:27:03:
Als jij een PHP class hebt en je benaderd hem via een url is er geen output. Even veilig dus.
Helemaal mee eens, er zijn tevens nog andere work-arounds. Ik ken trouwens hosts waar je niet anders kan dan bestanden in www-root te zetten, dus als je je CMS wilt gaan commercialiseren wordt het al lastiger. Maak tevens maar is wijs aan je klant waar hij dan de bestanden moet uploaden.
Ik ben niet van plan om het te gaan vercommercialiseren op dit moment.
De meningen zijn blijkbaar verdeeld. Er zijn hier genoeg leden op het forum die altijd aanraden om bestanden zoveel mogelijk buiten de www directory te zetten en dat zal vast niet voor niets zijn. Maar goed, als jij ze in de www directory wil zetten dan moet je dat gewoon lekker doen natuurlijk.
Ontopic: Maar het punt is, dat het geen echte meerwaarde heeft naar mijn mening. Dat je een config buiten www-root plaatst, oké... Maar de andere bestanden zie ik echt geen nut in. Ik denk als je gewoon netjes programmeert, alles veilig houdt er niet veel meer kan gebeuren. Maar natuurlijk, alles is hackbaar...
Zet de config van een project gewoon in de projectmap, niet in het framework. Daar hoort het ook. Geef elk project zijn eigen database. Het framework vraagt aan de config van het project de database op en gebruikt die. Dan zijn je projecten ook beter gescheiden dan dat je alles in één database gaat proppen.
@TheForce: ja, dat is inderdaad precies zoals ik het in gedachten had. Goed om te horen dat jij er ook zo over denkt, dan ga ik het op die manier aanpakken. Ieder project maakt dan dus gebruik van dezelfde framework bestanden, maar heeft wel zijn eigen projectmap met daarin z'n eigen config + ieder project heeft z'n eigen database. Lijkt me een goede oplossing :) Thanks!