1

現在、Phpspec を使用して Symfony2 プロジェクトに取り組んでおり、別の名前空間で記述されている Spec クラスを拡張する際に問題が発生しています。

たとえば、私のプロジェクトでは、 で説明されている次のクラスがありますspec/Acme/Model/Foo/FooSpec.php

namespace spec\Acme\Model\Foo;

use PhpSpec\ObjectBehavior;
use Prophecy\Argument;

abstract class FooSpec extends ObjectBehavior{
    //some code here
}

spec/Acme/Model/Bar/BarSpec.phpそして、私は拡張に別のクラスを持っていますFooSpec:

namespace spec\Acme\Model\Bar;

use spec\Acme\Model\Foo\FooSpec;

class BarSpec extends FooSpec{
    //some code here
}

phpspec を実行しようとすると、次のエラーが発生します。

PHP Fatal error: Class 'spec\Acme\Model\Foo\FooSpec' not found in /home/user/Projects/Acme/spec/Acme/Model/Bar/BarSpec.php on line 9

私が見つけた唯一の方法は、次の行を に追加することでしたspec/Acme/Model/Bar/BarSpec.php

include('./spec/Acme/Model/Foo/FooSpec.php');

PhpSpec\ObjectBehavior特に他のクラス ( など) が正しく見つかった場合に、この特定のファイルを含めて実行する必要がある理由がわかりません。

なぜこれが起こっているのか分かりますか?


編集:

autoloadコメントで @Phil と @Sheikh Heera が示唆しているように、仕様の名前空間を登録するように設定しようとしましたが、どちらも機能していません。これが私がこれまでに試したことです:

require_once getcwd() . '/vendor/composer/ClassLoader.php';

$loader = new \Composer\Autoload\ClassLoader();

// register classes with namespaces
$loader->add('spec', getcwd().'/spec');

// activate the autoloader
$loader->register();

vendor/composer/autoload_namespaces.phpまた、これを追加するためにファイルを変更しようとしました:

return array(
    //some code here

    'spec' => array(getcwd() . '/spec'),
    //some more code

);

しかし、それでも同じエラーです。'spec' => array(getcwd())また、何が起こるかを試してみまし$loader->add('spec', getcwd());たが、今回はCannot redeclare class別の仕様クラスを取得しました。


私のphpバージョンはPHP 5.4.9-4ubuntu2.4 (cli).

よろしくお願いいたします。

4

2 に答える 2

1

autoload-devより一般的な解決策は、spec ディレクトリをcomposer.json の構成に入れることです。

"autoload-dev": {
    "psr-0": {
        "spec\\":""
    }
},

このようにして、composer はスペックの名前空間も生成します。これはリポジトリのルートにある必要があります。

return array(
     'spec\\' => array($baseDir . '/'),
     ...
);
于 2015-01-07T10:59:28.013 に答える
0

最後に、コメントで Phil と Sheikh Heera が示唆しているように、「問題」を「解決」するために私が実際に行ったことは、仕様で認識されるように名前空間を自動ロードすることです。

これを機能させるために私がしたことは次のとおりです。

  • 次の行をファイル `vendor/composer/autoload_namespaces.php` に追加しました。
$vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);
return array(
    //some code
    'spec\\Acme\\Behavior' => array(getcwd()),
    //some code
);
  • 次に、次のフォルダー構造を作成しました。
    │──スペック
    │ └── アクメ
    │ └── 振る舞い
    │ └── FooBehavior.php
  • このように `spec/Acme/Behavior/FooBehavior.php` で名前空間を宣言しました:
namespace spec\Acme\Behavior;
  • そしてそれを `spec/Acme/Model/Bar/BarSpec.php` で次のように使用しました:
use spec\Acme\Behavior\FooBehavior;

class BarSpec extends FooBehavior{
    //...
}

誰かがこのプロジェクトに取り組むたびに、最初のステップを手動で再現する必要があるため、これがベスト プラクティスではないことはわかっています。より良いアイデアがある場合は、お気軽にコメントまたは回答を投稿してください。

于 2014-02-19T04:31:25.327 に答える