将外部脚本与Zend Framework集成

时间:2008-11-20 04:21:53

标签: php zend-framework

将外部脚本集成到Zend Framework的最佳方法是什么?让我解释一下,因为我可能会以错误的方式问这个问题。我有一个下载和解析XML文件的脚本。此脚本作为每日cron作业运行,需要将其数据转储到数据库中。

我在使用此脚本的网站上使用Zend Framework,在我看来,最好使用我的Zend_Db_Abstract子类模型来添加和更新数据库。怎么去做这个?我的脚本是否在Zend Components旁边的库中(即library / Mine / Xmlparse.php),因此可以访问各种ZF组件?我只需要在文件本身中包含正确的模型文件和Zend DB组件吗?处理这种集成的最佳方法是什么?

6 个答案:

答案 0 :(得分:3)

是的,你应该把你自己的类继承Zend Framework类,或者在库中的Zend Framework文件夹旁边的你自己的文件夹中添加更多的类。

当您启用Zend_Loader的自动加载时,类名将自动映射到您创建的类,例如:

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

答案 1 :(得分:2)

在您的库目录中,您应该在Zend库文件夹旁边拥有自己的库。无论你怎么称呼它(Mylib,Project,......)你都应该将它包含在Zend Autoloader中,并按如下方式进行:

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

为了让您的库与ZF和Autoloader很好地集成,您应该坚持使用ZF命名约定。这意味着两件事:

  • 如果扩展现有的ZF类,请复制ZF文件夹结构,以使您的文件具有相同的路径和名称,但库名称除外。例如。 /library/Zend/Db/Abstract.php => /library/Project/Db/Abstract.php。
  • 如果您编写自己的类,仍然坚持自动加载器的ZF命名约定来查找它们。

答案 2 :(得分:1)

我刚刚遇到了一些可能与这个问题密切相关的事情。 This IBM developerWorks article.

作者建议只在ZF层次结构中创建一个脚本文件夹,并将其用作ZF中通常使用的脚本文件夹(尽管他确实设置了ini路径并调用了自动加载)。这么简单吗?是否只是在框架的层次结构中,并包括路径和自动加载器授予您的脚本访问所有的好东西?

答案 3 :(得分:1)

我不是100%肯定你要问的是什么,但我会尽力帮助。如果你在任何时候在你的php include路径中添加对“/ path / to / zend / framework”的引用,那么你实际上已经启用了Zend Framework。如果你这样做,那就从那里开始:

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

然后,在脚本中的任何一点,您几乎都可以创建新的Zend Framework对象,Zend_Loader将处理其余的对象。

Zend Framework的一个重要特点是不要强迫你以某种方式做事。这就是为什么有时候有几种方法可以完成同样的事情。所以,如果你觉得你需要让你的脚本使用Zend Framework只是为了这样做,这不是真的有必要。但是如果你认为它可能以某种方式改进你的脚本,那就去吧。

答案 4 :(得分:1)

我通常把我认为可以在库中的自定义文件夹中的项目中使用的自定义内容。所以我有一个库/ Ak33m文件夹,其中包含可能在框架之外的脚本。

答案 5 :(得分:1)

作为自己的ZF菜鸟,我想我理解OP试图解决的一些问题。所以,我只是解释一下我理解的内容,希望它对OP有用(或者更有可能对未来的读者有用,因为原来的问题太老了,我想OP现在是ZF大师)。

据我所知,ZF声称主要是“随意使用”,因此您无需购买整个结构,例如Zend_Application,Zend_Bootstrap类,整个MVC方法等。

此外,我了解了类命名和文件位置的约定,可以轻松实现自动加载。例如:class App_Model_User位于App/Model/User.php

文件夹中

我认为可能令人困惑的是,在脚本环境中,您还没有

  • 完成了将所有请求推送到public/index.php
  • 的.htaccess魔法
  • 设置APPLICATION_PATH并在public/index.php
  • 中添加路径
  • 创建了与配置文件相关联的ApplicationBootstrap对象

有点不清楚如何最好地利用我们在这种背景下获得的大多数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