[ZF] useDefaultControllerAlways behalve bij /advanced module

Pagina: 1
Acties:

Onderwerpen


  • Barleone
  • Registratie: Maart 2009
  • Laatst online: 15:18
Intro:
Ik heb een ZF 1.10.7 applicatie met 2 modules: /default en /advanced.
Er is echter een wezenlijk verschil tussen deze 2 modules.
/advanced werkt volgens het standaard principe:
example.com/advanced/{controller}/{action}/{param}/{value}

Doel:
Alle gevallen buiten /advanced moeten routen over /default/index/index.
Dus example.com/foo/bar?!@#$%^& moet eigenlijk doen: example.com/default/index/index
Nee, ik verwacht niet dergelijke rare urls, maar het gaat om random urls die persé over /index/index moeten.

Probleem:
Nu weet ik hoe ik het ZF dat moet laten doen. Maar ik weet niet waar/wanneer. :-(
PHP:
1
Zend_Controller_Front::getInstance()->setParam('useDefaultControllerAlways', true);

Probleem van plaatsing: Eerst moet bekend zijn dat we niet in /advanced zitten, op het moment dat dat bekend is moet de FrontController de hele mikmak over /default/index/index runnen.

Ik heb inmiddels al veel forums/documentatie gelezen over het goed routen naar modules en daar is dit uitgekomen:
PHP: /index.php
1
2
3
$front= Zend_Controller_Front::getInstance();
require_once 'Barleone/Plugin/ModuleRouter.php';
$front->registerPlugin(new Barleone_Plugin_ModuleRouter());

PHP: /library/Barleone/PluginModuleRouterController.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
50
51
52
53
54
<?php
/**
 * ModuleRouter plugin
 * Zorgt dat de FrontController niet in de knoop raakt.
 * Module ADVANCED is toegestaan, maar alle andere requests gaan naar de DEFAULT module.
 */
class Barleone_Plugin_ModuleRouter extends Zend_Controller_Plugin_Abstract
{
    /**
     * Constructor
     *
     * @return void
     */
    public function __contstruct() {}

    /**
     * Called before Zend_Controller_Front begins evaluating the
     * request against its routes.
     *
     * @param Zend_Controller_Request_Abstract $request
     * @return void
     */
    public function routeStartup($request)
    {
        // De requesturi is al bekend, de modulename nog niet.
        // Dit is het vroegste moment in deze plugin waarop ingegrepen kan worden in de FrontController.
        $requesturi = $request->getRequestUri();
        if(!preg_match('/^\/advanced/i', $requesturi))
        {
            Zend_Controller_Front::getInstance()->setParam('useDefaultControllerAlways', true);
        }
    }

    /**
     * Called after Zend_Controller_Router exits.
     * Called after Zend_Controller_Front exits from the router.
     *
     * @param  Zend_Controller_Request_Abstract $request
     * @return void
     */
    public function routeShutdown($request)
    {       
        $modulename = $request->getModuleName();
        if($modulename != 'advanced')
        {
            Zend_Controller_Front::getInstance()->setParam('useDefaultControllerAlways', true);
        }
    }

    public function dispatchLoopStartup($request){}
    public function preDispatch($request){}
    public function postDispatch($request){}
    public function dispatchLoopShutdown(){}
}

De vraag is, waarom werkt dit niet, en hoe moet ik het werkend maken? Nu struikelt het ZF telkens over onbekende urls zoals example.com/foobar. Als ik useDefaultControllerAlways in index.php zet werkt het wel. Dan routeert het ZF wél alle requests via /default/index/index. Het probleem is dat ik dan nooit in /advanced module kan komen.

update:
Het probleem is opgelost verdampt.
Hoe het nu bij mij werkt; zie verderop in dit topic: Barleone in "[ZF] useDefaultControllerAlways behalve ..."

[ Voor 20% gewijzigd door Barleone op 27-07-2011 02:02 ]

Tweakers.net 6 nostalgie! - Wayback Machine
Have you tried turning it off and on again?


  • HuHu
  • Registratie: Maart 2005
  • Niet online
De eerste vraag die eigenlijk bij me opkomt is: hoe komt je überhaupt aan die vreemd URLs die niet binnen je applicatie passen? Tweede vraag: waarom maak je geen correcte foutafhandeling?

Verder denk ik dat je dit kwijt moet in je Bootstrap, ergens in een _initRoutes() ofzo.

Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Geef je wel een pad op voor modules ergens?

PHP:
1
2
3
$front = Zend_Controller_Front::getInstance();
$front->setModuleControllerDirectoryName('controller');
$front->addModuleDirectory('/path/to/module_dir');


HuHu, waarom zijn het vreemde urls? Daar zijn modules voor bedoeld.

Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
Cartman! schreef op vrijdag 24 september 2010 @ 08:10:

HuHu, waarom zijn het vreemde urls? Daar zijn modules voor bedoeld.
Ik vraag me af hoe je aan een URL als example.com/foo/bar?!@#$%^& komt, terwijl je eigenlijk example.com/default/index/index bedoelt. Waarom wordt er dan niet naar de correcte URL verwezen?

Blijkbaar zijn die URLs ook nog eens random (gokje), want anders maakt 'ie wel een FooController (of module) als er regelmatig naar example.com/foo/bar?!@#$%^& wordt verwezen.

Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Na het nogmaals gelezen te hebben snap ik wat je bedoelt, dat klinkt inderdaad als heel raar...

Het zou simpelweg een route moeten zijn met alles wat niet matcht met /advanced naar de index/index te routen.

Acties:
  • 0 Henk 'm!

  • Barleone
  • Registratie: Maart 2009
  • Laatst online: 15:18
Cartman! schreef op vrijdag 24 september 2010 @ 11:03:
Na het nogmaals gelezen te hebben snap ik wat je bedoelt, dat klinkt inderdaad als heel raar...

Het zou simpelweg een route moeten zijn met alles wat niet matcht met /advanced naar de index/index te routen.
Correct

Tweakers.net 6 nostalgie! - Wayback Machine
Have you tried turning it off and on again?


Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Maar wat is het probleem dan?

Acties:
  • 0 Henk 'm!

  • Barleone
  • Registratie: Maart 2009
  • Laatst online: 15:18
Er is een doel en geen oplossing. Voila, aanschouw mijn probleem.

Ik heb urls als example.com/pagina1 en example.com/pagina2 en die moeten over /default/index/index gaan.
In de indexcontroller vang ik de url af en ga de juiste pagina uit de database vissen.

Deze urls zijn echter niet statisch. Dat wil zeggen. ze kunnen veranderen door database veranderingen via een beheersysteem. Ik kan dus geen vaste zend framework modules en controllers maken met statische php-bestanden voor elke url.

FYI: Het komt er op neer dat ik example.com/pagina1 wil en geen example.com/index/index/pagina/1

[ Voor 58% gewijzigd door Barleone op 05-10-2010 18:35 ]

Tweakers.net 6 nostalgie! - Wayback Machine
Have you tried turning it off and on again?


Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
Barleone schreef op dinsdag 05 oktober 2010 @ 18:25:
[...]

Er is een doel en geen oplossing. Voila, aanschouw mijn probleem.
Hij geeft de oplossing dan ook al: maak een route met als rule dat het niet op advanced matched en je bent klaar.
Ik heb urls als example.com/pagina1 en example.com/pagina2 en die moeten over /default/index/index gaan.
In de indexcontroller vang ik de url af en ga de juiste pagina uit de database vissen.

Deze urls zijn echter niet statisch. Dat wil zeggen. ze kunnen veranderen door database veranderingen via een beheersysteem. Ik kan dus geen vaste zend framework modules en controllers maken met statische php-bestanden voor elke url.

FYI: Het komt er op neer dat ik example.com/pagina1 wil en geen example.com/index/index/pagina/1
Dat klinkt als een foute structuur, ik zou daar toch nog eens goed naar kijken als ik jou was.

Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Barleone schreef op dinsdag 05 oktober 2010 @ 18:25:
[...]

Er is een doel en geen oplossing. Voila, aanschouw mijn probleem.
De oplossing is dus allang gegeven, routes. In feite zal het dus met 1 route opgelost zijn dus maar hoe je dat doet mag je eerst zelf opzoeken. Als je daar concrete vragen over hebt dan kun je uiteraard daar weer mee verder geholpen worden.

Acties:
  • 0 Henk 'm!

  • Barleone
  • Registratie: Maart 2009
  • Laatst online: 15:18
Ik geloof dat nu het kwartje valt. Ik ga me uitleven op routes. :)

