2010-12-18 12 views
7

Ich bin ziemlich neu in CakePHP, aber ich habe eine Frage in Bezug auf URLs und Parameter. Ich möchte in der Lage sein, eine URL zu haben, wie ein Standard-URL zB aussieht:CakePHP, GET Parameter und Routing

http://www.mysite.com/controller/myaction?arg=value&arg2=val 

ich diese URL möchte eine Aktion in meinem Controller zur Karte wie folgt:

function myaction($arg = null, $arg2 = null) 
{ 
    // do work 
} 

Ich weiß, Diese CakePHP hat Routing wie beschrieben here, aber ehrlich gesagt scheint dies überentwickelt und führt zu einer URL-Zeichenfolge, die nicht standardisiert ist.

In meiner aktuellen Situation wird die URL generiert und von einem externen System (Rechnungswesen) aufgerufen, das nichts über Kuchen weiß und das Kuchen-URL-Format nicht unterstützt.

Antwort

11

Sie können Ihre URL in einer beliebigen Form haben. Es ist nur CakePHP können Sie die Variable durch GET von der variablen $this->params['url']

function myaction() 
{ 
    if(isset($this->params['url']['arg'])) 
    $arg = $this->params['url']['arg']; 
    if(isset($this->params['url']['arg2'])) 
    $arg2 = $this->params['url']['arg2']; 
} 
+0

+1 Dank fo Deine Hilfe sonnig! – Introgy

+1

Sie wollten 'Isset' sagen, oder? is_set ist keine PHP-Funktion. –

0

Ich habe ein ähnliches Problem bestanden abzurufen. Nicht weil ich ein externes System habe, sondern weil ich nicht gerne alle Parameter in den URL-Pfad lege. In meinem Beispiel habe ich einige Suchanfragen, die zusammengestellt und an den Controller übergeben werden. IMHO sollten diese Abfragen GET-Parameter sein und nicht Teil des URL-Pfades sein.

Ein Vorteil der Verwendung von GET-Parametern ist, dass die Reihenfolge der gegebenen Parameter nicht wichtig ist, im Gegensatz zur Übergabe von Parametern über den URL-Pfad.

Um dieses Problem in allgemeiner Weise zu lösen, ich bin mit dem Wert des GET-param alle Methodenargumente zu ersetzen, wenn man mit dem gleichen Namen gegeben:

class MyController extends AppController 
{ 
    function test($var1 = null, $var2 = "content2") 
    { 
     foreach (get_defined_vars() as $key => $value) { 
      if (isset($this->params['url'][$key])) { 
       $getvalue = $this->params['url'][$key]; 
       $$key = $getvalue; 
       CakeLog::write("debug", "Setting:$key to $getvalue"); 
      } 
     } 
     CakeLog::write("debug", print_r(get_defined_vars(), true)); 
    } 
} 

Jetzt kann ich diese zugreifen Controller-Methode und übergeben Sie Parameter über GET wie folgt aus:

http://myapp/mycontroller/test?var1=foo&var2=bar 
1

Lösung in AppController für CakePHP 2.x

class AppController extends Controller { 

.... 

/*** 
    * Recupera los Named envias por URL 
    * si es null $key emtraga el array completo de named 
    * 
    * @param String $key 
    * 
    * @return mixed 
    */ 
    protected function getNamed($key=null){ 
     // Is null..? 
     if(is_string($key)==true){ 
      // get key in array 
      return Hash::get($this->request->param('named'), $key); 
     }else{ 
      // all key in array 
      return $this->request->param('named'); 
     } 
    } 
... 
}