File: D:/HostingSpaces/slenders/slenders.nl/app/Komma/Components/ComponentType/ComponentTypeFactory.php
<?php
namespace App\Komma\Components\ComponentType;
use App\Komma\Components\ComponentType\Types\AbstractComponentType;
use App\Komma\Components\ComponentType\Types\AdvisoryMeeting;
use App\Komma\Components\ComponentType\Types\Brands;
use App\Komma\Components\ComponentType\Types\ClientReviews;
use App\Komma\Components\ComponentType\Types\CtaPerson;
use App\Komma\Components\ComponentType\Types\DoubleImage;
use App\Komma\Components\ComponentType\Types\DoubleImageThird;
use App\Komma\Components\ComponentType\Types\DoubleText;
use App\Komma\Components\ComponentType\Types\Heading;
use App\Komma\Components\ComponentType\Types\Hero;
use App\Komma\Components\ComponentType\Types\HomeDoubleServiceRow;
use App\Komma\Components\ComponentType\Types\HomeServiceRow;
use App\Komma\Components\ComponentType\Types\Image;
use App\Komma\Components\ComponentType\Types\LatestBlogArticles;
use App\Komma\Components\ComponentType\Types\Mmh;
use App\Komma\Components\ComponentType\Types\OpeningHoursText;
use App\Komma\Components\ComponentType\Types\Quote;
use App\Komma\Components\ComponentType\Types\Text;
use App\Komma\Components\ComponentType\Types\TextImage;
use App\Komma\Components\ComponentType\Types\TextImageImpression;
use App\Komma\Components\ComponentType\Types\TextImageSlider;
use App\Komma\Components\ComponentType\Types\TitleDoubleText;
use App\Komma\Components\ComponentType\Types\TitleDoubleTextImpression;
use App\Komma\Components\ComponentType\Types\Usp;
use App\Komma\Components\ComponentType\Types\Video;
use Illuminate\Support\Collection;
/**
* Class ComponentTypeFactory
*
* Knows how to create component types by passing it an ComponentTypes enum.
*
* WARNING! The Factory only can create one instance of a componentType per request.
* If you make componentTypes more then once in a request, you will get the same componentType.
* This is because they must have unique attribute keys.
*
* @package App\Komma\Components\ComponentType
*/
class ComponentTypeFactory
{
private static $maked = [];
/**
* Make componentTypes
*
* @param int $componentTypeId
* @return AbstractComponentType|Collection
* @throws \ReflectionException
*/
static public function make(int $componentTypeId = null) {
if($componentTypeId === null) {
$componentTypes = new Collection();
foreach(ComponentTypes::getAsArray() as $componentTypeId) {
if($componentTypeId === 0) continue;
$componentTypes->push(self::makeSpecificType($componentTypeId));
}
$componentTypes = $componentTypes->filter(function($type) {
return !is_null($type);
});
$componentTypes = $componentTypes->keyBy(function(AbstractComponentType $componentType) {
return $componentType->getId();
});
return $componentTypes;
} else {
return self::makeSpecificType($componentTypeId);
}
}
/**
* @param $componentTypeId
* @return AbstractComponentType
*/
private static function makeSpecificType($componentTypeId) {
if(in_array($componentTypeId, array_keys(self::$maked), true)) return self::$maked[$componentTypeId];
switch ($componentTypeId) {
case ComponentTypes::TEXT_IMAGE:
self::$maked[$componentTypeId] = new TextImage();
break;
case ComponentTypes::DOUBLE_TEXT:
self::$maked[$componentTypeId] = new DoubleText();
break;
case ComponentTypes::VIDEO:
self::$maked[$componentTypeId] = new Video();
break;
case ComponentTypes::TEXT:
self::$maked[$componentTypeId] = new Text();
break;
case ComponentTypes::IMAGE:
self::$maked[$componentTypeId] = new Image();
break;
case ComponentTypes::TITLE_DOUBLE_TEXT:
self::$maked[$componentTypeId] = new TitleDoubleText();
break;
case ComponentTypes::DOUBLE_IMAGE:
self::$maked[$componentTypeId] = new DoubleImage();
break;
case ComponentTypes::DOUBLE_IMAGE_THIRD:
self::$maked[$componentTypeId] = new DoubleImageThird();
break;
case ComponentTypes::HERO:
self::$maked[$componentTypeId] = new Hero();
break;
case ComponentTypes::TEXT_IMAGE_SLIDER:
self::$maked[$componentTypeId] = new TextImageSlider();
break;
case ComponentTypes::TEXT_IMAGE_IMPRESSION:
self::$maked[$componentTypeId] = new TextImageImpression();
break;
case ComponentTypes::TITLE_DOUBLE_TEXT_IMPRESSION:
self::$maked[$componentTypeId] = new TitleDoubleTextImpression();
break;
case ComponentTypes::USP:
self::$maked[$componentTypeId] = new Usp();
break;
case ComponentTypes::CTA_PERSON:
self::$maked[$componentTypeId] = new CtaPerson();
break;
case ComponentTypes::QUOTE:
self::$maked[$componentTypeId] = new Quote();
break;
case ComponentTypes::OPENING_HOURS_TEXT:
self::$maked[$componentTypeId] = new OpeningHoursText();
break;
case ComponentTypes::MMH:
self::$maked[$componentTypeId] = new Mmh();
break;
case ComponentTypes::BRANDS:
self::$maked[$componentTypeId] = new Brands();
break;
case ComponentTypes::CLIENT_REVIEWS:
self::$maked[$componentTypeId] = new ClientReviews();
break;
case ComponentTypes::ADVISORY_MEETING:
self::$maked[$componentTypeId] = new AdvisoryMeeting();
break;
case ComponentTypes::LATEST_BLOG_ARTICLES:
self::$maked[$componentTypeId] = new LatestBlogArticles();
break;
case ComponentTypes::HOME_DOUBLE_SERVICE_ROW:
self::$maked[$componentTypeId] = new HomeDoubleServiceRow();
break;
case ComponentTypes::HOME_SERVICE_ROW:
self::$maked[$componentTypeId] = new HomeServiceRow();
break;
case ComponentTypes::HEADING:
self::$maked[$componentTypeId] = new Heading();
break;
default:
throw new \RuntimeException('Type "'.$componentTypeId.'" not makable since it is unknown');
}
return self::$maked[$componentTypeId];
}
}