2015-03-24 3 views
0

Я ударил головой о стену на 3/4 дня и просто не вижу ошибки моих путей.php/composer не загружает интерфейс

Я создаю (или пытаюсь!) Простой пакет, состоящий из нескольких классов и 1 интерфейса. Это в GitHub на https://github.com/dnorth98/victoropsnotifier

В принципе, хотя, есть следующая структура каталогов:

victoropsnotifer 
    src 
     Signiant 
      VictorOpsNotifier 
       Transport.php 
       VictorOpsNotifier.php 

Транспорт очень просто:

<?php 
    namespace Signiant\VictorOpsNotifer; 
    interface Transport 
    { 
      // must POST the $message to the VictorOps REST endpoint 
      public function send(Messages\Message $message); 
    } 

и начало VictorOpsNotifier является

<?php 
    namespace Signiant\VictorOpsNotifer; 
    use GuzzleHttp\Client; 

    class VictorOpsNotifer implements Transport 
    { 
     protected $endpoint_url; 
     : 
     : 

Проблема возникает, когда я пытаюсь создать экземпляр нового объекта usin г

<?php 
    require_once 'vendor/autoload.php'; 

    use Signiant\VictorOpsNotifier\Messages\CustomMessage; 
    use Signiant\VictorOpsNotifier\VictorOpsNotifier; 

    $voConfig = ['routing_key' => 'test', 
       'endpoint_url' => 'https://goo']; 

    $voHandle = new VictorOpsNotifier($voConfig); 

я вернусь

PHP Fatal error: Interface 'Signiant\VictorOpsNotifer\Transport' not found in /tmp/djn/tests/vendor/signiant/ 
victoropsnotifier/src/Signiant/VictorOpsNotifier/VictorOpsNotifier.php on line 8 
PHP Stack trace: 
PHP 1. {main}() /tmp/djn/tests/test.php:0 
PHP 2. spl_autoload_call() /tmp/djn/tests/test.php:12 
PHP 3. Composer\Autoload\ClassLoader->loadClass() /tmp/djn/tests/test.php:0 
PHP 4. Composer\Autoload\includeFile() /tmp/djn/tests/vendor/composer/ClassLoader.php:301 
PHP 5. include() /tmp/djn/tests/vendor/composer/ClassLoader.php:412 

Что же мне не хватает? Composer находит пакет в порядке от моего репозитория github, и все в папке поставщика и выглядит нормально. Похоже, что пространства имен совпадают ... поэтому по какой-то причине просто не загружается файл Transport.php, содержащий интерфейс.

+0

Вы используете PSR-0 от composer.json? Там такая опечатка, как сказал Этки, если это не исправить, вы должны увидеть свой PSR-0. –

ответ

0

Это кажется просто опечатка:

namespace Signiant\VictorOpsNotifer; 
           ^no `i` in here 

но

use Signiant\VictorOpsNotifier\VictorOpsNotifier; 
         ^but here it is 

То же самое с именем класса.

Кроме того, вы объявляя имена Signiant, как src/, но это действительно src/Signiant

Кстати, нет необходимости объявлять этот пакет как PSR-0, лучше использовать PSR-4 insetad. Не очень, просто для соответствия.

P.S. Странно, что он жаловался на интерфейс, в то время как он не должен был до тех пор, пока он не ударил по классу, и он, безусловно, не должен ударить по классу, пока была опечатка.

P.P.S Вы можете легко избежать этих ошибок типографии, используя, например, надлежащую IDE, PHPStorm. Он будет выделять имя класса как отсутствующее, если есть опечатки (и я даже не заговорю об автозаполнении).

+0

Unreal. Это была просто опечатка! Спасибо ОЧЕНЬ много парней. Я только время от времени занимаюсь PHP, поэтому моя IDE «vi» :) Но я буду рассматривать что-то вроде PHPStorm. Еще раз спасибо! Dave –

0
class VictorOpsNotifer implements \Signiant\VictorOpsNotifer\Transport{} 

Попробуйте добавить пространство имен перед вашим интерфейсом.

+0

можно сделать только VictorOpsNotifer \ Transport, потому что пространство имен все уже указано сверху –

Смежные вопросы