В настоящее время я реорганизую свой проект Laravel 5, чтобы использовать Repository Design Pattern.Можно ли ввести интерфейс в Laravels Kernel.php?
У меня есть созданный интерфейс хранилища и хранилища класс:
interface UserRepositoryInterface {
[...]
}
class UserRepository implements UserRepositoryInterface
{
[...]
}
затем добавляют необходимое связывание в классе поставщика услуг:
App::bind('App\Repositories\UserRepositoryInterface','App\Repositories\UserRepository');
и впрыскиваемого интерфейса в конструктор контроллера:
class UserController extends Controller
{
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct(UserRepositoryInterface $userRepository)
{
$this->userRepository = $userRepository;
}
}
Эта часть работает нормально. Проблема в том, что мне нужно использовать некоторые методы репозитория в классе app \ Console \ Kernel.php, где я выполнил некоторые запланированные задачи. Я попытался инъекционного конструктор ядра аналогичным образом:
/**
* Create a new console kernel instance.
*/
public function __construct(Application $app, Dispatcher $events, UserRepositoryInterface $userRepository)
{
parent::__construct($app, $events);
$this->userRepository = $userRepository;
}
Однако этот подход не работает (например, запустив «PHP мастеровых подправлять» в терминале не работают). Я получаю следующее сообщение об ошибке:
PHP Fatal error: Uncaught Illuminate\Contracts\Container\BindingResolutionException: Target [App\Repositories\UserRepositoryInterface] is not instantiable while building [App\Console\Kernel]. in D:\xampp\htdocs\budget-and-expe nse-management\local\vendor\laravel\framework\src\Illuminate\Container\Container.php:752 Stack trace:
0 D:\xampp\htdocs\budget-and-expense-management\local\vendor\laravel\framework\src\Illuminate\Container\Container.php(633):
Illuminate\Container\Container->build('App\Repositorie...', Array)
1 D:\xampp\htdocs\budget-and-expense-management\local\vendor\laravel\framework\src\Illuminate\Foundation\Application.php(697):
Illuminate\Container\Container->make('App\Repositorie...', Array)
2 D:\xampp\htdocs\budget-and-expense-management\local\vendor\laravel\framework\src\Illuminate\Container\Container.php(853):
Illuminate\Foundation\Application->make('App\Repositorie...')
3 D:\xampp\htdocs\budget-and-expense-management\local\vendor\laravel\framework\src\Illuminate\Container\Container.php(808):
Illuminate\C in D:\xampp\htdocs\budget-and-expense-management\local\vendor\laravel\framework\src\Illum inate\Container\Container.php on line 752
Fatal error: Uncaught Illuminate\Contracts\Container\BindingResolutionException: Target [App\Repositories\UserRepositoryInterface] is not instantiable while building [App\Console\Kernel]. in D:\xampp\htdocs\budget-and-expense-m anagement\local\vendor\laravel\framework\src\Illuminate\Container\Container.php on line 752
Illuminate\Contracts\Container\BindingResolutionException: Target [App\Repositories\UserRepositoryInterface] is not instantiable while building [App\Console\Kernel]. in D:\xampp\htdocs\budget-and-expense-management\local\vendor \laravel\framework\src\Illuminate\Container\Container.php on line 752
Call Stack: 0.0006 345568 1. {main}() D:\xampp\htdocs\budget-and-expense-management\local\artisan:0 0.0365 1417504 2. Illuminate\Foundation\Application->make() D:\xampp\htdocs\budget-and-expense-management\local\artisan:31 0.0365 1417552 3. Illuminate\Container\Container->make() D:\xampp\htdocs\budget-and-expense-management\local\vendor\laravel\framework\src\Illuminate\Foundation\Application.php:697 0.0367 1417552 4. Illuminate\Container\Container->build() D:\xampp\htdocs\budget-and-expense-management\local\vendor\laravel\framework\src\Illuminate\Container\Container.php:633 0.0367 1417552 5. Illuminate\Container\Container->Illuminate\Container{closure}() D:\xampp\htdocs\budget-and-expense-management\local\vendor\laravel\framework\src\Illuminate\Container\Container.php:735 0.0367 1417576 6. Illuminate\Foundation\Application->make() D:\xampp\htdocs\budget-and-expense-management\local\vendor\laravel\framework\src\Illuminate\Container\Container.php:230 0.0367 1417576 7. Illuminate\Container\Container->make() D:\xampp\htdocs\budget-and-expense-management\local\vendor\laravel\framework\src\Illuminate\Foundation\Application.php:697 0.0368 1417576 8. Illuminate\Container\Container->build() D:\xampp\htdocs\budget-and-expense-management\local\vendor\laravel\framework\src\Illuminate\Container\Container.php:633 0.0388 1453584 9. Illuminate\Container\Container->getDependencies() D:\xampp\htdocs\budget-and-expense-management\local\vendor\laravel\framework\src\Illuminate\Container\Container.php:777 0.0397 1456432 10. Illuminate\Container\Container->resolveClass() D:\xampp\htdocs\budget-and-expense-management\local\vendor\laravel\framework\src\Illuminate\Container\Container.php:808
Я хотел бы знать, если это вообще возможно, чтобы ввести интерфейс хранилища в ядре, и, если да, то что я делаю не так?
Я не знаю, возможно ли это, но '$ userRepository = \ App :: make ('App \ Repositories \ UserRepositoryInterface')' должен работать нормально и в основном иметь тот же результат (хотя DI, вероятно, более чист и легче тестируется, b ut, который все равно проверяет ядро?) – Pevara