ZF: Invalid controller specified (error)

Pagina: 1
Acties:

Onderwerpen


  • bas_vdl
  • Registratie: Mei 2004
  • Laatst online: 24-04 00:01
Hallo,

ik heb een aantal tutorials gevolgt over het opzetten van het zend framework. nu heb ik een simpele portfolio applicatie gebouwd maar ik krijg een error waar ik niet meet uit de voeten kan.

hieronder de error en de betreffende files.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
./portfolio
    ./application
        ./controllers
             IndexContreoller.php
        ./models
        ./views
            ./helpers
            ./filters
            ./scripts
                ./index
                       index.phtml
    ./library
        ./Zend
    ./public
         index.php


ERROR:
code:
1
Fatal error: Uncaught exception 'Zend_Controller_Dispatcher_Exception' with message 'Invalid controller specified (error)' in C:\Wampserver\www\portfolio\library\Zend\Controller\Dispatcher\Standard.php:241 Stack trace: #0 C:\Wampserver\www\portfolio\library\Zend\Controller\Front.php(934): Zend_Controller_Dispatcher_Standard->dispatch(Object(Zend_Controller_Request_Http), Object(Zend_Controller_Response_Http)) #1 C:\Wampserver\www\portfolio\public\index.php(35): Zend_Controller_Front->dispatch() #2 {main} thrown in C:\Wampserver\www\portfolio\library\Zend\Controller\Dispatcher\Standard.php on line 241


index.php
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
<?php

/**
 * @author Bas van de Lustgraaf
 * @copyright 2008
 */

// full error reporting
error_reporting( E_ALL );

set_include_path( 'C:/Wampserver/www/portfolio/library' );

//includes
include_once ( 'Zend/Loader.php' );

//load the classes
Zend_Loader::loadClass( 'Zend_Controller_Front' );
Zend_Loader::loadClass( 'Zend_Db' );
Zend_Loader::loadClass( 'Zend_Db_Table' );

//configure the database
$options = array( 'host' => 'localhost', 'username' => 'root', 'password' => '',
    'dbname' => 'portfolio' );

$db = Zend_Db::factory( 'PDO_MYSQL', $options );
Zend_Db_Table::setDefaultAdapter( $db );

//configure the front controller
$controller = Zend_Controller_Front::getInstance();
$controller->setControllerDirectory( './application/controllers' );

$controller->setParam( 'noViewRenderer', true );

//run the controller
$controller->dispatch();

?>


IndexController.php
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
<?php

/**
 * @author Bas van de Lustgraaf
 * @copyright 2008
 */

class IndexController extends Zend_Controller_Action
{

    public function init()
    {
        $this->initView();

        //variablen declaren in header,menu en footer
        $this->view->url = $this->_request->getBaseUrl();
        $this->view->stylesPath = $this->view->url . '/public/styles/';
    }

    public function indexAction()
    {

        $this->view->paginaTitel = 'Startpagina';
        $this->view->titel = 'Welkom op mijn portfolio :]';
        $this->render();

    }

    public function infoAction()
    {

        $this->view->paginaTitel = 'Informatie';
        $this->view->titel = 'Informatie pagina :]';
        $this->render();

    }

    public function contactAction()
    {

        $this->view->paginaTitel = 'Contact';
        $this->view->titel = 'Neem contact met ons op :]';
        $this->render();

    }

}

?>

  • Tiemez
  • Registratie: December 2003
  • Laatst online: 24-10-2022
IndexContreoller.php moet uiteraard IndexController.php zijn en volgens mij mis je de ErrorController

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
class ErrorController extends Zend_Controller_Action
{

    /**
     * This action handles  
     *    - Application errors
     *    - Errors in the controller chain arising from missing 
     *      controller classes and/or action methods
     */
    public function errorAction()
    {
        $errors = $this->_getParam('error_handler');
        switch ($errors->type) {
            case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_CONTROLLER:
            case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ACTION:
                // 404 error -- controller or action not found                
                $this->getResponse()->setRawHeader('HTTP/1.1 404 Not Found');
                $this->view->title = 'HTTP/1.1 404 Not Found';
                break;
            default:
                // application error; display error page, but don't change                
                // status code
                $this->view->title = 'Application Error';
                break;
        }
        
        $this->view->message = $errors->exception;
    }
}

