162 lines
4.5 KiB
PHP
162 lines
4.5 KiB
PHP
|
<?php
|
|||
|
declare(strict_types=1);
|
|||
|
|
|||
|
namespace Fastknife\Domain;
|
|||
|
|
|||
|
use Fastknife\Domain\Logic\BaseData;
|
|||
|
use Fastknife\Domain\Logic\BaseImage;
|
|||
|
use Fastknife\Domain\Logic\BlockImage;
|
|||
|
use Fastknife\Domain\Logic\Cache;
|
|||
|
use Fastknife\Domain\Logic\WordImage;
|
|||
|
use Fastknife\Domain\Logic\BlockData;
|
|||
|
use Fastknife\Domain\Logic\WordData;
|
|||
|
use Fastknife\Domain\Vo\ImageVo;
|
|||
|
use Intervention\Image\ImageManagerStatic;
|
|||
|
|
|||
|
class Factory
|
|||
|
{
|
|||
|
protected $config;
|
|||
|
|
|||
|
protected $cacheInstance;
|
|||
|
|
|||
|
public function __construct(array $config)
|
|||
|
{
|
|||
|
$this->config = $config;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* @return BlockImage
|
|||
|
*/
|
|||
|
public function makeBlockImage(): BlockImage
|
|||
|
{
|
|||
|
$data = new BlockData();
|
|||
|
$image = new BlockImage();
|
|||
|
$this->setCommon($image, $data);
|
|||
|
$this->setBlock($image, $data);
|
|||
|
return $image;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* @return WordImage
|
|||
|
*/
|
|||
|
public function makeWordImage(): WordImage
|
|||
|
{
|
|||
|
$data = new WordData();
|
|||
|
$image = new WordImage();
|
|||
|
$this->setCommon($image, $data);
|
|||
|
$this->setWord($image, $data);
|
|||
|
return $image;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/**
|
|||
|
* 设置公共配置
|
|||
|
* @param BaseImage $image
|
|||
|
* @param BaseData $data
|
|||
|
*/
|
|||
|
protected function setCommon(BaseImage $image, BaseData $data)
|
|||
|
{
|
|||
|
//固定驱动,少量图片处理场景gd性能远远大于imagick
|
|||
|
ImageManagerStatic::configure(['driver' => 'gd']);
|
|||
|
|
|||
|
//获得字体数据
|
|||
|
$fontFile = $data->getFontFile($this->config['font_file']);
|
|||
|
$image
|
|||
|
->setFontFile($fontFile)
|
|||
|
->setWatermark($this->config['watermark']);
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 设置滑动验证码的配置
|
|||
|
* @param BlockImage $image
|
|||
|
* @param BlockData $data
|
|||
|
*/
|
|||
|
protected function setBlock(BlockImage $image, BlockData $data)
|
|||
|
{
|
|||
|
//设置背景
|
|||
|
$backgroundVo = $data->getBackgroundVo($this->config['block_puzzle']['backgrounds']);
|
|||
|
$image->setBackgroundVo($backgroundVo);
|
|||
|
|
|||
|
$templateVo = $data->getTemplateVo($backgroundVo, $this->config['block_puzzle']['templates']);
|
|||
|
|
|||
|
$image->setTemplateVo($templateVo);
|
|||
|
|
|||
|
$pixelMaps = [$backgroundVo, $templateVo];
|
|||
|
if (
|
|||
|
isset($this->config['block_puzzle']['is_interfere']) &&
|
|||
|
$this->config['block_puzzle']['is_interfere'] == true
|
|||
|
) {
|
|||
|
$interfereVo = $data->getInterfereVo($backgroundVo, $templateVo, $this->config['block_puzzle']['templates']);
|
|||
|
$image->setInterfereVo($interfereVo);
|
|||
|
$pixelMaps[] = $interfereVo;
|
|||
|
}
|
|||
|
|
|||
|
if (
|
|||
|
isset($this->config['block_puzzle']['is_cache_pixel']) &&
|
|||
|
$this->config['block_puzzle']['is_cache_pixel'] === true
|
|||
|
) {
|
|||
|
$cache = $this->getCacheInstance();
|
|||
|
foreach ($pixelMaps as $vo) {
|
|||
|
/**@var ImageVo $vo * */
|
|||
|
$key = 'image_pixel_map_' . $vo->src;
|
|||
|
$result = $cache->get($key);
|
|||
|
if (!empty($result) && is_array($result)) {
|
|||
|
$vo->setPickMaps($result);
|
|||
|
} else {
|
|||
|
$vo->preparePickMaps();
|
|||
|
$vo->setFinishCallback(function (ImageVo $imageVo) use ($cache, $key) {
|
|||
|
$cache->set($key, $imageVo->getPickMaps(), 0);
|
|||
|
});
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 设置文字验证码的配置
|
|||
|
* @param WordImage $image
|
|||
|
* @param WordData $data
|
|||
|
*/
|
|||
|
protected function setWord(WordImage $image, WordData $data)
|
|||
|
{
|
|||
|
//设置背景
|
|||
|
$backgroundVo = $data->getBackgroundVo($this->config['click_world']['backgrounds']);
|
|||
|
$image->setBackgroundVo($backgroundVo);
|
|||
|
|
|||
|
//随机文字坐标
|
|||
|
$pointList = $data->getPointList(
|
|||
|
$image->getBackgroundVo()->image->getWidth(),
|
|||
|
$image->getBackgroundVo()->image->getHeight(),
|
|||
|
3
|
|||
|
);
|
|||
|
$worldList = $data->getWordList(count($pointList));
|
|||
|
$image
|
|||
|
->setWordList($worldList)
|
|||
|
->setWordList($worldList)
|
|||
|
->setPoint($pointList);
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 创建缓存实体
|
|||
|
*/
|
|||
|
public function getCacheInstance(): Cache
|
|||
|
{
|
|||
|
if (empty($this->cacheInstance)) {
|
|||
|
$this->cacheInstance = new Cache($this->config['cache']);
|
|||
|
}
|
|||
|
return $this->cacheInstance;
|
|||
|
}
|
|||
|
|
|||
|
public function makeWordData(): WordData
|
|||
|
{
|
|||
|
return new WordData();
|
|||
|
}
|
|||
|
|
|||
|
public function makeBlockData(): BlockData
|
|||
|
{
|
|||
|
return (new BlockData())->setFaultOffset($this->config['block_puzzle']['offset']);
|
|||
|
}
|
|||
|
}
|