2012-04-17 34 views
1

使用Cake 2.1.1。我試圖做一個cron作業來執行一個控制器的動作。哪種方法可以做到這一點?我有一個名爲admin_test的動作OffersController。我希望每2小時運行一次這個動作。目前我在app /控制檯/命令/ SyncapiShell.php做出了殼:CakePHP Shell,如何使用控制器操作

class SyncapiShell extends AppShell { 
    public $uses = array('Offer'); 

    public function main() { 
     $this->Offer->admin_test(); 
    } 
} 

但我得到一個SQLSTATE [42000]語法錯誤或訪問衝突試圖執行shell。 我還使用管理路由,auth組件和ACL。外殼是如何工作的?它忽略了身份驗證和acl權限?通常,admin_test操作只能由特定的經過身份驗證的用戶訪問。

謝謝

回答

5

不,這不是正確的方式做,但更可能是強烈的信號,你的應用程序體系結構是不好的。你應該有胖的模型和微小的控制器。

外殼:使用將像控制器和負載模型的使用屬性一樣工作。在控制器中,您應該使用模型關聯,而不是使用用途加載數千個模型。

重構您的控制器方法並將代碼移動到Offer模型中。

LayerCake

又爲何殼需要認證或管理路由?正如名字所說,shell是一個shell程序,而不是一個網站。身份驗證基本上由運行該腳本的操作系統和用戶完成。只有有權訪問shell的人才能夠運行它。

+0

看來,我住在另一個星球直到這一刻。謝謝......我一直認爲這個模型應該很瘦。我總是傾向於發揮作用並重用它們,但現在我要回顧我所有的結構。但是,對於使用問題,我在cakephp網站上說過,如果在shell中您想使用其他模型,則必須使用「uses」[鏈接](http://book.cakephp.org/2.0/)。 en/console-and-shells.html) – slacky 2012-04-17 09:15:59

+0

這對於shell是正確的。但是在控制器中,您不希望通過使用屬性添加大量模型來導致非必需的開銷,但很多人出於某種原因執行此操作。 – burzum 2012-04-17 09:36:00

+0

是的,實際上我在控制器中使用'用途'。再次感謝我已經用新邏輯重新考慮了一些模型。你的貢獻非常有幫助。現在一切都開始有了更多的意義。 – slacky 2012-04-17 10:17:31

相關問題