2012-06-04 37 views
2

在我的應用我記錄在數據庫中的所有頁面瀏覽,這樣的事情在AppController中:如何檢查控制器和操作是否真的存在?

$this->Link->save(array(
    'controller' => $this->request->params['controller'], 
    'action' => $this->request->params['action'], 
    'var1' => $this->request->params['pass'][0], 
    'var2' => $this->request->params['pass'][1] 
)); 

,工作正常,但一些網址的人(或機器人)的輸入是404。我如何檢查這些鏈接是否真實。

我得到的很多請求都來自同一個域上的以前的網站,請求/圖片等Cake認爲是一個控制器。

我不介意檢查是在進入數據庫之前發生的,還是從視圖中的數據庫中檢索之後發生的。

謝謝!

回答

1

有沒有這個我試過,但你可以嘗試調用Router::parse()

您提供完整的URL,並且返回值將是蛋糕的路線陣列在這裏你可以看到控制器的價值觀,行爲等

+0

@Jleagle:對不起,有點查詢股價的有..'路由器::解析()'是正確的,我已經更新了答案。 –

+1

但它並沒有告訴控制器和/或動作是否真的存在,這是我猜的問題!如果你的請求HTTP:// // YOURDOMAIN一些/事/這將打印: \t陣列 \t( \t \t [控制器] =>一些 \t \t [動作] =>事 \t \t [命名] =>數組 \t \t \t( \t \t \t) \t \t [通過] =>數組 \t \t \t( \t \t \t \t [0] =>在這裏 \t \t \t) \t \t [插件] => \t) –

0

更新2:調度

之前捕獲請求可悲的是,下面這段代碼是CakePHP的2.2,如果你升級。 see manual page for Dispatch Filters

<?php 
App::uses('DispatcherFilter', 'Routing'); 
class HttpCacheFilter extends DispatcherFilter { 

    public function beforeDispatch($event) { 
     $request = $event->data['request']; 

     if ($request->params['controller'] !== 'pages') { 
      die('not found'); 
     } 
    } 
} 

原來的答案:

你不應該檢查什麼,從CakePHP會爲你擺在首位。

在生產模式下(即debug = 0),CakePHP將爲任何未定義的控制器和/或操作發出NotFoundException()

在開發模式下,CakePHP非常友好,可以爲您提供更明確的消息。

所以請Configure::write('debug',0);實驗core.php

希望這有助於!

+0

是的,它會告訴你,當你瀏覽網頁,但我試圖阻止人們永遠進入頁面:) – 472084

+0

@Jagle:然後調度過濾器是最cakephp的路要走,我想是的,看到我更新的答案 –

0

基於從http://www.cleverweb.nl/cakephp/list-all-controllers-in-cakephp-2/的洞察力應該這樣做。

function check($controller, $action) { 
    $controller = Inflector::camelize($controller); 
    App::import('Controller', $controller.'Controller'); 
    $aMethods = get_class_methods($controller.'Controller'); 
    if($aMethods) { 
    foreach ($aMethods as $idx => $method) { 
     if($action==$method) return true; 
    } 
    } else { 
    //this is probably NOT a controller! 
    } 
    return false; 
} 

,然後調用它像下面,在AppController中,也許在beforeFilter:

$this->check($this->request->params['controller'], $this->request->params['action']); 
+0

這工作相當不錯,但可以重構到 功能檢查($ controller,$ action){$ controller = In flector :: camelize($控制器) '控制器'。 App :: import('Controller',$ controller); return method_exists($ controller,$ action); }' 此外,可能不考慮插件,但這似乎對我來說不是問題。 – Omnilord

相關問題