2014-09-01 2 views
0

У меня есть следующая структура.проблема с пространством имен в laravel?

app/ 
    acme/ 
    Providers/ 
    Services/ 
     CloudServices/ 
     Files/ 
      FielsInterface.php 
      s3Files.php 
     Images/ 
     ImageEditorInterface.php 
     ImageEditor.php 

Я использую s3files через его связывание в контроллере путем добавления

use Acme\Services\CloudServices\Files\FilesInterface 

в верхней части контроллера, а затем с помощью конструктора и он прекрасно работает.

Теперь я хочу, чтобы использовать его в ImageEditor.php, чье пространство имен

Acme\Services\Images 

но со следующим кодом я получаю ошибку типа говоря, аргумент два должен быть экземпляром FilesInterface, но никто не дал

<?php namespace Acme\Services\Images; 

use IntImage; 
use Response; 
use Acme\Services\CloudServices\Files\FilesInterface; 

/** 
* 
*/ 
class ImageEditor implements ImageEditorInterface 
{ 
    protected $imageeditor; 
    protected $files; 
    protected $imageSizes = array(
     "thumbnail" => array(
      "h" => 50, 
      "w" => 50 
     ), 
     "x-small" => array(
      "h" => 150, 
      "w" => 150 
     ), 
     "small" => array(
      "h" => 390, 
      "w" => 360 
     ) 
    ); 

    public function __construct(IntImage $imageeditor, FilesInterface $files) 
    { 
     $this->imageeditor = $imageeditor; 
     $this->files = $files; 
    } 

Видел, что он работает в контроллере. Я предполагаю, что мое заявление о применении неверно, но я понятия не имею, чем оно должен быть вместо этого?

edit1:

ImageEditor впрыскивается и используется в контроллере, как так

<?php 

use Acme\Services\Images\ImageEditorInterface; 
use Acme\Services\CloudServices\Files\FilesInterface; 

class ImagesController extends BaseController 
{ 
    protected $image; 
    protected $editor; 
    protected $files; 
    protected $queue; 

    public function __construct(Image $image, ImageEditorInterface $editor, FilesInterface $files, Queue $queue) 
    { 
     $this->image = $image; 
     $this->editor = $editor; 
     $this->files = $files; 
     $this->queue = $queue; 
     $this->beforeFilter('auth', array('except' => array('show'))); 
    } 
public function store() 
{ 
    $this->editor->createUserImages() 

} 

EDIT2: в Acme/Поставщики/FilesServiceProvider.php у меня есть, не то, что делать то, что вы описали? Также, как я могу использовать реализацию файлов в контроллере, не может ли он предположить, что эта часть настроена правильно?

<?php namespace TrainerCompare\Providers; 

use Illuminate\Support\ServiceProvider; 
use TrainerCompare\Services\CloudServices\Files\S3Files; 
use AWS; 

/** 
* 
*/ 
class FilesServiceProvider extends ServiceProvider 
{ 
    public function register() 
    { 
     $this->app->bind('TrainerCompare\Services\CloudServices\Files\FilesInterface', function() { 
      $aws = new AWS; 

      return new S3Files($aws); 
     }); 
    } 
} 
+0

Как и где вы создаете свой ImageEditor? –

+0

Пожалуйста, проверьте мои изменения. Я думаю, что я добавил информацию, которую вы ищете. – Ir1sh

ответ

1

Где-то в вас приложения вы должны сказать Laravel, что конкретный класс для создания экземпляра, когда необходимо придать FilesInterface.

App::bind(
    'Acme\Services\CloudServices\Files\FilesInterface', 
    'Acme\Services\CloudServices\Files\s3Files' 
); 

Вы, вероятно, надстройку поставщика услуг к вашему app/config/app.php тоже, верно?

Итак, как вы уже привязывая его, для отладки, проверьте, если он на самом деле связано:

Route::any('test', function() 
{ 
    dd(App::bound('TrainerCompare\Services\CloudServices\Files\FilesInterface')); 
}); 

Так выглядит как Laravel не в состоянии найти, что связывание в момент создания экземпляра контроллера.

И проверить, если ваш метод регистра поставщика услуг вызывается:

class FilesServiceProvider extends ServiceProvider 
{ 
    public function register() 
    { 
     dd('yes it is'); 

     .... 
    } 
} 

EDIT:

Там, наверное, проблема именование где-то я не вижу здесь, но Laravel ищет что-то не (как есть) в контейнере.Вещи, которые вы, возможно, потребуется проверить: файлы пространств имен, ваши правила самозарядные, и вы можете попытаться сделать тесты, временно снимая использования и добавление их непосредственно к контроллеру

public function __construct(
    Image $image, ImageEditorInterface $editor, 
    TrainerCompare\Services\CloudServices\Files\FilesInterface $files, 
    Queue $queue 
) 
{ ... } 
+0

тестовый маршрут возвращает true и да, он сбрасывается, если добавлен к методу – Ir1sh

+0

. Я просто заметил еще одну проблему в том же файле, которая может быть или не быть связана. IntImage - это пакет Intervention/Image с поддержкой laravel, и я изменил имя фасада на IntImage из-за конфликта. В InterfentionImageEditor я могу вызвать IntImage :: make() без проблем, но если я добавлю его через конструктор, как показано выше, я получаю метод, который не найден. – Ir1sh

+1

Довольно странно. Отредактировано, чтобы добавить дополнительную информацию и еще один эмпирический тест. :/ –

-2

Вам необходимо предварять ваше use заявление с обратной косой черты в вашем имени разнесены класса, как так:

<?php namespace Acme\Services\Images; 

use \Acme\Services\CloudServices\Files\FilesInterface; 

в противном случае PHP будет рассматривать его как относительный путь пространства имен и попытаться решить ее как таким образом:

Acme\Services\Images\Acme\Services\CloudServices\Files\FilesInterface

+1

Использовать предложения всегда от root. –

+0

Не в моем опыте. –

+0

Тогда у вас возникнут какие-то странные переживания, возможно, положите допинг. ; o) пространства имен 'use' действительно всегда * полностью квалифицированы *, а не относительно текущего пространства имен. – deceze

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