2008-11-20 148 views
4

將外部腳本集成到Zend Framework中的最佳方式是什麼?讓我解釋一下,因爲我可能會以錯誤的方式提問。我有一個腳本可以下載和分析一個XML文件。該腳本作爲每日cron作業運行,需要將其數據轉儲到數據庫中。將外部腳本與Zend Framework集成

我使用Zend框架的網站使用這個腳本,在我看來,最好是使用我的子類模型Zend_Db_Abstract做數據庫的添加和更新。人們如何去做這件事?我的腳本是否進入Zend組件旁邊的庫中(即library/Mine/Xmlparse.php),從而可以訪問各種ZF組件?我是否只需要在文件中包含正確的模型文件和Zend DB組件?處理這種整合的最佳方式是什麼?

回答

2

在您的庫目錄中,您應該在Zend庫文件夾旁邊有自己的庫。無論你怎麼稱呼它(MYLIB,項目,...),你應該包括它變成了Zend自動加載器和這樣做了如下:

require_once 'Zend/Loader/Autoloader.php'; 
$loader = Zend_Loader_Autoloader::getInstance(); 
$loader->registerNamespace('Project_'); 
$loader->setFallbackAutoloader(true); 
if ($configSection == 'development') 
{ 
    $loader->suppressNotFoundWarnings(false); 
} 

爲了讓您庫與ZF很好地集成和自動加載你應該堅持遵循ZF命名約定。這意味着兩件事:

  • 如果擴展現有的ZF類,請複製ZF文件夾結構以使您的文件具有除庫名以外的相同路徑和名稱。例如。 /library/Zend/Db/Abstract.php => /library/Project/Db/Abstract.php。
  • 如果您編寫自己的類,仍然堅持自動加載器的ZF命名約定來查找它們。
1

我剛剛遇到了一些可能與這個問題密切相關的東西。 This IBM developerWorks article.

作者建議在ZF層次結構中簡單地創建一個腳本文件夾,並將它作爲一個通常在ZF中使用(儘管他設置了ini路徑並調用autoload)。這很簡單嗎?只是在框架的層次結構中,包括路徑和自動加載器授予您的腳本訪問所有的好東西?

1

我不是100%確定你想問什麼,但我會盡力幫忙。如果您在任何時候將「/ path/to/zend/framework」的引用添加到您的php包含路徑中,那麼您實際上啓用了Zend Framework。從那裏,如果你這樣做:

require_once('Zend/Loader.php'); 
Zend_Loader::registerAutoload(); 

然後在你的腳本中的任何時候,你可以非常簡單,只是創造新的Zend框架的對象和Zend_Loader來加載將處理其餘部分。

Zend Framework的一個重要問題不是強迫你以某種方式做事。這就是爲什麼有時候有幾種方法可以完成同樣的事情。所以,如果你覺得你需要爲了這麼做而使你的腳本使用Zend框架,這並不是必須的。但是如果你認爲它可能會以某種方式改善你的劇本,那就去做吧。

+0

-1用於顯示使用裝載程序的棄用方式。 – markus 2009-09-28 06:17:48

1

我通常把自定義的東西,我認爲可以跨庫中的自定義文件夾中的項目使用。所以我有一個庫/ Ak33m文件夾,它的腳本可能在框架之外。

3

是的,你應該把你自己的類,可能繼承Zend框架類或添加更多的類到你自己的文件夾旁邊的庫中的Zend框架文件夾。

當您啓用了那麼Zend_Loader中國汽車裝載,類名會自動映射到您創建的類,如:

My_Db_Abstract will map to My/Db/Abstract.php . 
1

作爲ZF小白我自己,我想我明白了一些OP什麼正試圖弄清楚。所以,我只解釋一些我理解的內容,希望它對OP有幫助(或者對未來的讀者更有可能,因爲原來的問題太老了,我想象OP現在是ZF大師)。

我明白,ZF聲稱在很大程度上是「隨意使用」,這樣就不需要買成一個完整的結構,像Zend_Application的Zend_Bootstrap類,整個MVC方法等

此外,我理解類命名和文件位置的約定,可以輕鬆自動加載。例如:class App_Model_User所在的文件夾App/Model/User.php

我認爲可能是潛在的困惑是,在劇本方面,你有沒有

  • 完成的.htaccess魔力,推動所有請求public/index.php
  • 設置public/index.php
  • 創建了ApplicationBootstrap對象綁定到一個配置文件的APPLICATION_PATH,包括路徑

它可能有點不清楚如何最好地利用我們在這種情況下獲得的大部分ZF善良,並希望在另一個環境中使用。

我想我的答案,原來的問題將是的

http請求通常切入點序列 - >的.htaccess - > index.php文件 - >配置

設置了很多我們的環境,爲我們,我們需要重複一些不同的入口路徑。

因此,對於您的腳本,我的第一本能是創建一個通用的包含文件,它反映了index.php中發生的大部分事件 - 設置包含路徑,APPLICATION_PATH,實例化並調用引導程序,然後執行腳本特定的處理。

更好的是,可能需要爲所有腳本創建一個入口點,就像我們在http/web上下文中一樣。爲了您自己的腳本目的擴展Zend_Application,以便$application->run();不再啓動MVC路由器 - 控制器 - 分派處理,而是執行您自己的操作。這樣,這個單獨的腳本入口點看起來幾乎與web入口點相同,唯一的區別是應用程序對象被實例化。然後將所需Application類的名稱作爲命令行參數傳遞給腳本。

但在這裏,我承認自己不那麼自信,只是拋出想法。

希望這一切都有助於某人。它實際上幫助我把它寫下來。謝謝,歡呼!

更新2009-09-29:Using Zend Framework from the Command Line

更新2009-11-20:而另一篇文章:Cron jobs in Zend Framework | GS Design

更新2010-02-25跨越這篇文章剛跑:Easy command line scripts with Zend Application - David Caunt