<?php
namespace elanpl\L3;
class Serialization{
protected $serializers;
public function __construct()
{
$this->serializers = array();
}
public function register($contentType, $serializer, $viewModelClass = null){
if(!class_exists($serializer,true)){
throw new \Exception("Class \"$serializer\" not found!");
}
if(!isset(class_implements($serializer, true)['elanpl\\L3\\ISerializer'])){
throw new \Exception("Class \"$serializer\" does not implement ISerializer interface!");
}
if(isset($viewModelClass) && $viewModelClass!=''){
$class_key = $viewModelClass.'|';
}
else{
$class_key = '';
}
$this->serializers[$class_key.$contentType] = $serializer;
}
public function match($acceptTypes, $viewModel=null){
if(isset($viewModel)){
if(is_object($viewModel)){
$viewModelClass = get_class($viewModel);
}
if(is_string($viewModel)){
$viewModelClass = $viewModel;
}
}
if(is_array($acceptTypes)){
$registeredTypes = array_keys($this->serializers);
foreach ($acceptTypes as $type){
if(array_key_exists($viewModelClass."|".$type, $this->serializers)){
return $type;
}
foreach($registeredTypes as $rtype_with_class){
$rtype_parts = explode("|", $rtype_with_class);
if(count($rtype_parts)==2){
$rclass = $rtype_parts[0];
$t = explode("/", $type);
$rt = explode("/", $rtype_parts[1]);
if($rclass==$viewModelClass && ($t[0]=="*" || $rt[0]=="*" || $t[0]==$rt[0]) && ($t[1]=="*" || $rt[1]=="*" || $t[1]==$rt[1])){
return $rtype_with_class;
}
}
}
if(array_key_exists($type, $this->serializers)){
return $type;
}
foreach($registeredTypes as $rtype){
$t = explode("/", $type);
$rt = explode("/", $rtype);
if(($t[0]=="*" || $rt[0]=="*" || $t[0]==$t[0]) && ($t[1]=="*" || $rt[1]=="*" || $t[1]==$t[1])){
return $rtype;
}
}
}
}
return false;
}
public function serialize($contentType, $viewModel){
if(isset($this->serializers[get_class($viewModel).'|'.$contentType])){
$serializerClass = $this->serializers[get_class($viewModel).'|'.$contentType];
}
else if(isset($this->serializers[$contentType])){
$serializerClass = $this->serializers[$contentType];
}
if(isset($serializerClass)){
$serializer = new $serializerClass();
return $serializer->serialize($viewModel);
}
else{
return null;
}
}
}