[ Voor 83% gewijzigd door Tiemez op 27-11-2008 12:31 ]


  • bas_vdl
  • Registratie: Mei 2004
  • Laatst online: 24-04 00:01
Tiemez schreef op donderdag 27 november 2008 @ 12:30:
IndexContreoller.php moet uiteraard IndexController.php zijn en volgens mij mis je de ErrorController
ik heb je errorcontroller ingebouwd maar de error verdwijnt niet.

http://localhost/portfolio/public/, geeft die error dus

ga ik naar

http://localhost/portfolio/public/index/, dan krijg ik 404 Not Found (The requested URL /portfolio/public/index/ was not found on this server.)

[ Voor 40% gewijzigd door bas_vdl op 27-11-2008 12:35 ]


  • Tiemez
  • Registratie: December 2003
  • Laatst online: 24-10-2022
verander
PHP:
1
$controller->setControllerDirectory( './application/controllers' );


eens naar

PHP:
1
$controller->setControllerDirectory( '../application/controllers' );

  • bas_vdl
  • Registratie: Mei 2004
  • Laatst online: 24-04 00:01
Warmer...

Fatal error: Class 'Zend_Controller_Action' not found in C:\Wampserver\www\portfolio\application\controllers\IndexController.php on line 8

deze regel dus: class IndexController extends Zend_Controller_Action

  • Tiemez
  • Registratie: December 2003
  • Laatst online: 24-10-2022
bas_vdl schreef op donderdag 27 november 2008 @ 13:34:
Warmer...

Fatal error: Class 'Zend_Controller_Action' not found in C:\Wampserver\www\portfolio\application\controllers\IndexController.php on line 8

deze regel dus: class IndexController extends Zend_Controller_Action
dan moet je die class includen :)

PHP:
1
require_once 'Zend/Controller/Action.php';

  • bas_vdl
  • Registratie: Mei 2004
  • Laatst online: 24-04 00:01
Tiemez schreef op donderdag 27 november 2008 @ 13:37:
[...]


dan moet je die class includen :)

PHP:
1
require_once 'Zend/Controller/Action.php';
aah ok, dacht dat je met Zend/Loader.php alles had.

[ Voor 174% gewijzigd door bas_vdl op 27-11-2008 13:44 ]


  • Tiemez
  • Registratie: December 2003
  • Laatst online: 24-10-2022
bas_vdl schreef op donderdag 27 november 2008 @ 13:40:
[...]


aah ok, dacht dat je met Zend/Loader.php alles had
nope,

http://framework.zend.com...der.html#zend.loader.load

Je moet dan
PHP:
1
Zend_Loader::registerAutoload();
gebruiken in je index.php

  • bas_vdl
  • Registratie: Mei 2004
  • Laatst online: 24-04 00:01
ok thnx! begin het nu een beetje te begrijpen, wel alstig allemaal :$

volgende probleempje

ik heb ook een tweede controller GalleryController.php
ga ik naar http://localhost/portfolio/public/gallery/ dan krijg ik een 404.

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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
<?php

/**
 * @author Bas van de Lustgraaf
 * @copyright 2008
 */

class GalleryController extends Zend_Controller_Action
{

    public function init()
    {
        $this->initView();

        //variablen declaren in header,menu en footer
        $this->view->url = $this->_request->getBaseUrl();
        $this->view->stylesPath = $this->view->url . '/public/styles/';

    }

    public function indexAction()
    {

        $projects = new Projects();

        //get the results and show them on the screen
        $this->view->projects = $projects->fetchAll();

        $this->view->paginaTitel = 'Gallery';
        $this->view->titel = 'Overzicht van alle projecten :]';
        $this->render();

    }

    public function viewAction()
    {

        $projects = new Projects();

        //get id and fetch the record of the database
        $id = ( int )$this->_request->getParam( 'id' );
        $row = $projects->fetchRow( 'id = ' . $id );

        $this->view->paginaTitel = $row->titel;
        $this->view->id = $row->id;
        $this->view->titel = $row->titel;
        $this->view->omschrijving = $row->omschrijving;
        $this->view->status = $row->status;
        $this->render();

    }

