src/Serialization.php
53e0de50
 <?php
 
 namespace elanpl\L3;
 
 class Serialization{
     protected static $serializers; //registered serializers dictionary
 
     public function __construct()
     {
         if(!isset(self::$serializers)) self::$serializers = array(); 
     }
 
     public static function Register($ContentType, $Serializer, $ViewModelClass = null){
         if(isset($ViewModelClass) && $ViewModelClass!=''){
             $class_key = $ViewModelClass.'|';
         }
         else{
             $class_key = '';
         }
         self::$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(self::$serializers);
 
             foreach ($AcceptTypes as $type){
                 //Dedicated config for ViewModel class first...
                 if(array_key_exists($ViewModelClass."|".$type, self::$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;
                         }
                     }
                 }
 
                 //Then check configs without the ViewModel class name
                 if(array_key_exists($type, self::$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(Serialization::$serializers[get_class($ViewModel).'|'.$ContentType])){
             $serializerClass = Serialization::$serializers[get_class($ViewModel).'|'.$ContentType];
         }
         else if(isset(Serialization::$serializers[$ContentType])){
             $serializerClass = Serialization::$serializers[$ContentType];
         }
 
         if(isset($serializerClass)){
             $serializer = new $serializerClass();
             return $serializer->Serialize($ViewModel);
         }
         else{
             return null;
         }
     }
 }