Регистрация различных сервисов, использующих один и тот же класс, в моих Laravel 5,7 рабочих местах? - PullRequest
0 голосов
/ 19 марта 2020

У меня есть только один класс в моем Laravel приложении:

namespace App\Api\Consumers

class ShoppingCartApiConsumer
{
   private $baseUrl="https://shopping.example.com";

   private $apiUrl="";

   private $headers=[];

   public function __construct(string $apiKey, string $shoppingCartId)
   {
     $this->apiUrl=$baseUrl."/shoppingCart/$shoppingCartId";
     $this->headers["Authorization"]="Bearer $apiKey"];
   }

   // Rest of methods here
}

И у меня есть следующие вакансии:

namespace App\Jobs;

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;

class PrivateShoppingListConsumer implements ShouldQueue
{
   use Dispatchable;
   use InteractsWithQueue;
   use Queueable;

   private $item;

   public function __construct(string $item)
   {
     $this->item=$item
   }

   public function handle(ShoppingCartApiConsumer $cart):void
   {
      //Logic Implemented here
   }
}
namespace App\Jobs;

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;

class WorkShoppingListConsumer implements ShouldQueue
{
   use Dispatchable;
   use InteractsWithQueue;
   use Queueable;

   private $item;

   public function __construct(string $item)
   {
     $this->item=$item
   }

   public function handle(ShoppingCartApiConssumer $cart):void
   {
      if($item != "computer"){
        return;
      }

      //rest of code here

   }
}

Для PrivateShoppingListConsumer необходимо следующее экземпляр ShoppingCartApiConsumer

$config=config('shoppingCart');
$consumer=new ShoppingListConsumer($config['api_key'],$config['private_shopping_cart_id']);

И WorkShoppingListConsumer требуется следующий экземпляр ShoppingListConsumer:

$config=config('shoppingCart');
$consumer=new ShoppingListConsumer($config['api_key'],$config['work_shopping_cart_id']);

Fonfig для инициализации экземпляра следующий:

return [
  'api_key' => env("API_KEY"),
  'private_shopping_cart_id' => env("PRIVATE_SHOPPING_CART_ID");
  'work_shopping_cart_id' => env("WORK_SHOPPING_CART_ID");
]

Итак, я хочу знать, как я могу передать следующие экземпляры для каждого задания, используя laravel Service Container? Потому что и WorkShoppingListConsumer, и PrivateShoppingListConsumer нужен соответствующий экземпляр класса, чтобы мои бизнес-логики c работали.

1 Ответ

0 голосов
/ 19 марта 2020

Для этого вам необходимо определить поставщика нестандартных услуг на основе документации и контейнера услуг документации , например:

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class ShoppingCartApiConsumerProvider extends ServiceProvider
{
  public function register():void
  {
    $config=config('shoppingCart');
    $privateConsumer=new ShoppingListConsumer($config['api_key'],$config['private_shopping_cart_id']);
    $workConsumer=new ShoppingListConsumer($config['api_key'],$config['work_shopping_cart_id']);

    $this->app->bindMethod(PrivateShoppingListConsumer::class.'@handle', function ($job, $app) use ($privateConsumer) {
            return $job->handle($privateConsumer);
});

$this->app->bindMethod(WorkShoppingListConsumer::class.'@handle', function ($job, $app) use ($workConsumer) {
            return $job->handle($workConsumer);
});
    //Append here more jobs on how to be dispatched
  }
}
...