2012-08-20 5 views
8

私はSymfony 1.2プロジェクトをSymfony 2.xに移植しています。私は現在、最新の2.1.0-devリリースを実行しています。Symfony 2.1でクラスをオートロードする

私の古いプロジェクトからは、文字列から配列を取り除き、文字列からスラッグを生成するためのいくつかの単純な関数を持つToolsというクラスがあります。私の新しいプロジェクトでこのクラスを使用したいと思いますが、このクラスをバンドルの外部で使用する方法は不明です。

ここでは、app/autoload.phpを変更することをお勧めしますが、私のautoload.phpは、回答のものとは異なっています。2.0と2.1の間で変更された可能性があります。

自分のクラスをソース管理の下にあるsrcまたはappディレクトリに保存したいと考えています。私のベンダーのディレクトリは、私がそれを世話するために作曲家を使っているわけではありません。

ここではアドバイスをいただければ幸いです。

答えて

7

このような簡単なケースでは、最も簡単な解決策は、srcの直下にフォルダ(例:Common)を作成し、そのクラスを入れておくことです。あなたは以下のsrcの下で、あなたのコードを入れた場合

src 
    -- Common 
    -- Tools.php 

Tools.phpあなたの関数を呼び出す前に例

<?php 

namespace Common; 

class Tools 
{ 
    public static function slugify($string) 
    { 
     // ... 
    } 
} 

ために、適切な名前空間とクラスが含まれていますがuse声明に

use Common\Tools; 

// ... 
Tools::slugify('my test string'); 

を忘れないでください適切なフォルダ構造と名前空間を使用すると、app/autoload.phpに触れることなく動作します。

+0

私はクラスをLib \ Toolsに入れて、symfonyはそれをうまく自動ロードしました。乾杯! –

+0

それは私のためには機能しません。私は理由をここに尋ねましたhttp://stackoverflow.com/questions/19652384/symfony2-custom-class-not-found。なぜそれが動作しないか知っていれば助けてください –

12

もう一つの方法は、/app/config/autoload.phpを使用することです:

<?php 

use Doctrine\Common\Annotations\AnnotationRegistry; 

$loader = require __DIR__.'/../vendor/autoload.php'; 
$loader->add('YOURNAMESPACE', __DIR__.'/../vendor/YOURVENDOR/src'); 


// intl 
if (!function_exists('intl_get_error_code')) { 
    require_once _DIR__.'/../vendor/symfony/symfony/src/Symfony/Component/Locale/Resources/stubs/functions.php'; 

    $loader->add('', __DIR__.'/../vendor/symfony/symfony/src/Symfony/Component/Locale/Resources/stubs'); 
} 

AnnotationRegistry::registerLoader(array($loader, 'loadClass')); 

return $loader; 

ただ、自分の価値観でYOURNAMESPACEとYOURVENDORを交換してください。これまでのところ私のためにかなりうまく動作します。

あなたは正しいですが、私は2.0から2.1までの自動ロードの変化を見つけました。上記のコードは私のプロジェクトをアップグレードした最新バージョンでうまく動作します;-)

+3

+1素晴らしい!最後に私が探していたものが見つかりました。これはSymfonyの文書に記載されています。 – Mick

+1

これは、Packagistの一部ではないカスタムPSR-0準拠のベンダーライブラリをロードするための正しい方法ですか? –

+1

いいえ、そうではありません...現在、オートロードはコンポーザーによって生成されたオートローダーを介して行われるため、ベンダーのすべての名前空間クラスが使用可能になります。 – maschmann

関連する問題