2016-09-21 2 views
0

С Tx_Extbase_Property_Mapper::map() («старый свойство картограф») можно было скопировать атрибуты от одного к другому объекту:Как скопировать атрибуты из одного объекта в другой с помощью TYPO3 Extbase?

$propertyMapper = t3lib_div::makeInstance('Tx_Extbase_Property_Mapper'); 
$propertyMapper->map(array('senderAddress', 'recipientAddress', 'subject', 'body'), $oldObj, $newObj); 

С «новой» собственности картографа метод map() не существует больше.

Есть ли рабочая/элегантная возможность скопировать атрибуты от одного к другому объекту в Extbase?

+0

Я не думаю, что эквивалент существует, насколько я понял? Чего именно вы хотите достичь? Только что данный массив свойств из $ objA будет скопирован в $ objB? (что не связано с каким-либо сопоставлением). Или вам нужно какое-то разрешение (например, senderAddress on A - поле foobar на B?) – Susi

+1

@Susi Я наткнулся на него, обновляя расширение TYPO3 от TYPO3 4.5 до 7.6: в расширении ' Tx_Extbase_Property_Mapper :: map() 'использовался для установки некоторых атрибутов вновь созданного объекта со значениями атрибутов существующего объекта (одного типа). Я думаю, что до тех пор, пока для каждого атрибута есть геттер и сеттер, фрагмент @ froemken выполнит эту работу. К настоящему моменту я не уверен, что если использовать 'Tx_Extbase_Property_Mapper :: map()' или решение @ froemken (хотя оно отлично работает) даже необходимо (для моей usecase) - я думаю, что я предпочитаю называть getter и setter для каждого свойства явно. –

+0

Вызов геттера и сеттера предпочтительнее, если возможно - по крайней мере для меня. Это кажется намного более чистым и более явным (без магии);). – Susi

ответ

2

Нет, не в Extbase, но вы можете создать свой собственный метод, как это:

$properties = array('senderAddress', 'recipientAddress', 'subject', 'body'); 
foreach ($properties as $property) { 
    $getter = get . ucfirst($property); 
    $setter = set . ucfirst($property); 
    $newObject->{$setter}($oldObject->{$getter}()); 
} 
+2

Я предлагаю использовать 'ObjectAccess :: getProperty' и' ObjectAccess :: setProperty', поэтому вам не нужно предполагать, что все ваши получатели имеют префикс «get» (также поддерживает «is» для bools!). См. Также 'getGettableProperties' в том же классе! –

+0

@ClausDue Хорошая точка. –

+0

На основе кода @ClausDue я создал службу клонирования, которая создает копии объектов, включая все отношения. Он также обрабатывает ленивые объекты, связанные с загрузкой, и вы можете установить для каждого свойства, если он должен быть клонирован, указан или проигнорирован. Код был для TYPO3 4.7 и, вероятно, немного длиннее для публикации здесь. Если вам интересно ... –

Смежные вопросы