【问题标题】:Integrating external scripts with Zend Framework将外部脚本与 Zend 框架集成
【发布时间】:2010-09-23 04:34:15
【问题描述】:

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

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

【问题讨论】:

    标签: php zend-framework


    【解决方案1】:

    是的,您应该将自己的类放入可能继承 Zend Framework 类的类,或者将更多类添加到库中 Zend Framework 文件夹旁边的您自己的文件夹中。

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

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

    【讨论】:

      【解决方案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 命名约定,以便自动加载器找到它们。

      【讨论】:

        【解决方案3】:

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

        作者建议在 ZF 层次结构中简单地创建一个脚本文件夹,并像在 ZF 中一样使用它(尽管他确实设置了 ini 路径并调用自动加载)。就这么简单吗?仅仅是在框架的层次结构中并包括路径和自动加载器就可以让您的脚本访问所有好东西吗?

        【讨论】:

          【解决方案4】:

          我不能 100% 确定您要问什么,但我会尽力提供帮助。如果在任何时候您将“/path/to/zend/framework”的引用添加到您的 php 包含路径中,那么您实质上启用了 Zend 框架。如果你这样做,从那里开始:

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

          然后,您几乎可以在脚本中的任何位置创建新的 Zend Framework 对象,而 Zend_Loader 将处理其余部分。

          虽然 Zend 框架的一大优点是不会强迫您以某种方式做事。这就是为什么有时有几种方法可以完成同一件事。因此,如果您觉得您需要让您的脚本使用 Zend 框架只是为了这样做,那么这并不是真正必要的。但是,如果您认为它可能会以某种方式改进您的脚本,那就去做吧。

          【讨论】:

          • 我收到错误消息:它已被弃用,我收到错误消息。我有 v1.9.6
          • 但它仍然被弃用现在。您可能希望将答案修改为正确的方式或表明它已被弃用。
          【解决方案5】:

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

          【讨论】:

            【解决方案6】:

            作为我自己的采埃孚菜鸟,我想我了解 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 入口点相同,唯一的区别是实例化了哪个应用程序对象。然后将所需应用程序类的名称作为命令行参数传递给脚本。

            但在这里我承认自己不那么自信,只是抛出了一些想法。

            希望这一切对某人有所帮助。它实际上帮助我把它写下来。谢谢和欢呼!

            2009-09-29 更新:刚刚看到这篇文章:Using Zend Framework from the Command Line

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

            2010 年 2 月 25 日更新: Easy command line scripts with Zend Application - David Caunt

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2011-07-20
              • 1970-01-01
              • 2011-12-18
              • 1970-01-01
              • 2011-09-20
              • 2011-05-17
              • 1970-01-01
              • 2010-10-19
              相关资源
              最近更新 更多