2010-02-10 5 views
3

Je voudrais garder mon numéro de port qui est différent sur l'environnement de production et de développement, mais les appels à l'aide d'url basé sur mes itinéraires zend oublier le numéro de port.Zend Nom d'hôte Routeur et url helper: port perdant

Mes itinéraires sont un tas de routes regexp, enchaînant avec les routes de nom d'hôte par défaut, principalement pour multilangue sur une configuration multidomaine (court aperçu ci-dessous).

<?php 
    $routecateg = new Zend_Controller_Router_Route_Regex('cat/(\w+)_([^_]+)(?:_page_(\d+))?(?:_par_(\d+))?(?:.html)?', 
    array(1 =>'',2=>'',3=>'1',4=>'20','controller' =>'list','action'=>'categ'), 
    array(1 =>'categid',2=>'categname',3=>'page',4=>'par'), 
    'cat/%s_%s_page_%d_par_%d.html' 
); 

$routeindex= new Zend_Controller_Router_Route_Regex('(index|home)?', 
    array('controller' =>'index','action'=>'home'), 
    array(), 
    'index' 
);  

$hostRouteRepository = new Zend_Controller_Router_Route_Hostname(
    ':lang.'.$config->serverurl 
); 
$router ->addRoute('index',$hostRouteRepository->chain($routeindex)); 
$router ->addRoute('categ',$hostRouteRepository->chain($routecateg)); 
?> 

Où serverURL $ config-> est juste le nomdomaine en fonction de l'environnement et configuré dans mon dossier application.ini.

Sur mon serveur de production, il est ok, comme je suis en cours d'exécution sur le port par défaut 80, mais developmenet, je dois courir sur un port différent, et chaque fois que j'appelle mon aide url, numéro de port est oublié.

Je sais que je peux contourner par une meilleure configuration de mon serveur apache, mais je suis surpris de ne pas trouver des solutions à ce problème.

Répondre

2

Voici ce que je trouve:

Si vous passez quelque chose comme ': lang.example.com: 8888' ou ': lang.example.com: port' au constructeur de Zend_Controller_Router_Route_Hostname, la partie port de won ne pas être correctement analysé (com: 8888 ou com: port). Cela est dû au fait que la chaîne est explosée avec le '.' caractère et que le caractère hostVariable (« : ») n'est vérifié que le premier caractère des parties éclatées en construction:

foreach (explode('.', $route) as $pos => $part) { 
      if (substr($part, 0, 1) == $this->_hostVariable) { 
       $name = substr($part, 1); 
       $this->_parts[$pos] = (isset($reqs[$name]) ? $reqs[$name] 
             : $this->_defaultRegex); 
       $this->_variables[$pos] = $name; 
      } else { 
       $this->_parts[$pos] = $part; 
       $this->_staticCount++; 
      } 
     } 

Maintenant, dans la fonction de correspondance d'itinéraire (match de fonction (demande de $)), le port numéro est mis au rebut de la demande qui empêchera les demandes valides pour correspondre à la route:

// Get the host and remove unnecessary port information 
    $host = $request->getHttpHost(); 
    if (preg_match('#:\d+$#', $host, $result) === 1) { 
     $host = substr($host, 0, -strlen($result[0])); 
    } 

Je crois qu'il ya 3 façons différentes pour résoudre votre problème:

  1. Ajouter une option de numéro de port en yo ur fichier config.ini et inscrivez-vous à la Zend_Registry avec quelque chose comme: Zend_Registry::set('PORT_NUMBER', $this->getOption('portnumber'));
  2. corriger le code dans le match de la fonction (demande de $) pour garder le numéro de port (commentant le code ci-dessus devrait le faire)
  3. fixer le code dans le constructeur pour permettre « : port » paramétrisation de la route (vous voudrez peut-être utiliser un nécessaire ou une valeur par défaut lors de la configuration de votre itinéraire)

note: solution 2 semble plus facile que 3 mais un travail supplémentaire est nécessaire car le numéro de port sera encodé par la fonction d'assemblage:

foreach (array_reverse($host, true) as $key => $value) { 
     if ($flag || !isset($this->_variables[$key]) || $value !== $this->getDefault($this->_variables[$key]) || $partial) { 
      if ($encode) $value = urlencode($value); 
      $return = '.' . $value . $return; 

      $flag = true; 
     } 
    } 

Cela ne devrait pas arriver avec la solution 3 parce que le numéro de port est une variable.

Espérons que ça aide.

Questions connexes