/** * Initializes a new instance of the <tt>ProxyFactory</tt> class that is * connected to the given <tt>DocumentManager</tt>. * * @param DocumentManager $dm The DocumentManager the new factory works for. * @param string $proxyDir The directory to use for the proxy classes. It must exist. * @param string $proxyNs The namespace to use for the proxy classes. * @param boolean $autoGenerate Whether to automatically generate proxy classes. */ public function __construct(DocumentManager $dm, $proxyDir, $proxyNs, $autoGenerate = false) { if (!$proxyDir) { throw ProxyException::proxyDirectoryRequired(); } if (!$proxyNs) { throw ProxyException::proxyNamespaceRequired(); } $this->dm = $dm; $this->proxyDir = $proxyDir; $this->autoGenerate = $autoGenerate; $this->proxyNamespace = $proxyNs; }
/** * Generates a proxy class file. * * @param $class * @param $proxyClassName * @param $file The path of the file to write to. */ private function generateProxyClass($class, $fileName, $file) { $methods = $this->generateMethods($class); $sleepImpl = $this->generateSleep($class); $cloneImpl = $class->reflClass->hasMethod('__clone') ? 'parent::__clone();' : ''; // hasMethod() checks case-insensitive $placeholders = array('<namespace>', '<proxyClassName>', '<className>', '<methods>', '<sleepImpl>', '<cloneImpl>'); $className = ltrim($class->name, '\\'); $proxyClassName = self::generateProxyClassName($class->name, $this->proxyNamespace); $parts = explode('\\', strrev($proxyClassName), 2); $proxyClassNamespace = strrev($parts[1]); $proxyClassName = strrev($parts[0]); $replacements = array($proxyClassNamespace, $proxyClassName, $className, $methods, $sleepImpl, $cloneImpl); $file = str_replace($placeholders, $replacements, $file); $parentDirectory = dirname($fileName); if (!is_dir($parentDirectory)) { if (false === @mkdir($parentDirectory, 0775, true)) { throw ProxyException::proxyDirectoryNotWritable(); } } else { if (!is_writable($parentDirectory)) { throw ProxyException::proxyDirectoryNotWritable(); } } file_put_contents($fileName, $file, LOCK_EX); }