我在Laravel 5.5上实现了适配器模式。
问题: 我已经在适配器中使用了DI。为什么错误表明构造函数中传递的参数太少。应该自动创建构造函数,对吧?
错误
这是我的控制器。
<?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()
{
}
}
答案 0 :(得分:0)
您应该将接口绑定到laravel容器,以实现自动laravel解析依赖性。
引荐来源:https://laravel.com/docs/5.6/container#automatic-injection 还有这个https://laravel.com/docs/5.6/contracts