    public function addAction()
    {

        if ( $this->_request->isPost() ) {

            //call model
            $projects = new Projects();

            $data = array( 'titel' => $this->_request->getPost('titel'), 'omschrijving' => $this->
                _request->getPost('omschrijving'), 'status' => $this->_request->getPost('status') );

            //data invoegen en de persoon redirecten
            $projects->insert( $data );
            $this->_redirect( './gallery/' );

        } else {
            $this->view->paginaTitel = 'Project toevoegen';
            $this->view->titel = 'Voeg een project toe :]';
        }

        $this->render();

    }

    public function editAction()
    {

        //call model
        $projects = new Projects();

        //formulier
        if ( $this->_request->isPost() ) {

            $data = array( 'titel' => $this->_request->getPost('titel'), 'omschrijving' => $this->
                _request->getPost('omschrijving'), 'status' => $this->_request->getPost('status') );

            //data updaten en de persoon redirecten
            $projects->update( $data, 'id = ' . (int)$this->_request->getParam('id') );
            $this->_redirect( './gallery/' );

        } else {
            //data ophalen
            $row = $projects->fetchRow( 'id = ' . (int)$this->_request->getParam('id') );
            $this->view->paginaTitel = 'Project ' . $row->titel . ' bewerken';
            $this->view->titel = 'Bewerk ' . $row->titel;
            $this->view->id = $row->id;
            $this->view->ptitel = $row->titel;
            $this->view->omschrijving = $row->omschrijving;
        }

        $this->render();

    }

    public function deleteAction()
    {
        //call model
        $project = new Projects();

        //delete
        if ( $this->_request->getParam('confirm') == 1 ) {
            $project->delete( 'id = ' . $this->_request->getParam('id') );
            $this->_redirect( './gallery/' );
        } else {
            $row = $project->fetchRow( 'id = ' . $this->_request->getParam('id') );
            $this->view->paginaTitel = 'Project verwijderen';
            $this->view->titel = 'Project verwijderen';
            $this->view->id = $row->id;
            $this->view->ptitel = $row->titel;
            $this->render();
        }

    }

}

?>

  • Tiemez
  • Registratie: December 2003
  • Laatst online: 24-10-2022
Daar geld w.s. hetzelfde voor... ;)

Overigens moet je voor al je Models (Projects b.v.) een aparte include doen.

  • bas_vdl
  • Registratie: Mei 2004
  • Laatst online: 24-04 00:01
Tiemez schreef op donderdag 27 november 2008 @ 13:55:
Daar geld w.s. hetzelfde voor... ;)

Overigens moet je voor al je Models (Projects b.v.) een aparte include doen.
ok die include heb ik gedaan
//load the model
include '../models/projects.php';

maar de twee aanpassingen die we net hebben gedaan in de index.php lijken me niet de oplossing vor dit probleem.

miss. die .htaccess die de routerning van de url niet goed doet ofzo :?

[ Voor 25% gewijzigd door bas_vdl op 27-11-2008 14:09 ]


  • OxiMoron
  • Registratie: November 2001
  • Laatst online: 08-07 14:27
Heb je wel een .htaccess file?


En de Zend_Loader laad niet je models in, dat is puur bedoelt voor alles in de library map :)

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


  • bas_vdl
  • Registratie: Mei 2004
  • Laatst online: 24-04 00:01
OxiMoron schreef op donderdag 27 november 2008 @ 14:13:
Heb je wel een .htaccess file?


En de Zend_Loader laad niet je models in, dat is puur bedoelt voor alles in de library map :)
ja meerdere

in de root:
RewriteEngine on
RewriteRule .* index.php

in /public
RewriteEngine off

in /application en /library
deny from all

die include staat nu boven in de GalleryController.php

  • OxiMoron
  • Registratie: November 2001
  • Laatst online: 08-07 14:27
Ehhmm.. dat klopt dus al niet..

Het idee van het framework is dat je public folder de document root is. Dan heb je ook alleen daar een .htaccess nodig die alles behalve bestaande bestanden naar de index.php redirect.


code:
1
2
3
4
5
6
7
8
RewriteEngine On

RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d

RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ /index.php [NC,L]


