CodeIgniter, routering & een uitgebreid CMS

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Ijstheefles
  • Registratie: December 2011
  • Laatst online: 25-08 22:56
Hoi Tweakers,

Ben bezig met het schrijven van een vrij uitgebreid CMS. Hierbij ben ik nu bij de opbouw in modules vastgelopen.

Zoals het nu gaat / zoals ik het nu plan te gaan doen:

- ik krijg een url binnen
- die url wijst naar een 'pagina'
- die 'pagina' heeft een verwijzing naar een 'module'
- die 'module' heeft een naam, die in mijn code een handelingswijze representeerd. Bijvoorbeeld: module albums zorgt voor een mooie view voor de afbeeldingen, terwijl de module forum een compleet forum uit de grond stampt. Met die naam moet 'module' dus gaan zorgen dat de juiste gegevens uit de juiste tabel worden ingeladen, dit doorgeven aan de view.

Nu is mijn probleem:

Op het moment heb ik dan niets aan 't routerings-systeem van codeigniter. Ik omzeil dit compleet door per 'pagina' de link op te slaan. Hiermee heb ik ook meteen reverse-routing voor elkaar.

Mijn vraag: Is er geen betere manier om dit te doen? Is het slim om 't routering systeem eruit te slopen voor performance? Want nu zorgt het routering systeem ervoor dat b.v. /about naar de about controller gaat. Terwijl ik met dit plan maar 1 controller ( de default) nodig ga hebben.

Ik hoor 't graag!

Acties:
  • 0 Henk 'm!

  • simon
  • Registratie: Maart 2002
  • Laatst online: 16:20
Want nu zorgt het routering systeem ervoor dat b.v. /about naar de about controller gaat. Terwijl ik met dit plan maar 1 controller ( de default) nodig ga hebben.
Ik volg je niet helemaal, maar je kan je routering toch ook zo maken dat het naar de default controller gaat en dan about meegeeft als data? Je routering is toch niet statisch? Ik weet niet hoe het bij CodeIgniter gaat, maar bij RoR zou je gewoon dan dat als variabele meegeven.

Al lijkt het me niet verstandig om bijv http://foo.bar/* * allemaal naar de default controller te routen.

|>


Acties:
  • 0 Henk 'm!

  • Ijstheefles
  • Registratie: December 2011
  • Laatst online: 25-08 22:56
simon schreef op maandag 28 mei 2012 @ 12:18:
[...]

Ik volg je niet helemaal, maar je kan je routering toch ook zo maken dat het naar de default controller gaat en dan about meegeeft als data? Je routering is toch niet statisch? Ik weet niet hoe het bij CodeIgniter gaat, maar bij RoR zou je gewoon dan dat als variabele meegeven.

Al lijkt het me niet verstandig om bijv http://foo.bar/* * allemaal naar de default controller te routen.
Dat is dus het probleem.

Als ik alles routeer naar de default controller (door de routering van codeigniter eruit te slopen en alleen de link die ik krijg van de url die gecalled wordt, te vergelijken met de 'pagina'-table urls en daaruit de module naam te verkrijgen en vanaf daar zn ding laten doen), heb ik nog 2 problemen;

1. routering van codeigniter is ongebruikt. Nu neemt dit niet bakken resources in, maar is toch erg jammer.

2. Geen flauw idee hoe ik de routering eruit sloop van CI zelf, + het feit dat ik niet weet hoe ik alles naar de default controller duw.

Acties:
  • 0 Henk 'm!

  • simon
  • Registratie: Maart 2002
  • Laatst online: 16:20
