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
我正在 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