laravel 工厂适配器模式

laravel factory adapter pattern

我正在 Laravel 5.5 上实现适配器模式。

问题: 我已经在适配器中使用了 DI。为什么错误显示在构造函数中传递的参数太少。构造函数应该是自动创建的吧?

错误

enter image description here

这是我的控制器。

<?php

namespace App\Http\Controllers\Admin;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Services\ExcelService;

class ExcelController extends Controller
{
   public function __construct(ExcelService $excelService)
   {
      $this->excelService = $excelService;
   }

   public function export(Request $request)
   {
      $excel = $this->excelService->export($request->get('sheet_name'), 
      $request->except('_token', 'sheet_name'));

      return $excel;
   }

   public function import(Request $request)
   {

   }
}

这是我的服务。

<?php

namespace App\Services;

class ExcelService
{
   private $excel;
   private $factory;

   public function __construct(ExcelFactory $factory)
   {
        $this->factory = $factory;
   }

   public function export(String $sheet_name, array $date_range)
   {
      $this->excel = $this->factory->create($sheet_name);
      $this->excel->export($sheet_name, $date_range);
   }

   public function import()
   {

   }
}

这是我的工厂。

<?php

namespace App\Services;

class ExcelFactory
{
  /**
   * 建立 adapter
   * @return Excel
   */
   public static function create(String $sheet_name): Excel
   {
    $lut = [
        'member' => MemberExcelAdapter::class,
    ];

    $className = collect($lut)
        ->get($sheet_name, MemberExcelAdapter::class);

    return new $className;
   }
}

这是我的界面。

<?php

namespace App\Services;

interface ExcelInterface
{
  /**
   * 匯出資料
   * @param String $list_name 
   */
   public function export(String $list_name, array $date_range);

  /**
   * 
   */
  public function import();
}

这是我的适配器。

<?php
namespace App\Services;

use App\Excel\MemberExcel;

class MemberExcelAdapter implements ExcelInterface
{
   /** @var MemberExcel */
   private $excel;

   /**
   * MemberExcelAdapter constructor
   * @param MemberExcel $member_excel
   */
   public function __construct(MemberExcel $member_excel)
   {
     $this->excel = $this->member_excel;
    }

   public function export(String $list_name, array $date_range)
   {
     return $this->excel->export($list_name, $date_range);
   }

   public function import()
   {

   }
}

您应该将接口绑定到 laravel 容器以自动 laravel 解析依赖关系。

参考这个:https://laravel.com/docs/5.6/container#automatic-injection 而这个 https://laravel.com/docs/5.6/contracts