Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien
Toon posts:

[PHP] Zend Framework Backend

Pagina: 1
Acties:
  • 593 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
De laatste tijd ben ik bezig met het "Zend Framework". Hoe meer ik erin duik hoe enthousiaster ik wordt. Vooral de Auth en de Acl classes vind ik wel erg relaxed!

Nu na een tijd van inlezen, tutorials en nog meer inlezen wordt het wel eens tijd om practisch eens wat uitgebreiders te proberen. Daarmee loop ik meteen tegen een probleem aan. De mappen structuur.

Wat is de aanbevolen mappen structuur voor een website met CMS/backend. Er zijn natuurlijk verschillende opties:
  • Voor website en backend aparte modules. Dit heeft als nadeel dat je qua models moet copy/pasten.
  • Voor elk onderdeel/component (content, menus, fotogalery etc) een aparte module. Daarin maak je voor de website een controller en voor de backend een controller. En als je dan naar http://www.domain.com/admin/module/controller/action/* er voor laten zorgen dat hij de aparte backoffice controller gebruikt.
  • Keep it simpel. Voor elke component 1 controller. In deze controller stop je de actions voor de website en de backend. Voor de backend zou je controllers kunnen laten beginnen met "admin_" oid. Met een router en het extenden van de controller class zou ik het dan zo maken dat als je naar http://www.domain.com/admin/controller/action/* zou gaan dat hij de speciale admin actions gebruikt.
Heb al een hoop research naar proberen te doen, maar kan er niet zo heel veel over vinden, behalve een ander topic hier op tweakers van ruim 1,5jaar terug.

http://gathering.tweakers.net/forum/list_messages/1133859

Nu 1,5 jaar later is Zend Framework natuurlijk al weer verder ontwikkeld? en bied het misschien al weer meer oplossingen.

Wat is jullie mening hierover?

  • OxiMoron
  • Registratie: November 2001
  • Laatst online: 08-07 14:27
Verwijderd schreef op maandag 07 januari 2008 @ 14:20:
  • Voor website en backend aparte modules. Dit heeft als nadeel dat je qua models moet copy/pasten.
  • Voor elk onderdeel/component (content, menus, fotogalery etc) een aparte module. Daarin maak je voor de website een controller en voor de backend een controller. En als je dan naar http://www.domain.com/admin/module/controller/action/* er voor laten zorgen dat hij de aparte backoffice controller gebruikt.
  • Keep it simpel. Voor elke component 1 controller. In deze controller stop je de actions voor de website en de backend. Voor de backend zou je controllers kunnen laten beginnen met "admin_" oid. Met een router en het extenden van de controller class zou ik het dan zo maken dat als je naar http://www.domain.com/admin/controller/action/* zou gaan dat hij de speciale admin actions gebruikt.
Het kan allemaal, dat is het mooie aan zf ;)

Gebruik zelf methode 1, met een custom router die /admin/news/ herschrijft zodat hij newsAdmin als module ziet.

Je kunt dan natuurlijk nog steeds /newsadmin/ gebruiken om er bij te komen, maar dat maakt eigenlijk niet zoveel uit.

Albert Einstein: A question that sometime drives me hazy: Am I or are the others crazy?


Verwijderd

Topicstarter
Het kan allemaal, dat is het mooie aan zf ;)

Gebruik zelf methode 1, met een custom router die /admin/news/ herschrijft zodat hij newsAdmin als module ziet.

Je kunt dan natuurlijk nog steeds /newsadmin/ gebruiken om er bij te komen, maar dat maakt eigenlijk niet zoveel uit.
I know! Daarom ben ik ook enorm enthousiast!

Maar jah....wat is het meest aanbevolen voor een zo flexibel mogelijk systeem.

  • Freeaqingme
  • Registratie: April 2006
  • Laatst online: 13:20
Tegen de tijd dat je een mooie oplossing hebt geschreven, zou ik 'm graag van je willen zien :D

No trees were harmed in creating this message. However, a large number of electrons were terribly inconvenienced.


  • OxiMoron
  • Registratie: November 2001
  • Laatst online: 08-07 14:27
code:
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
55
56
57
58
59
60
61
62
63
64
65
<?php

/*
    Usage:
        
    Zend_Loader::loadClass('Zend_Controller_Router_Rewrite');
    Zend_Loader::loadClass('Harro_Router');
    $router = new Zend_Controller_Router_Rewrite();
    $router->addRoute('default', new Harro_Router(array(), $front->getDispatcher(), $front->getRequest()));
    $front->setRouter($router);
*/
require_once 'Zend/Controller/Router/Route/Module.php';