Dus http://www.jesite.nl zou uit moeten komen in de public map.

Als dit echt niet kan dat moet je bovenstaande nog steeds in je public map zetten en in de document root een .htaccess zetten die alles redirect naar de public map.

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


  • bas_vdl
  • Registratie: Mei 2004
  • Laatst online: 24-04 00:01
OxiMoron schreef op donderdag 27 november 2008 @ 14:30:
Ehhmm.. dat klopt dus al niet..

Het idee van het framework is dat je public folder de document root is. Dan heb je ook alleen daar een .htaccess nodig die alles behalve bestaande bestanden naar de index.php redirect.


code:
1
2
3
4
5
6
7
8
RewriteEngine On

RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d

RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ /index.php [NC,L]


Dus http://www.jesite.nl zou uit moeten komen in de public map.

Als dit echt niet kan dat moet je bovenstaande nog steeds in je public map zetten en in de document root een .htaccess zetten die alles redirect naar de public map.
htacces in de root:
Redirect /portfolio http://localhost/portfolio/public/

en in de public staat een .htaccess met jou voorbeeldje

  • RAJH
  • Registratie: Augustus 2001
  • Niet online
Dan moet je in de .htaccess van /public/ nog even een RewriteBase toevoegen, omdat anders alle rewrites worden doorverwezen naar http://localhost/index.php

  • bas_vdl
  • Registratie: Mei 2004
  • Laatst online: 24-04 00:01
RAJH schreef op donderdag 27 november 2008 @ 14:47:
Dan moet je in de .htaccess van /public/ nog even een RewriteBase toevoegen, omdat anders alle rewrites worden doorverwezen naar http://localhost/index.php
dat gaat me ff te snel...

welke regel moet in /public/.htaccess?

[ Voor 4% gewijzigd door bas_vdl op 27-11-2008 14:57 ]


  • !null
  • Registratie: Maart 2008
  • Laatst online: 11-09 14:00
Lichtelijk offtopic: Heeft dat een naam, die manier van architectuur beheren zodat je nooit een extensie ziet?
Dus jesite.nl/onderwerp/nogiets/item3 zonder dat je ooit een bestand en of extensie naam ziet. Ik snap dat de webserver dat verbergt, hij laat nooit de index bestandsnaam zien van een map. Maar de functie, dat de framework het ondersteund.
(of doet ieder framework dit tegenwoordig?)

Ampera-e (60kWh) -> (66kWh)


  • bas_vdl
  • Registratie: Mei 2004
  • Laatst online: 24-04 00:01
GreenSky schreef op donderdag 27 november 2008 @ 15:06:
Lichtelijk offtopic: Heeft dat een naam, die manier van architectuur beheren zodat je nooit een extensie ziet?
Dus jesite.nl/onderwerp/nogiets/item3 zonder dat je ooit een bestand en of extensie naam ziet. Ik snap dat de webserver dat verbergt, hij laat nooit de index bestandsnaam zien van een map. Maar de functie, dat de framework het ondersteund.
(of doet ieder framework dit tegenwoordig?)
ze noemen dat SEF, search engine friendly. google en je vindt heel veel.

http://www.webconfs.com/url-rewriting-tool.php hier kun je .htaccess file genereren die dat doen

[ Voor 7% gewijzigd door bas_vdl op 27-11-2008 15:23 ]


  • !null
  • Registratie: Maart 2008
  • Laatst online: 11-09 14:00
Ah bedankt voor de term. Ik kende het idee natuurlijk al, wordt vaak toegepast. Vind het ook wel mooi staan. Dan is het ook niet direct te zien wat voor taal etc je gebruikt. En als je het niet over een webwinkel of forum hebt kan je ook veel 'mooiere' links maken.

Ampera-e (60kWh) -> (66kWh)


  • RAJH
  • Registratie: Augustus 2001
  • Niet online
bas_vdl schreef op donderdag 27 november 2008 @ 14:56:
[...]


dat gaat me ff te snel...

welke regel moet in /public/.htaccess?
Je moet daarin verwijzen naar de index.php uit de /portfolio/public map. In je .htaccess zet je dan:

code:
1
RewriteBase /portfolio/public


Zie ook RewriteBase.
Pagina: 1