Maar wat is je doel nu, ga je alleen urls routeren die in de structuur van foo.bar/about komen, of gaat er nog meer komen? Routering is meer dan enkel statische routes, je moet die URL wel eerst opbreken en analyseren. Dat doe je aan de hand van de regels die je opstelt. Ik neem aan dat CI daar toch goed configureerbaar in is. Je zou bijv alles wat binnenkomt op url.bar/* gewoon naar je default controller kunnen sturen, en dan daar kijken of die pagina wel bestaat of niet, en dat niet in de routering doen.

Ik snap ook nog niet helemaal waarom de routing van CI gebypassed moet worden, het kan toch wel wat meer dan alleen simpele routes?

Dus; hoe ingewikkeld wordt je URL structuur, wat ga je hoe routeren. Verder klinkt als 1 controller voor alles niet helemaal goed opgezette structuur voor een vrij uitgebreid CMS..

[ Voor 12% gewijzigd door simon op 28-05-2012 13:01 ]

|>


Acties:
  • 0 Henk 'm!

  • mithras
  • Registratie: Maart 2003
  • Niet online
Waarom zou je de router van Code Igniter willen omzeilen om vervolgens zelf een soort-van router te bouwen? Ik zou je eigen systeem zoveel mogelijk strippen en de standaardcomponenten van het framework gebruiken waar je in zit.

Als voorbeeld, moet je van je complete paginaboom een lijst van routes maken. Ik ken Code Igniter zelf niet, maar per pagina bouw je een route op en per route sla je een referentie (zeg, id) op van de juiste pagina. Als je een routematch hebt van zo'n route weet je welke pagina dat is, dus welke module, dus wat je verder moet doen.

Het zou helemaal mooi zijn als je direct de juiste controller + method aan je route kan koppelen. Dan parse je eenmalig je routes (die cache je!) en zorgt Code Igniter er vervolgens voor dat direct na een routematch hij de juiste controller + method dispatched.

Acties:
  • 0 Henk 'm!

  • Ijstheefles
  • Registratie: December 2011
  • Laatst online: 25-08 22:56
Mijn probleem is dan dat de 't route systeem van CI weinig meer te doen heeft. Ik sla immers de url op en die delegeer ik dan zelf al naar de juiste module. De routering van CI zorgt er nou net voor dat er naar de juiste class/func/par wordt geroute, wat ik dus hiermee zelf doe.
Als voorbeeld, moet je van je complete paginaboom een lijst van routes maken. Ik ken Code Igniter zelf niet, maar per pagina bouw je een route op en per route sla je een referentie (zeg, id) op van de juiste pagina. Als je een routematch hebt van zo'n route weet je welke pagina dat is, dus welke module, dus wat je verder moet doen
Dat doe ik dus al. Pagina tabel met 'route' en 'module' kolommen. Vervolgens zou ik per module de url moeten analyseren wat er dan gedaan moet worden. Maar op het moment dat ik een /bla route zou neerzetten, zou codeigniter zelf eerst naar een about controller opzoek gaan, wat dus niet moet, want er moet op module niveau besloten worden wat ermee gedaan gaat worden.
Het zou helemaal mooi zijn als je direct de juiste controller + method aan je route kan koppelen. Dan parse je eenmalig je routes (die cache je!) en zorgt Code Igniter er vervolgens voor dat direct na een routematch hij de juiste controller + method dispatched.
Dit is een beetje halfjes wat ik dus wil. Ik probeer er dus voor te zorgen dat CI niet zelf naar die controller gaat zoeken, maar dat dat pas nadat ik heb gezegt welke module 't is, en hoe die module de url moet interpreteren.

Ik heb dus als ik 5 modules heb, 5 controllers.

Terwijl codeigniter nu met de url /about, naar de about controller op zoek gaat. Dit wil ik niet. Ik wil dat er gekeken wordt 'welke module hoort er bij die url?' 'een-simpele-tekstpagina-module.. o, dan moet je nu naar de simpeletekstpaginacontroller voor verdere afhandeling, en het zoeken naar de /about controller overslaan'

Hoop dat 't zo wat duidelijker is.

[edit] O dit bedenk ik me net pas: zou dit correct werken? of kan 't nog netter?

url komt binnen
die vergelijk ik met mijn page tabel
dat resultaat heeft een pagina met een link naar een module
die module heeft een naam, en die naam komt terug in de controller die aangeroepen wordt.

Dan gebruik ik enigzins het route-systeem van CI namelijk nog.

't Probleem hiervan is dat ik steeds per module een nieuwe controller krijg, terwijl ik eigenlijk een soort hook-systeem wil maken voor extra modules. Dat deze er zelf nog bij worden geschreven. Maar ik gok dat ik dan buiten CI ga, gezien ik dan weer het routering systeem compleet negeer.

Nog een probleem:

In MY_Controller heb ik nu de basis 'welke module is dit' code gefixed, alleen loop ik nu tegen het probleem aan dat ik vanaf MY_Controller de daadwerkelijke controller v/d module moet aanroepen.

call_user_func_array / call_user_method_array heeft weinig zin, want ik kan nou niet bepaald een instantie maken van de betreffende controller ;x

Tips?

--

Oke, een MY_Router maken heeft ook weinig zin (met veel aliasen gaan werken om maar x controllers te hebben (aka modules)) gezien daar doctrine nog niet beschikbaar is. Libraries zijn namelijk nog niet geladen.

Nog andere ideeen?

[ Voor 35% gewijzigd door Ijstheefles op 28-05-2012 20:51 . Reden: hersenspinsel v2 ]


Acties:
  • 0 Henk 'm!

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 13:36
Dat routeer gedeelte hoort daar wel thuis alleen zou je het moeten customizen. Je controller gaat per definitie nooit over routing.

http://stackoverflow.com/...e-igniter-dynamic-routing

Zie het bovenstaande voorbeeld waarbij ze zelf dynamisch routes toevoegen. Je zou dus op basis van je database routes toe kunnen voegen waardoor je het routeren in de router houdt volgens de standaard maar we het niveau van flexibiliteit houdt zoals je wilt.

Acties:
  • 0 Henk 'm!

  • Ijstheefles
  • Registratie: December 2011
  • Laatst online: 25-08 22:56
djluc schreef op dinsdag 29 mei 2012 @ 09:33:
Dat routeer gedeelte hoort daar wel thuis alleen zou je het moeten customizen. Je controller gaat per definitie nooit over routing.

http://stackoverflow.com/...e-igniter-dynamic-routing

Zie het bovenstaande voorbeeld waarbij ze zelf dynamisch routes toevoegen. Je zou dus op basis van je database routes toe kunnen voegen waardoor je het routeren in de router houdt volgens de standaard maar we het niveau van flexibiliteit houdt zoals je wilt.
Gezien laat reageren me beter lijkt als een nieuw topic openen:
Dan heb ik het volgende:
- pagina wordt opgevraagd
- bekijkt welke pagina 't is, a.d.h.v. de url
- we weten nu welke module dat moet zijn
- >> PROBLEEM. Ik hou dan wederom 1 controller over in mijn hele applicatie. Gezien ik anders geen modulaire indeling kan verkrijgen. Ik merk namelijk nu al dat als ik b.v. 3 simpele tekst paginas heb, ik 3x dezelfde code aan 't schrijven ben. Module 'simpele-tekst-pagina' zou er voor zorgen dat deze 3 pagina's naar dezelfde 'module-controller' gaan en hetzelfde worden afgehandeld.

Wat ik wel al heb bedacht (maar niet erg netjes is):
- pagina wordt opgevraagd
- bekijk welke pagina 't is a.d.h.v. de url
- we weten welke module dat is
- per module een controller die nu gecalled wordt.
- die controller handelt per module af wat er gedaan gaat worden.
- om vervolgens te zorgen dat de naam van de controllers / functies ervan niet als routes worden opgegeven kan ik die aliassen naar de default 404 pagina. Maar met 10 of 20 modules wordt dat al snel lelijk.

Al zou ik niet weten hoe ik ervoor moet gaan zorgen dat de module controller gecalled wordt. Gok in de richting van call_user_func_array() maar ik heb zon voorgevoel dat dit efficienter kan.

Acties:
  • 0 Henk 'm!

  • rewind.
  • Registratie: Oktober 2001
  • Laatst online: 07-08 08:58

Acties:
  • 0 Henk 'm!

  • Ijstheefles
  • Registratie: December 2011
  • Laatst online: 25-08 22:56

Acties:
  • 0 Henk 'm!

  • Ijstheefles
  • Registratie: December 2011
  • Laatst online: 25-08 22:56
Ja, en dan kom ik dus in de problemen met mijn Doctrine installatie :) Die kan geen subfoldering aan.

Vind 't opzich niet erg, mijn entities buiten de module mappen, gezien front en backend beide de models nodig gaan hebben, maar ik gok dat 't netter kan.

Ook is het zo dat ik dan nog steeds in de knoop zit met mijn routes.

Ik denk dat er weinig anders op zit als in hmvc de module controllers maken en vervolgens zorgen dat in het route systeem de module directorys worden uitgelezen, die aliasen aan 404 paginas, en uit de database de rest v/d routes halen en dit uiteindelijke resultaat cachen.

Of is er nog een andere manier?

Acties:
  • 0 Henk 'm!

  • Camulos
  • Registratie: Januari 2009
  • Laatst online: 06-09 22:59

Camulos

Stampert

ff topic schopje, omdat ik het niet kan laten :P
Terwijl codeigniter nu met de url /about, naar de about controller op zoek gaat. Dit wil ik niet. Ik wil dat er gekeken wordt 'welke module hoort er bij die url?' 'een-simpele-tekstpagina-module.. o, dan moet je nu naar de simpeletekstpaginacontroller voor verdere afhandeling, en het zoeken naar de /about controller overslaan'
Wat maar niet uit de verf komt is WAAROM je deze manier verkiest boven de geïntegreerde oplossing die CI al biedt dmv url/controller/method[/param1]..[/param N], zie ook CI URI routing
Ben bezig met het schrijven van een vrij uitgebreid CMS. Hierbij ben ik nu bij de opbouw in modules vastgelopen
Again, CodeIgniter kent geen modules. Bedoel je hier wellicht Models/View of Libraries mee? Waarom ben je afgeweken van de standaard manier van werken binnen het framework? Waarom maak je van een module niet direct een controller?
In MY_Controller heb ik nu de basis 'welke module is dit' code gefixed, alleen loop ik nu tegen het probleem aan dat ik vanaf MY_Controller de daadwerkelijke controller v/d module moet aanroepen.
Neen dat kan inderdaad niet. In een standaard CI-installatie kan er slechts 1 controller actief zijn, de enige manier om een andere controller aan te roepen is via een redirect (liefste via de URL-helper).
Dit is waarom je vaak algemene logica en veel gebruikte logica in een library stopt. Vervolgens kwestie van standaard inladen binnen de controller

Oke genoeg vragen gesteld.. als je dan perse de routing op deze manier wilt doen kun je het op een aantal manieren aanpakken:
  1. Gebruik een "pre_system" of "pre_controller" hook, die je routing klasse heeft en vervolgens de URL interpreteerd en de juiste controller nu laadt (eigenlijk override van je routing system)
  2. Wat je nu doet: gebruik 1 "fat"controller die vervolgens checked welke methode (models en views) geladen moet worden. Hiermee heb je effectief nog maar 1 controller in je complete app. Dit is niet een nette manier, omdat het feitelijk geen gebruik maakt van MVC
  3. Maak van je modules een controller?! Lijkt me verreweg het makkelijkste?? En pas dan directe URL-to-Controller van CI toe. (snap maar niet waarom je perse een DB-check wilt doent)
  4. Routes specificeren in routes.php waarbij je ook wildcards gebruikt
  5. Als het enkel gaat om een router waarbij alternatieve URLs kunnen worden geforward naar de juiste controllers, dan zou ik hebben gekozen voor een controller RD (redirect) die als default controller aangeroepen wordt (in routes.php). En bij de parameter dan checked in de DB naar welke controller hij geroute moet worden (eventueel nog andere dingen doen zoals hoevaak de url aangetikt wordt).
Bij optie 5 ziet het er zo uit:
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
// in application/config/routes.php staat
$route['default_controller'] = "rd";
$route['about/:any'] = "rd/route/about";

// in application/controllers/rd.php staat
// class Rd (redirect / semi router)
class Rd extends CI_Controller 
{
    public function __construct()
    {
        parent::__construct();  // init CI_Controller
    }

    // standard routing, when no arguments are supplied
    public function index(){$this->route();}

    // your magic forward check (you can add multiple params if you want)
    public function route($param1 = '')
    {
        // uncomment if you didnt load DB yet in autoload
        // $this->load->database();
        
        // uncomment if you didnt load URL helper in autoload
        // $this->load->helper('url');
        
        // standard controller (fetched from DB)
        $q = $this->db->select('url')->where('parameter_for_homepage', '1')->get('routertable');
        $url = $q->row_array(); // default url (homepage)
        if(empty($param1))
        {
            // no route selected -> homepage!... perhaps add redirect-counts n stuff :P
            redirect($url['url']);
        }
        else
        {
            // redirect to the right CI controller (which triggers the right module)
            $q = $this->db->select('url')->where('part1',$param1)->get('routertable');
            $url = $q->row_array(); // contains the new matched url
            if(!empty($url) && !empty($url['url'])
            {
                redirect($url['url']); // whie go to the new url
            }
            else
            {
                show_404(); // no such page, show 404 or any other controller/page you want
            }
        }
    }
}


Maar eigenlijk wil je een fix voor een probleem dat niet bestaat in CI?! Je kan het routing systeem er niet uithalen, deze wordt standaard geladen in CI. Persoonlijk vind ik juist de routing-feature erg sterk binnen CI (het is ook 1 van de basis pijlers voor de rest van het framework).
Wellicht niet het antwoord dat je wilt horen, maar overweeg nog eens of CodeIgniter wel het juiste php-framework is voor je. Als je HMVC wilt hebben dan zijn er vast frameworks die dat native ondersteunen. Verder vind ik het vreemd dat je het CMS niet hebt aangepast tot de structuur URL/Controller/Method/Param maar star aan modules blijft vasthouden (iets wat niet bestaat in CI.. enkel Controllers - Hooks - Libraries - Models - Views).

Anyways, ik hoop dat je er nog wat aan hebt.

Not just an innocent bystander

Pagina: 1