Skip to content

Instantly share code, notes, and snippets.

@RafaelKa
Created August 19, 2013 15:09
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save RafaelKa/6270217 to your computer and use it in GitHub Desktop.
Save RafaelKa/6270217 to your computer and use it in GitHub Desktop.
You can put assignPropertiesToORM() method to your aspect class and modify rows 82-89.
<?php
namespace ..........
use TYPO3\Flow\Annotations as Flow;
use Doctrine\ORM\Mapping as ORM;
/**
*
* @Flow\Scope("singleton")
* @Flow\Aspect
*/
class SomeAspect {
/**
* @Flow\Inject
* @var \TYPO3\Flow\Reflection\ReflectionService
*/
protected $reflectionService;
/**
* @param \TYPO3\Flow\Reflection\ReflectionService $reflectionService Description
*/
public function injectReflectionService(\TYPO3\Flow\Reflection\ReflectionService $reflectionService) {
$this->reflectionService = $reflectionService;
}
/**
* @var string
* @Flow\Introduce("some Pointcut")
*/
protected $purpose;
/**
* @var string
* @Flow\Introduce("some other Pointcut")
*/
protected $somethingElse;
/**
* Dirty hack for reflection service by introduced properties -> introduced properties are not in persistence layer
*
* @todo : Remove this advice if http://forge.typo3.org/issues/27045 is resolved.
*
* @param \TYPO3\Flow\Aop\JoinPointInterface $joinPoint The current join point
* @return void
* @Flow\Before("method(TYPO3\Flow\Persistence\Doctrine\EntityManagerFactory->create())")
*/
public function assignPropertiesToORM(\TYPO3\Flow\Aop\JoinPointInterface $joinPoint) {
// those are added as property even if not tagged with entity/valueobject
$propertyTypeWhiteList = array(
'DateTime',
'SplObjectStorage',
'Doctrine\Common\Collections\Collection',
'Doctrine\Common\Collections\ArrayCollection'
);
$aspectClassName = get_class($this);
$aspectClassShema = $this->reflectionService->getClassSchema($aspectClassName);
$introducedPropertyNames = $this->reflectionService->getPropertyNamesByAnnotation($aspectClassName, 'TYPO3\Flow\Annotations\Introduce');
foreach ($introducedPropertyNames as $propertyName) {
$isTransientProperty = $this->reflectionService->isPropertyAnnotatedWith($aspectClassName, $propertyName, 'TYPO3\Flow\Annotations\Transient');
if ($isTransientProperty) {continue;}
$declaredType = trim(implode(' ', $this->reflectionService->getPropertyTagValues($aspectClassName, $propertyName, 'var')), ' \\');
if (preg_match('/\s/', $declaredType) === 1 || empty($declaredType)) {
throw new \TYPO3\Flow\Reflection\Exception\InvalidPropertyTypeException(sprintf('Introduced in "%s" property "%s" has no @var annotation or type is not defined or is not annotated as "TYPO3\Flow\Annotations\Transient". Please define type for "%s" or annotate it as "TYPO3\Flow\Annotations\Transient".', $aspectClassName, $propertyName, $propertyName), 1366547612);
}
try {
$parsedType = \TYPO3\Flow\Utility\TypeHandling::parseType($declaredType);
} catch (\TYPO3\Flow\Utility\Exception\InvalidTypeException $exception) {
throw new \InvalidArgumentException(sprintf($exception->getMessage(), 'class "' . $aspectClassName . '" for property "' . $propertyName . '"'), 1366551857);
}
if (!in_array($parsedType['type'], $propertyTypeWhiteList)
&& (class_exists($parsedType['type']) || interface_exists($parsedType['type']))
&& !($this->reflectionService->isClassAnnotatedWith($parsedType['type'], 'TYPO3\Flow\Annotations\Entity') || $this->isClassAnnotatedWith($parsedType['type'], 'Doctrine\ORM\Mapping\Entity') || $this->isClassAnnotatedWith($parsedType['type'], 'TYPO3\Flow\Annotations\ValueObject'))) {
continue;
}
// get all affected classes stuff is still not present but if it is possible here then you can add this Property to all affected classes
// foreach ($affectedClasses as $affectedClass){
// $classSchema = $this->reflectionService->getClassSchema($affectedClass);
// $classSchema->addProperty($propertyName, $declaredType, $this->isPropertyAnnotatedWith($aspectClassName, $propertyName, 'TYPO3\Flow\Annotations\Lazy'));
// if ($this->reflectionService->isPropertyAnnotatedWith($className, $propertyName, 'TYPO3\Flow\Annotations\Identity')) {
// $classSchema->markAsIdentityProperty($propertyName);
// }
// }
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment