2008-11-20 157 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