0

Ich überarbeite gerade mein Laravel 5 Projekt, um die Repository Design Pattern zu nutzen.Ist es möglich, eine Schnittstelle in Laravels Kernel.php zu injizieren?

Ich habe eine erstellt Repository-Schnittstelle und ein Repository Klasse:

interface UserRepositoryInterface { 
    [...] 
} 

class UserRepository implements UserRepositoryInterface 
{ 
    [...] 
} 

dann hinzugefügt, um die erforderlichen in dem Service-Provider-Klasse-Bindung:

App::bind('App\Repositories\UserRepositoryInterface','App\Repositories\UserRepository'); 

und injiziert, um die Schnittstelle in den Controller Konstruktor:

class UserController extends Controller 
{ 
    /** 
    * Create a new controller instance. 
    * 
    * @return void 
    */ 
    public function __construct(UserRepositoryInterface $userRepository) 
    { 
     $this->userRepository = $userRepository; 
    } 
} 

Dieser Teil funktioniert gut. Das Problem ist, dass ich einige der Repository-Methoden in der Klasse app \ Console \ Kernel.php verwenden muss, wo ich einige geplante Aufgaben implementiert habe. Ich habe versucht, den Kernel-Konstruktor in ähnlicher Weise der Injektion:

/** 
* Create a new console kernel instance. 
*/ 
public function __construct(Application $app, Dispatcher $events, UserRepositoryInterface $userRepository) 
{ 
    parent::__construct($app, $events); 

    $this->userRepository = $userRepository; 
} 

Doch dieser Ansatz nicht funktioniert (zum Beispiel ‚php Handwerker basteln‘ läuft in dem Terminal ausfällt). Ich erhalte die folgende Fehlermeldung:

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

Ich würde gerne wissen, ob es überhaupt möglich ist, eine Repository-Schnittstelle in den Kernel zu injizieren, und, wenn ja, was mache ich falsch?

+0

Ich weiß nicht, ob es möglich ist, aber '$ userRepository = \ App :: make ('App \ Repositories \ UserRepositoryInterface')' sollte gut funktionieren und hat im Grunde das gleiche Ergebnis (obwohl DI wahrscheinlich sauberer und einfacher zu testen ist, b ut wer testet den Kernel trotzdem?) – Pevara

Antwort

2

Sie tun es falsch. Ich vermute, du hast deine geplanten Aufgaben direkt im Kernel in Schließungen geschrieben. Stattdessen wickeln Sie Ihre Befehle Logik in 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 
    } 

} 

und sie dann so in den Kernel nennen:

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

können Sie dann jeweils Abhängigkeiten Befehl definieren separat im Befehls Konstruktor, aufzuräumen Ihren Kernel und schreibe etwas testbaren und schönen Code :)

Verwandte Themen