2010-11-19 5 views
1

Betrachten Sie diese Route in bootstrap.php ...Was soll ich mit Kohana 3 tun, damit die Bindestriche der Routenaktionen zu Unterstrichen werden?

Route::set('crud', 'staff/<controller>(/<action>(/<id>))', array(
      'controller' => '(activities|users|default-emails)', 
      'action' => '(new|view|modify|delete)', 
      'id' => '\d+' 
    ))->defaults(array(
     'directory' => 'staff', 
     'action' => 'view' 
    )); 

Die default-emails versucht, die action_default-emails() Methode auszuführen, die nicht offensichtlich tut und nicht existieren kann.

Welchen Teil von Kohana sollte ich erweitern, um diesen Bindestrich intern in einen Unterstrich zu mappen?

Sollte ich besorgt sein, dass, wenn ich dies tue, es sowohl über _ als auch - abgegrenzte Routen erreichbar sein wird?

Danke.

Antwort

3

Die einfachste ist Kohana_Request::execute()@1112

$class->getMethod('action_'.$action)->invokeArgs($controller, $this->_params); 

Änderung

$class->getMethod('action_'.str_replace('-', '_', $action))->invokeArgs($controller, $this->_params); 

Aber Sie verstehen, zu hacken, dass Sie diesen Patch in jeder nächsten kohana Version zu tun haben.

Weitere harmlos könnte Kohana_Route::matches()

class Route extends Kohana_Route 
{ 
    public function matches($uri) 
    { 
     $matches = parent::matches($uri); 
     if (isset($matches['action'])) 
     { 
      $matches['action'] = str_replace('-', '_', $matches['action']; 
     } 
     return $matches; 
    } 
} 

Haben Sie nicht überprüfen, zu verlängern, aber ich wette, sollte es funktionieren.

+0

Danke zerkms - Ich kann später eine Feature-Anfrage einreichen. – alex

+0

@alex: es wird abgelehnt, 100% ;-) – zerkms

+1

@alex: ein anderer Weg - "Kohana_Controller" zu erweitern und '__call()' zu erstellen, das solche Fälle behandelt. – zerkms

4

Meine Lösung für Kohana 3.2 für Routing hyphenated Aktionen an den entsprechenden unterstrichenen Methode:
Kohana_Route verlängern und diesen Code

if($key == 'action') 
{ 
    $params[$key] = str_replace('-','_',$value); 
} 
else 
{ 
    $params[$key] = $value; 
} 

Voll Lösung einsetzen: eine Datei route.php Klassen in application/Create/

<?php defined('SYSPATH') or die('No direct script access.'); 

class Route extends Kohana_Route 
{ 
    public function matches($uri) 
    { 
     if ($this->_callback) 
     { 
      $closure = $this->_callback; 
      $params = call_user_func($closure, $uri); 

      if (! is_array($params)) 
       return FALSE; 
     } 
     else 
     { 
      if (! preg_match($this->_route_regex, $uri, $matches)) 
       return FALSE; 

      $params = array(); 
      foreach ($matches as $key => $value) 
      { 
       if (is_int($key)) 
       { 
        // Skip all unnamed keys 
        continue; 
       } 

       // Set the value for all matched keys 
           if($key == 'action') 
           { 
            $params[$key] = str_replace('-','_',$value); 
           } 
           else 
           { 
            $params[$key] = $value; 
           } 
      } 
     } 

     foreach ($this->_defaults as $key => $value) 
     { 
      if (! isset($params[$key]) OR $params[$key] === '') 
      { 
       // Set default values for any key that was not matched 
       $params[$key] = $value; 
      } 
     } 

     return $params; 
    } 
} 
+0

Dies ist bei weitem der sauberste Weg, den ich je gemacht habe, einschließlich meiner Bedürfnisse besser zu sein als die Lösungen, die vom Kohana - Kernteam vorgeschlagen wurden (ich bin kein Fan davon, einen Regex oder Callback in jede einzelne Route zu setzen erreichen, was mit einer erweiterten Klasse leicht gemacht werden kann). Ich musste einige Änderungen vornehmen, um es mit Kohana 3.3 zu arbeiten, aber der _Approach_ der Erweiterung der Klasse und das Anpassen der Matching-Funktion funktioniert großartig. –

1

Eine Aktualisierung der Methode von zerkms. In Kohana 3.2, müssen Sie die Datei system/classes/kohana/request/client/internal.phpZeile 106 bearbeiten.

ersetzen:

$action = $request->action(); 

Von:

$action = str_replace('-', '_', $request->action()); 

ich Hacking-Frameworks nicht mögen, aber das ist bei weitem der einfachste und zuverlässigste Lösung. Das Umbenennen der Aktion in der Route-Klasse kann zu allen möglichen Problemen führen, weil die Aktion dann irgendwann my_action (intern) und irgendwann my-action (in Links) aufgerufen wird.

3

Seit Kohana 3.3 herauskam, funktioniert diese Methode nicht mehr. Ich habe eine Lösung gefunden, die bisher für mich funktioniert.

Beim Aktualisieren auf 3.3 müssen Sie die Anforderungsdatei Internal.php nicht bearbeiten. Stattdessen können Sie einen Routenfilter erstellen. Alles, was Sie tun müssen, ist Bindestrich in der Aktion zu einem Unterstrich zu ersetzen.

Route::set('default', '(<controller>(/<action>(/<id>)))') 
    ->filter(function($route, $params, $request) { 
     // Replacing the hyphens for underscores. 
     $params['action'] = str_replace('-', '_', $params['action']); 
     return $params; // Returning an array will replace the parameters. 
    }) 
    ->defaults(array(
     'controller' => 'welcome', 
     'action'  => 'index', 
    )); 

Dies funktioniert natürlich nur für die Methoden. Wenn Sie jedoch ein wenig weiter untersuchen, können Sie eine bessere Funktion für das Verzeichnis, den Controller usw. erstellen.