class Harro_Router extends Zend_Controller_Router_Route_Module
{

    public function match($path)
    {       
         $this->_setRequestKeys();

        $values = array();
        $params = array();
        $path   = trim($path, self::URI_DELIMITER);

        if ($path != '') {

            $path = explode(self::URI_DELIMITER, $path);
            
            if(isset($path[0]) && $path[0] === 'admin') {
                array_shift($path);
                if (empty($path[0])) {
                    $path[0] = 'defaultAdmin';
                } else {
                    $path[0] = $path[0].'Admin';
                }               
            }

            if ($this->_dispatcher && $this->_dispatcher->isValidModule($path[0])) {
                $values[$this->_moduleKey] = array_shift($path);
                $this->_moduleValid = true;
            }

            if (count($path) && !empty($path[0])) {
                $values[$this->_controllerKey] = array_shift($path);
            }

            if (count($path) && !empty($path[0])) {
                $values[$this->_actionKey] = array_shift($path);
            }

            if ($numSegs = count($path)) {
                for ($i = 0; $i < $numSegs; $i = $i + 2) {
                    $key = urldecode($path[$i]);
                    $val = isset($path[$i + 1]) ? urldecode($path[$i + 1]) : null;
                    $params[$key] = $val;
                }
            }
        }

        $this->_values = $values + $params;     
        return $this->_values + $this->_defaults;
    }    
}

?>


Dat dus..

Dit is de meest flexibele manier..


verder heb ik voor m'n gewone en admin controller eigen classes om te zorgen dat de models van een gewone module ook beschikbaar zijn in de admin module..
In de admin controller check ik in de preDispatch ook rechten enzo (frontend is in dit geval allemaal public)

Verder zou je deze post eens kunnen lezen over model sharing..
Dit werkt in mijn geval prima :)

Albert Einstein: A question that sometime drives me hazy: Am I or are the others crazy?


Verwijderd

Topicstarter
Dat script van Oximoron ziet er erg interessant uit voor wat ik nu in gedachten heb. Als ik wat heb geschreven zal ik het wel posten!

  • OxiMoron
  • Registratie: November 2001
  • Laatst online: 08-07 14:27
Voordeel hiervan is dat je er veel meer mee kunt dan met de gewone/regex rewrite rule..

Albert Einstein: A question that sometime drives me hazy: Am I or are the others crazy?


Verwijderd

Topicstarter
Ik heb de Router van OxiMoron iets aangepast voor mijn idee:

code:
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
55
56
57
58
59
60
61
class Routers_Default extends Zend_Controller_Router_Route_Module
{
    public function match($path)
    {        
        $this->_setRequestKeys();

        $values =   array();
        $params =   array();
        $path   =   trim($path, self::URI_DELIMITER);
        
        $controller =   "";
        $isAdmin =      false;

        if ($path != '') {

            $path = explode(self::URI_DELIMITER, $path);
            
            if(isset($path[0]) && $path[0] === 'admin') {
                array_shift($path);
                $isAdmin = true;
                
                $frontController = Zend_Controller_Front::getInstance();
                $frontController->getRequest()->setParam('layout', 'admin');
            }

            if ($this->_dispatcher && $this->_dispatcher->isValidModule($path[0])) {
                $values[$this->_moduleKey] = array_shift($path);
                $this->_moduleValid = true;
            }

            if ((count($path) && !empty($path[0])) || $isAdmin) {
                $controller = array_shift($path);
                
                if (empty($controller)) {
                    $controller = "index";
                }
                
                if ($isAdmin) {
                    $controller .= "Admin";
                }
                
                $values[$this->_controllerKey] = $controller;
            }
            
            if (count($path) && !empty($path[0])) {
                $values[$this->_actionKey] = array_shift($path);
            }

            if ($numSegs = count($path)) {
                for ($i = 0; $i < $numSegs; $i = $i + 2) {
                    $key = urldecode($path[$i]);
                    $val = isset($path[$i + 1]) ? urldecode($path[$i + 1]) : null;
                    $params[$key] = $val;
                }
            }
        }

        $this->_values = $values + $params;        
        return $this->_values + $this->_defaults;
    }    
}


Ik heb het nu zo in gedachte dat elk component (content, news etc.) zijn eigen module heeft. In deze module zit het gebruikers en admin gedeelte + alle template files. Bij een flexibel CMS leek mij dat erg handig omdat je op die manier maar 1 map hoeft over te zetten voor het complete component.
Als je nu naar (bijv.) /content gaat neemt hij de normale route. Als je naar /admin/content gaat past hij de controller naam aan naar indexAdmin (index is default). Zover ik nu kan zien gaat het goed !
Pagina: 1