0

我正在编写一个与数据库对话的脚本,并转换内容并将其放入 XML 文件中。

我正在尝试利用最佳实践,并且作为库重用的一部分,我发现以下类是有益的:

Symfony 组件:

  • Yaml :用于解析和加载数据库信息。,
  • DI Container:用于注入依赖项

其他:

  • PHPExcel,令人惊叹的Excel 库
  • Doctrine DBAL 获得一个简单的 PDO 包装器
  • 在测试期间获得简单模拟的嘲弄

我的核心业务类ExcelExporter需要所有这些文件相互协调地运行。我还需要一个可以通过自己的类初始化并注入这些依赖项的地方。

我对在哪里执行此操作感到困惑。如果我正在构建一个网页,我会说我会将初始化和配置过程放在 index.php 中,最后在用户在浏览器中加载 index.php 时调用 ExcelExporter 来完成它的工作。这个引导过程有更好的方法吗?最常见的方法是什么?

4

3 回答 3

3

You should totaly use Composer for this task.

It will handle vendors and autoloading for you.

Here is a quick setup:

curl -s https://getcomposer.org/installer | php
php composer.phar init
php composer.phar require symfony/dom-crawler:dev-master doctrine/dbal:2.4.x-dev
php composer.phar install

You will have a vendor directory with your dependencies. Then the bootstrap file is simply initializing what you have to do. Autoloading is handled by Composer:

// Then add this on top of your bootstrap file
require 'vendor/autoload.php';
于 2012-12-11T22:55:09.533 回答
1

我假设您没有使用任何框架。仅使用交响乐组件。如果您使用的是框架,它将由框架完成。但是对于 vanila 框架,您需要

  1. 应用程序的单一入口点(例如index.php
  2. bootstrap.php加载初始类和外部资源的文件。许多框架使用这个引导文件。只要看看你会发现它们的文件结构。这个名字可能不是bootstrap.php
  3. 加载应用程序后,使用自动加载器加载按需类。这个自动加载器应该在引导时初始化。

    function my_autoloader($class) {
        include 'classes/' . $class . '.class.php';
    }
    spl_autoload_register('my_autoloader');
    
于 2012-12-11T22:30:03.057 回答
1

根据 Damien 的回答,我发现 Composer 提供了最简单的方法来做到这一点。

现在,我的ExportExcel班级住在src/目录中。我的目录结构是:

源/
小贩/
索引.php
引导程序.php
作曲家.json

在 内composer.json,我还要求它为我加载我的课程:

{
    “名称”:“adityamenon/excel_export”,
    "description": "将数据导出为自定义 Excel 工作表格式",
    “要求”: {
        “symfony/依赖注入”:“2.2.x-dev”,
        “symfony/yaml”:“2.1.x-dev”,
        “教义/dbal”:“2.4.x-dev”,
        “嘲笑/嘲笑”:“开发大师”,
        “CodePlex/PHPExcel”:“1.7.8”
    },
    “自动加载”:{
        “psr-0”:{“ExportExcel”:“src/”}
    },
    “作者”:[
        {
            "name": "aditya menon",
            “电子邮件”:“adityamenon90@gmail.com”
        }
    ]
}

我只需要运行$ composer install 所有依赖项就可以神奇地出现在vendor/.

PSR-0 很容易理解。我刚刚创建了一个文件ExportExcel.php,其中包含一个命名空间类,名为ExportExcel

namespace ExportExcel;

class ExportExcel {

    public function __construct(\ExportExcel\DbConvenience $db_convenience)
    {
        $this->DbConvenience = $db_convenience;
    }

    public function writeExcelFile()
    {
        // ...do stuff here
    }

}

最后,这是 bootstrap.php,它负责自动加载我需要的东西以及注入依赖项:

<?php

// composer autoloads dependencies
// also configured to load from src/
$loader = require('vendor/autoload.php');

// load configuration (only db right now)
use Symfony\Component\Yaml\Yaml;
$yaml_config = Yaml::parse('config.yml');

// load the database
$db_config = new Doctrine\DBAL\Configuration();
$conn = Doctrine\DBAL\DriverManager::getConnection($yaml_config, $db_config);

// load the convenience classes
$DbConvenience = new ExportExcel\DbConvenience($conn);

// use the dependency injector to load the exporter with DB
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Reference;
$sc = new ContainerBuilder();

$sc->setParameter('dbconvenience.class', 'ExportExcel\DbConvenience');
$sc->setParameter('exportexcel.class', 'ExportExcel\ExportExcel');

$sc
    ->register('dbconvenience', '%dbconvenience.class%')
    ->addArgument($conn);

$sc
    ->register('exportexcel', '%exportexcel.class%')
    ->addArgument(new Reference('dbconvenience'));

// here's the most important class of 'em all
$ExportExcel = $sc->get('exportexcel');

最后在 index.php 中,第一行是require('bootstrap.php');,然后我就走了。我可以使用 $ExportExcel->doStuff(); 调用 ExportExcel 中的函数;

请随时添加评论并缩短/改进此答案。解决这个难题有点困难,需要阅读一些内容,但事后看来一切都很清楚。

于 2012-12-16T06:10:17.837 回答