IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MVC PHP Discussion :

URL rewriting


Sujet :

MVC PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Mars 2006
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 70
    Par défaut URL rewriting
    Bonjour à tous,

    Après avoir fait un site avec une structure MVC à ma sauce mais quand même inspirée des tutos de Developpez.com, je me suis dit qu'il serait plus judicieux de franchement utiliser un framework qui a la chance d'être connu par quelqu'un d'autre afin de faciliter la maintenance future de mon application.

    Je me lance donc dans Zend depuis 2 jours et j'ai voulu faire une appli qui affiche simplement 2 pages complètements statiques à partir de 2 controllers différents.
    Malheureusement, comme pour certains avant moi et sûrement d'autres après moi, les pages ne sont pas trouvées.

    Voici mon projet :
    1 fichier application.ini dans application/configs/
    2 controllers IndexController.php et PersonnesController.php dans application/controllers/
    1 fichier index.phtml dans application/views/scripts/index/
    1 fichier index.phtml dans application/views/scripts/personnes

    application.ini :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    [production]
     
    ; Initilisation du report d erreurs pour le mode production
    phpSettings.display_startup_errors = 0
    phpSettings.display_errors = 0
     
    ; Include Path
    includePaths.library = APPLICATION_PATH "/../library"
     
    ; Bootstrap
    bootstrap.class = "Bootstrap"
    bootstrap.path = APPLICATION_PATH "/Bootstrap.php"
     
     
    ;appnamespace = "Application"
     
     
    ;resources.frontController.params.displayExceptions = 0
    ;resources.frontController.params.prefixDefaultModule = "1"
     
    ; Initialisation frontController / des modules
    resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"
    ;resources.frontController.moduleDirectory = APPLICATION_PATH "/modules"
    ;resources.modules[] = ""
    resources.frontController.defaultControllerName = "index"
    resources.frontController.defaultAction = "index"
     
     
    ; Views
    resources.view.encoding = "UTF-8"
     
     
    ; Définition de la timezone
    phpsettings.date.timezone = "Europe/Paris"
     
     
    [staging : production]
     
    [testing : production]
    phpSettings.display_startup_errors = 1
    phpSettings.display_errors = 1
     
    [development : production]
    phpSettings.display_startup_errors = 1
    phpSettings.display_errors = 1
    resources.frontController.params.displayExceptions = 1
    IndexController.php :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    <?php
     
    class IndexController extends Zend_Controller_Action
    {
     
    	public function indexAction()
    	{
    		$this->view->maVar = 'Welcome Index';
    	}
     
    }
    PersonnesController.php :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    <?php
     
    class PersonnesController extends Zend_Controller_Action
    {
     
    	public function indexAction()
    	{
    		$this->view->maVar = 'Welcome Personnes';
    	}
     
    }
    /index/index.phtml :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    <html>
    	<head>
    		<meta http-equiv="content-type" content="text/html; charset=utf-8" />
    	</head>
    	<body>
    		<a href="http://localhost/zfcomptaV2/index/index">index</a>
    		<a href="http://localhost/zfcomptaV2/personnes/index">personnes</a>
    		<div id="welcome">
    			<h1>Bienvenue sur l'application ZF - Index</h1>
    			<?php echo $this->maVar; ?>
    		</div>
    	</body>
    </html>
    /personnes/index.phtml :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    <html>
    	<head>
    		<meta http-equiv="content-type" content="text/html; charset=utf-8" />
    	</head>
    	<body>
    		<a href="http://localhost/zfcomptaV2/index/index">index</a>
    		<a href="http://localhost/zfcomptaV2/personnes/index">personnes</a>
    		<div id="welcome">
    			<h1>Bienvenue sur l'application ZF - Personnes</h1>
    			<?php echo $this->maVar; ?>
    		</div>
    	</body>
    </html>
    Bootstrap.php :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
    {
     
    	//initilisation de l'autoloader pour une structure sans module
    	protected function _initAutoload()
    	{
    		$moduleLoader = new Zend_Application_Module_Autoloader (
    		array ('namespace' => '', 'basePath' => APPLICATION_PATH ) );
    		return $moduleLoader;
    	}
     
    	protected function _initView()
    	{
    		// Initialisation de la vue
    		$view = new Zend_View;
    		$view->doctype('XHTML1_STRICT');
    		$view->headTitle('Mon application avec Zend_Application');
     
    		// Ajoutons le au ViewRenderer
    		$viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper('ViewRenderer');
    		$viewRenderer->setView($view);
     
    		// Retournons le, il sera stocké dans un registre par le bootstrap
    		// pour utilisation future
    		return $view;
    	}
     
    //	protected function _initDefaultNamespace()
    //	{
    //		$this->bootstrap('frontcontroller');
    //		$fc = $this->getResource('frontcontroller');
    //		$defaultModule = $fc->getControllerDirectory($fc->getDefaultModule());
    //
    //		new Zend_Application_Module_Autoloader(array(
    //			'namespace' => '', // pas de namespace
    //			'basePath'  => APPLICATION_PATH . $defaultModule,
    //		));
    //	}
     
    	/**
    	* Initialize session
    	*
    	* @return Zend_Session_Namespace
    	*/
    	protected function _initSession()
    	{
    		// On initialise la session
    		$session = new Zend_Session_Namespace ( 'ecommerce', true );
    		Zend_Registry::set('session',$session);
    		return $session;
    	}
     
     
    	public function run()
    	{
    		// Cela permet d'avoir le fichier de configuration disponible depuis n'importe ou dans l'application.
    		Zend_Registry::set ( 'config', new Zend_Config ( $this->getOptions () ) );
    		parent::run ();
    	}
     
     
    }
    /public/.htaccess :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SetEnv APPLICATION_ENV development
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} -s [OR]
    RewriteCond %{REQUEST_FILENAME} -l [OR]
    RewriteCond %{REQUEST_FILENAME} -d
    RewriteRule ^.*$ - [NC,L]
    RewriteRule ^.*$ index.php [NC,L]
    /public/index.php :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    <?php
     
    // Define path to application directory
    defined('APPLICATION_PATH')
        || define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application'));
     
    // Define application environment
    defined('APPLICATION_ENV')
        || define('APPLICATION_ENV', (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'production'));
     
    // Ensure library/ is on include_path
    set_include_path(implode(PATH_SEPARATOR, array(
        realpath(APPLICATION_PATH . '/../library'),
        get_include_path(),
    )));
     
    /** Zend_Application */
    require_once 'Zend/Application.php';
     
    // Create application, bootstrap, and run
    $application = new Zend_Application(
        APPLICATION_ENV,
        APPLICATION_PATH . '/configs/application.ini'
    );
    $application->bootstrap()
                ->run();

    Voilà, vous avez tout.
    En fait, je pense que c'est plutôt l'URL rewriting qui ne va pas, à vous de me le confirmer.
    Pourtant, mon fichier httpd.conf doit bien être configuré puisque j'utilise sans problème l'url rewriting pour une autre appli, mais qui n'est pas basé sur les principes de ZendFramework.

    D'avance merci pour votre aide.

  2. #2
    Membre confirmé
    Inscrit en
    Mars 2006
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 70
    Par défaut
    Bonjour, c'est encore moi.
    J'ai à nouveau parcouru plusieurs forum mais je n'ai pas trouvé la réponse à ma question.

    Précisions :
    Ma config est la suivante. J'ai EasyPHP version portable de novembre 2009 qui est sur :
    D:\Mes Documents\Program Files Portables\EasyPHP5.3.0/
    C'est bizarre mais j'avais besoin d'avoir mon serveur sur une clé USB et je fais du PHP sans problème depuis plusieurs mois, avec de l'URL rewriting, (LoadModule rewrite_module modules/mod_rewrite.so est bien décommenté)

    Mes projets sont sur :
    D:\Mes Documents\www/ donc le projet en question est sur :
    D:\Mes Documents\www/zfComptaV2/

    J'ai donc des alias, celui-là est configuré ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Alias "/zfcomptaV2" "D:/Mes documents/www/zfComptaV2"
    <Directory "D:/Mes documents/www/zfComptaV2">
    Options FollowSymLinks Indexes
    AllowOverride All
    Order deny,allow
    Allow from 127.0.0.1
    Deny from all
    </Directory>

    Ensuite, est-ce que j'ai bien compris le fonctionnement de Zend ?
    J'ai compris que si j'ai l'URL
    http://localhost/zfcomptaV2/personnes/index/
    alors ça m'affiche la page par défaut (indexAction) appelée par le controller PersonnesController.

    et si j'ai
    http://localhost/zfcomptaV2/index/index/
    alors ça m'affiche la page par défaut (indexAction) appelée par le controller IndexController.

    C'est bien ça ?


    En réalité, voilà ce que j'ai :

    avec l'url http://localhost/zfcomptaV2/
    j'obtiens la liste des rép et fichiers physiques (pas de redirection active ???)

    avec l'url http://localhost/zfcomptaV2/public
    j'obtiens bien ma page générée par IndexController

    avec les url
    http://localhost/zfcomptaV2/index
    http://localhost/zfcomptaV2/index/index
    http://localhost/zfcomptaV2/personnes
    http://localhost/zfcomptaV2/personnes/index
    j'ai une erreur 404.

    Et voici un exemple de log apache correspondant :
    [Wed Apr 14 10:44:33 2010] [error] [client 127.0.0.1] File does not exist: D:/Mes Documents/www/zfComptaV2/personnes, referer: http://localhost/zfcomptaV2/public/

    Il y a bien une erreur quelque part, mais où ? c'est là que j'ai besoin de vos lumières.
    Merci pour votre aide

  3. #3
    Membre confirmé
    Inscrit en
    Mars 2006
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 70
    Par défaut
    Je continue à me répondre à moi-même...

    Voilà ce que j'ai compris sur le fonctionnement actuel de "ma" config :
    Les URL ne sont pas comme je le croyais mais ainsi :

    Cependant, je ne trouve pas ça très joli. Comment supprimer le "public" dans l'URL ? ça ne sert à rien.

    D'autre part, j'ai modifié mon .htaccess. Deux solutions équivalentes marchent chez moi :
    Soit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SetEnv APPLICATION_ENV development
    RewriteEngine On
    RewriteBase /zfcomptaV2
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^.*$ public/index.php [L]
    Soit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SetEnv APPLICATION_ENV development
    RewriteEngine On
    RewriteBase /zfcomptaV2/public
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^.*$ index.php [L]
    Quand je dis que ça fonctionne, c'est au moins en apparence. Je ne sais pas si ça me bloquera plus tard.


    Mesdames, Messieurs, les questions donc les suivantes :
    - Comment supprimer ce screugneugneu de "public" dans mon URL ?
    - Pourquoi dois-je mettre, moi, "public" dans le RewriteRule ou RewriteBase alors que personne ne le fait dans les tutos ou forums ?


    Merci pour vos réponse...

  4. #4
    Membre Expert Avatar de nosferapti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    1 157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 157
    Par défaut
    Citation Envoyé par basket Voir le message
    Je continue à me répondre à moi-même...
    je pars du principe que tu as trouvé les réponses aux premiers messages donc je vais juste répondre au dernier message. n'hésite pas à reposer les questions qui ne sont pas résolues dans les 1ers messages

    Citation Envoyé par basket Voir le message
    Quand je dis que ça fonctionne, c'est au moins en apparence. Je ne sais pas si ça me bloquera plus tard.
    à première vue, ça devrai fonctionner comme ça mais je ne garanti rien, peut-être que je vais me lever demain matin en me disant "ah non ça va bloquer si ont fait ça ou ça"
    dans mes essais, j'ai juste déplacé le fichier index.php un niveau au dessus et comme ça le répertoire "public" disparait

  5. #5
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 505
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 505
    Par défaut
    Comme nosferapti te le signale, c'est ton fichier index.php qui est mal placé, soit tu le déplace (attention aux liens), soit dans ton apache tu crées un VHOST en mettant comme document root /ton_répartoire_web/public et dans ce cas les routes reste correcte.

  6. #6
    Membre confirmé
    Inscrit en
    Mars 2006
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 70
    Par défaut
    Merci pour vos réponses. Au moins maintenant ça fonctionne, sans /public, et donc avec une URL plus propre selon moi.

    Là où je m'interroge, c'est que la doc (pour ce que j'en ai lu) et les tutos que j'ai consultés, voire même tous les sujets sur les forums des personnes ayant eu le même problème que moi à la base (c'est à dire que rien ne s'affiche mais pour des raisons parfois très différentes, souvent résolues en décommentant ce qui va bien dans la config apache), ne disent rien ou pas grand chose sur :
    - le principe des URL avec Zend Framework,
    - la présence systématique de /public dans les exemples récents et ses conséquences.

    J'ai clairement loupé quelque chose et je m'interroge encore : pourquoi et comment /public ?
    Si quelqu'un a la réponse à mes problèmes existentiels, qu'il n'hésite pas.


    Bref, encore merci, et à la prochaine car c'est certain, j'aurai d'autres questions !!


    EDIT : voilà comment j'ai fait :
    - remontée de index.php et .htaccess d'un cran
    - suppression de la référence à "public" dans .htaccess
    - modification des liens impactés : la déclaration de APPLICATION_PATH dans index.php. Nouvelle ligne :
    defined('APPLICATION_PATH')
    || define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/application'));

Discussions similaires

  1. [Débutant]infos ds session sans cookie ? url rewriting ?
    Par Satanas_et_diabolo dans le forum ASP
    Réponses: 8
    Dernier message: 10/10/2006, 17h13
  2. url rewriting
    Par olive.m dans le forum Apache
    Réponses: 3
    Dernier message: 17/06/2005, 02h01
  3. .htaccess - url rewriting, besoin de conseils
    Par giminik dans le forum Apache
    Réponses: 2
    Dernier message: 25/04/2005, 20h18
  4. Activer l'url rewriting
    Par Otaugames dans le forum Apache
    Réponses: 2
    Dernier message: 09/03/2005, 14h58
  5. Url Rewriting / htaccess
    Par bisi dans le forum Apache
    Réponses: 4
    Dernier message: 25/07/2004, 22h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo