laravel工厂适配器模式

问题描述 投票:0回答:1

我正在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()
   {

   }
}
adapter laravel-5.5 construct
1个回答
0
投票

您应该将接口绑定到laravel容器以获得自动层次结构依赖性。

参考这个:qazxsw poi和这个qazxsw poi

© www.soinside.com 2019 - 2024. All rights reserved.