0

В настоящее время я реорганизую свой проект 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

Я хотел бы знать, если это вообще возможно, чтобы ввести интерфейс хранилища в ядре, и, если да, то что я делаю не так?

+0

Я не знаю, возможно ли это, но '$ userRepository = \ App :: make ('App \ Repositories \ UserRepositoryInterface')' должен работать нормально и в основном иметь тот же результат (хотя DI, вероятно, более чист и легче тестируется, b ut, который все равно проверяет ядро?) – Pevara

ответ

2

Вы делаете это неправильно. Полагаю, вы написали запланированные задачи непосредственно в ядре в закрытии. Вместо этого оберните команды логику в Console commands

<?php 

namespace App\Console\Commands; 

use App\Repositories\UserRepository; 
use Illuminate\Console\Command; 

class MyCoolCommand extends Command 
{ 
    /** 
    * The name and signature of the console command. 
    * 
    * @var string 
    */ 
    protected $signature = 'mycool:command'; 

    protected $repository = null; 

    public function __construct(UserRepository $repository) 
    { 
     parent::__construct(); 

     $this->repository = $repository; 
    } 

    /** 
    * Execute the console command. 
    * 
    * @return mixed 
    */ 
    public function handle() 
    { 
     // your logic here 
    } 

} 

, а затем вызвать их в ядре, как это:

$schedule->command('mycool:command')->daily(); 

Вы можете определить каждую команду зависимости отдельно в командном конструктору, очистить ядро ​​и напишите некоторый тестовый и симпатичный код :)

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