0

私はデータベースと通信し、コンテンツを変換してXMLファイルに入れるスクリプトを書いています。

私はベストプラクティスを利用しようとしていますが、ライブラリの再利用の一環として、次のクラスが有益であることがわかりました。

symfonyコンポーネント:

  • Yaml:データベース情報の解析と読み込み用。
  • DIコンテナ:依存性を注入するため

その他:

  • PHPExcel、素晴らしいExcelライブラリ
  • 簡単なPDOラッパーを取得するためのDoctrineDBAL
  • テスト中に簡単なモックを取得するための嘲笑

私のコアビジネスクラスはExcelExporter、これらすべてのファイルが互いに調和して機能する必要があります。また、独自のクラスで初期化し、これらの依存関係をに注入できる場所も必要です。

私はこれをどこで行うかについて混乱しています。Webページを作成している場合、初期化と構成のプロセスをindex.php内に配置し、最後にExcelExporterを呼び出して、ユーザーがブラウザーにindex.phpをロードしたときに処理を実行します。このブートストラッププロセスのためのより良い方法はありますか?最も一般的なアプローチは何ですか?

4

3 に答える 3

3

このタスクには、 Composerを完全に使用する必要があります。

ベンダーと自動読み込みを処理します。

簡単な設定は次のとおりです。

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

依存関係のあるvendorディレクトリが作成されます。次に、ブートストラップファイルは単にあなたがしなければならないことを初期化しています。自動読み込みはComposerによって処理されます。

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

ダミアンの答えに基づいて、Composerがこれを行う最も簡単な方法を提供していることがわかりました。

今、私のクラスはディレクトリExportExcelに住んでいます。src/私のディレクトリの構造は次のとおりです。

src /
ベンダー/
index.php
bootstrap.php
composer.json

composer.jsonで、クラスをロードするように依頼しました。

{{
    "名前": "adityamenon / excel_export"、
    "description": "データをカスタムExcelシート形式にエクスポート"、
    "必要とする": {
        "symfony /dependency-injection": "2.2.x-dev"、
        "symfony / yaml": "2.1.x-dev"、
        "doctrine / dbal": "2.4.x-dev"、
        "mockery / mockery": "dev-master"、
        "CodePlex / PHPExcel": "1.7.8"
    }、
    "自動ロード":{
        "psr-0":{"ExportExcel": "src /"}
    }、
    「作者」:[
        {{
            "名前": "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 に答える
1

フレームワークを使用していないと思います。シンフォニーコンポーネントのみを使用します。フレームワークを使用している場合は、フレームワークによって実行されます。しかし、バニラフレームワークには必要です

  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 に答える