2014-05-01 18 views
0

雖然我已經成功地爲包含$ Action/$ ID/$ OtherID的典型模式設置了一個AjaxController,但我似乎不知道如何爲$ Action設置一個模式+超過兩個參數。SilverStripe路由產生奇怪的結果與3個或更多的參數

我試圖處理簡單的 「計算器」 的網址爲:myajax/add/5/6/7

routes.yml

Director: 
rules: 
    'myajax//$action/$a/$b/$c': 'AjaxPage_Controller' 

AjaxPage.php

<?php 
class AjaxPage extends Page { 
} 

class AjaxPage_Controller extends Page_Controller { 
    public static $url_handlers = array(
     'myajax/add/$a/$b/$c' => 'add', 
    ); 
    private static $allowed_actions = array (
     'add', 
    ); 

    public function add($request){ 
     $v1 = (int) $request->param('a'); 
     $v2 = (int) $request->param('b'); 
     $v3 = (int) $request->param('c'); 
     echo json_encode(array('result' => $v1 + $v2 + $v3)); 
     return; 
    } 

} 

然後,當我訪問:myajax/add/5/6/7?debug_request=1我看到404 Page not found與以下摹調試信息:

Debug (line 250 of RequestHandler.php): Testing 'myajax/add/$a!/$b!/$c' with 'add/5/6/7' on AjaxPage_Controller 
Debug (line 250 of RequestHandler.php): Testing '$Action//$ID/$OtherID' with 'add/5/6/7' on AjaxPage_Controller 
Debug (line 258 of RequestHandler.php): Rule '$Action//$ID/$OtherID' matched to action 'handleAction' on AjaxPage_Controller. Latest request params: array ('Action' => 'add', 'ID' => '5', 'OtherID' => '6',) 
{"result":18} 
Debug (line 250 of RequestHandler.php): Testing '$Action//$ID/$OtherID' with '' on ErrorPage_Controller 
Debug (line 258 of RequestHandler.php): Rule '$Action//$ID/$OtherID' matched to action 'handleAction' on ErrorPage_Controller. Latest request params: array ('Action' => NULL, 'ID' => NULL, 'OtherID' => NULL,) 
Debug (line 184 of RequestHandler.php): Action not set; using default action method name 'index' 

正如你看到的 - 在調試信息的中間有被迴盪,儘管它的框架仍然試圖回退到一個正確的結果,併產生404

有誰知道什麼是在這裏發生(即。我在這裏犯了什麼樣的錯誤)?我認爲我已經在模式中利用了轉換點//的所有組合。每個嘗試後跟dev/build和flush

回答

1

它回落到404頁的原因是因爲$Action//$ID/$OtherID只匹配add/5/6,所以7仍然需要匹配。

至於爲什麼你的url_handler不匹配,這歸結於轉換點的作用。我將使用你的代碼來爲你解釋它。基本上,轉換點的左側被匹配消耗,右側可用於下一個控制器嘗試使用。

該網址myajax/add/5/6/7首先被髮送到Director。這裏它匹配myajax//$action/$a/$b/$c,與$action = "add",$a = "5",$b = "6"$c = "7",沒有什麼需要匹配。

由於移位點緊跟在myajax之後,當將控制權交給AjaxPage_Controller時,只有myajax右邊的部分被髮送以進一步匹配。所以AjaxPage_Controller得到add/5/6/7匹配。

這不符合myajax/add/$a/$b/$c,因爲它不具有文字myajax字符串開頭,所以$Action//$ID/$OtherID處理器上RequestHandler類嘗試。這匹配並設置了$Action = "add",$ID = "5"$OtherID = "6",剩下7個。

然後運行add操作(您可以在調試輸出中看到{"result":18})並且不返回任何內容。由於它什麼都沒有返回,因此沒有什麼可以嘗試匹配7,所以會產生一個404,因爲URL並沒有被最後一個控制器完全處理。

至於如何解決你的代碼,我將在myajax/add/$a/$b/$c URL處理器更改爲add//$a/$b/$c,爲myajax已經被消耗掉,它允許$a$b$c全部是可選的。

+0

精彩!就是這樣。非常感謝,尤其是。爲解釋。 – user776686