Tweakers.net 6 nostalgie! - Wayback Machine
Have you tried turning it off and on again?


Acties:
  • 0 Henk 'm!

  • Barleone
  • Registratie: Maart 2009
  • Laatst online: 15:18
useDefaultControllerAlways, waar ik al mee bezig was, is gewoon DE manier. Ik heb werkelijk geen flauw idee waarom mijn ZF applicatie hier bokte. Voor de duidelijkheid: ik heb geen custom routes in mijn applicatie.
Dit zijn de laatste regels van mijn public/index.php
PHP:
16
17
18
19
// FrontController moet altijd /default/index/index runnen als het een onbekend request is. (dus geen /advanced)
Zend_Controller_Front::getInstance()->setParam('useDefaultControllerAlways', true);

$application->bootstrap()->run();

Mijn ZF applicatie pakt gewoon iedere valide url naar /advanced en serveert dan ook uit die module.
De rest (vooral onzin urls door nieuwsgierige bezoekers) worden door /default/indexController (af)geserveerd (als 404 uiteraard). >:)
offtopic:
Excuus voor deze veel te late update. :$ Dit topic heeft geen bestaansrecht meer, het probleem is al lang opgelost verdampt.

Tweakers.net 6 nostalgie! - Wayback Machine
Have you tried turning it off and on again?

Pagina: 1