2014-10-29 3 views
4

В моей App\Providers\RouteServiceProvider я создать метод register:Laravel 5.0 - Где использовать привязки от поставщиков услуг?

public function register() 
{ 
    $this->app->bindShared('JustTesting', function($app) 
    { 
     die('got here!'); 
     // return new MyClass; 
    }); 
} 

Где я должен использовать это? Я сделал создать метод в App\Http\Controllers\HomeController:

/** 
* ReflectionException in RouteDependencyResolverTrait.php line 53: 
* Class JustTesting does not exist 
* 
* @Get("/test") 
*/ 
public function test(\JustTesting $test) { 
    echo 'Hello'; 
} 

Но не работает, я не могу использовать $ this-> app-> сделать ('JustTesting');

Он работает, если я выполняю код ниже, но я хотел бы ввести в контроллер.

/** 
* "got here!" 
* 
* @Get("/test") 
*/ 
public function test() { 
    \App::make('JustTesting'); 
} 

Как мне привязать, как я хочу? И если это не разрешено, почему я должен использовать метод bindShared?

ответ

1

Кажется, что ваш первый маршрут контроллера бросает исключение ReflectionException, потому что объект JustTesting фактически не существует в момент, когда IoC Container пытается его решить.

Кроме того, вы должны ввести код в интерфейс. Связывание до MyClass было бы так, чтобы Ларавель знал: «Хорошо, когда запрашивается реализация JustTestingInterface, я должен решить ее до MyClass».

RouteServiceProvider.php:

public function register() 
{ 
    $this->app->bindShared('App\Namespace\JustTestingInterface', 'App\Namespace\MyClass'); 
} 

Внутри контроллера:

use Illuminate\Routing\Controller; 
use App\Namespace\JustTestingInterface; 

class TestController extends Controller { 

    public function test(JustTestingInterface $test) 
    { 
     // This should work 
     dd($test); 
    } 
} 
+0

Я не хочу использовать 'MyClass', потому что он может перейти к другому классу в будущем (например, другой поставщик, но реализующий один и тот же интерфейс). Могу ли я использовать '... test (JustTestingInterface $ test)' в моем контроллере? Затем он должен быть разрешен для 'MyClass' (или другого класса, который я хочу связать с методом' bindShared'). –

+0

@GiovanneAfonso Я исправил исходный код, который был неправильным .... 'JustTestingInterface' должен быть интерфейсом, который реализуется 'MyClass'. Затем вы привязываете 'JustTestingInterface' к' MyClass', чтобы Laravel знал, что нужно использовать 'MyClass', когда запрашивается реализация' JustTestingInterface'. – Inda5th

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