/Builder/BaseBuilder.php

https://github.com/activeingredient/AdmingeneratorGeneratorBundle · PHP · 343 lines · 168 code · 49 blank · 126 comment · 8 complexity · 763cb37243ba8e90fbc7024103fef0b4 MD5 · raw file

  1. <?php
  2. namespace Admingenerator\GeneratorBundle\Builder;
  3. /**
  4. * Inteface to define structure of the builders
  5. *
  6. * @author cedric Lombardot
  7. *
  8. */
  9. use Symfony\Component\Templating\TemplateNameParser;
  10. use Symfony\Component\Config\FileLocator;
  11. use Symfony\Bundle\FrameworkBundle\Templating\Loader\TemplateLocator;
  12. use Symfony\Bundle\TwigBundle\Loader\FilesystemLoader;
  13. use Symfony\Component\HttpFoundation\ParameterBag;
  14. abstract class BaseBuilder implements BuilderInterface
  15. {
  16. const TWIG_EXTENSION = '.php.twig';
  17. /**
  18. * @var Generator the generator element
  19. */
  20. protected $generator;
  21. /**
  22. * @var array a list of templates directories
  23. */
  24. protected $templateDirectories = array();
  25. /**
  26. * @var string
  27. */
  28. protected $templateName;
  29. /**
  30. * @var string
  31. */
  32. protected $outputName;
  33. /**
  34. * @var boolean
  35. */
  36. protected $mustOverwriteIfExists = false;
  37. /**
  38. * @var array
  39. */
  40. protected $twigFilters = array(
  41. 'addslashes',
  42. 'var_export',
  43. 'is_numeric',
  44. 'ucfirst',
  45. '\Doctrine\Common\Util\Inflector::classify',
  46. 'substr',
  47. );
  48. /**
  49. * @var array
  50. */
  51. protected $twigExtensions = array(
  52. 'Admingenerator\GeneratorBundle\Twig\Extension\EchoExtension',
  53. );
  54. /**
  55. * (non-PHPdoc)
  56. * @see Builder/Admingenerator\GeneratorBundle\Builder.BuilderInterface::__construct()
  57. */
  58. public function __construct()
  59. {
  60. $this->templateDirectories = $this->getDefaultTemplateDirs();
  61. $this->templateName = $this->getDefaultTemplateName();
  62. $this->variables = new ParameterBag(array());
  63. }
  64. /**
  65. * (non-PHPdoc)
  66. * @see Builder/Admingenerator\GeneratorBundle\Builder.BuilderInterface::setGenerator()
  67. */
  68. public function setGenerator(Generator $generator)
  69. {
  70. $this->generator = $generator;
  71. }
  72. /**
  73. * (non-PHPdoc)
  74. * @see Builder/Admingenerator\GeneratorBundle\Builder.BuilderInterface::getGenerator()
  75. */
  76. public function getGenerator()
  77. {
  78. return $this->generator;
  79. }
  80. /**
  81. * (non-PHPdoc)
  82. * @see Builder/Admingenerator\GeneratorBundle\Builder.BuilderInterface::addTemplateDir()
  83. */
  84. public function addTemplateDir($templateDir)
  85. {
  86. $this->templateDirectories[$templateDir] = $templateDir;
  87. }
  88. /**
  89. * (non-PHPdoc)
  90. * @see Builder/Admingenerator\GeneratorBundle\Builder.BuilderInterface::setTemplateDirs()
  91. */
  92. public function setTemplateDirs(array $templateDirs)
  93. {
  94. $this->templateDirectories = $templateDirs;
  95. }
  96. /**
  97. * (non-PHPdoc)
  98. * @see Builder/Admingenerator\GeneratorBundle\Builder.BuilderInterface::getTemplateDirs()
  99. */
  100. public function getTemplateDirs()
  101. {
  102. return $this->templateDirectories;
  103. }
  104. /**
  105. * (non-PHPdoc)
  106. * @see Builder/Admingenerator\GeneratorBundle\Builder.BuilderInterface::getDefaultTemplateDirs()
  107. */
  108. public function getDefaultTemplateDirs()
  109. {
  110. return array();
  111. }
  112. /**
  113. * (non-PHPdoc)
  114. * @see Builder/Admingenerator\GeneratorBundle\Builder.BuilderInterface::setTemplateName()
  115. */
  116. public function setTemplateName($templateName)
  117. {
  118. $this->templateName = $templateName;
  119. }
  120. /**
  121. * (non-PHPdoc)
  122. * @see Builder/Admingenerator\GeneratorBundle\Builder.BuilderInterface::getTemplateName()
  123. */
  124. public function getTemplateName()
  125. {
  126. return $this->templateName;
  127. }
  128. /**
  129. * (non-PHPdoc)
  130. * @see Builder/Admingenerator\GeneratorBundle\Builder.BuilderInterface::getDefaultTemplateName()
  131. */
  132. public function getDefaultTemplateName()
  133. {
  134. return $this->getSimpleClassName(). self::TWIG_EXTENSION;
  135. }
  136. /**
  137. * (non-PHPdoc)
  138. * @see Builder/Admingenerator\GeneratorBundle\Builder.BuilderInterface::getSimpleClassName()
  139. */
  140. public function getSimpleClassName($class = null)
  141. {
  142. if (null === $class) {
  143. $class = get_class($this);
  144. }
  145. $classParts = explode('\\', $class);
  146. $simpleClassName = array_pop($classParts);
  147. return $simpleClassName;
  148. }
  149. /**
  150. * (non-PHPdoc)
  151. * @see Builder/Admingenerator\GeneratorBundle\Builder.BuilderInterface::setOutputName()
  152. */
  153. public function setOutputName($outputName)
  154. {
  155. $this->outputName = $outputName;
  156. }
  157. /**
  158. * (non-PHPdoc)
  159. * @see Builder/Admingenerator\GeneratorBundle\Builder.BuilderInterface::getOutputName()
  160. */
  161. public function getOutputName()
  162. {
  163. return $this->outputName;
  164. }
  165. /**
  166. * (non-PHPdoc)
  167. * @see Builder/Admingenerator\GeneratorBundle\Builder.BuilderInterface::mustOverwriteIfExists()
  168. */
  169. public function mustOverwriteIfExists()
  170. {
  171. return $this->mustOverwriteIfExists;
  172. }
  173. /**
  174. * (non-PHPdoc)
  175. * @see Admingenerator\GeneratorBundle\Builder.BuilderInterface::setMustOverwriteIfExists()
  176. */
  177. public function setMustOverwriteIfExists($status = true)
  178. {
  179. $this->mustOverwriteIfExists = $status;
  180. }
  181. /**
  182. * (non-PHPdoc)
  183. * @see Builder/Admingenerator\GeneratorBundle\Builder.BuilderInterface::setVariables()
  184. */
  185. public function setVariables($variables)
  186. {
  187. if (is_array($variables)) {
  188. $variables = new ParameterBag($variables);
  189. }
  190. $this->variables = $variables;
  191. }
  192. /**
  193. * (non-PHPdoc)
  194. * @see Builder/Admingenerator\GeneratorBundle\Builder.BuilderInterface::getVariables()
  195. */
  196. public function getVariables()
  197. {
  198. return $this->variables->all();
  199. }
  200. /**
  201. * (non-PHPdoc)
  202. * @see Builder/Admingenerator\GeneratorBundle\Builder.BuilderInterface::hasVariable()
  203. */
  204. public function hasVariable($key)
  205. {
  206. return $this->variables->has($key);
  207. }
  208. /**
  209. * (non-PHPdoc)
  210. * @see Builder/Admingenerator\GeneratorBundle\Builder.BuilderInterface::getVariable()
  211. */
  212. public function getVariable($key, $default = null, $deep = false)
  213. {
  214. return $this->variables->get($key, $default, $deep);
  215. }
  216. /**
  217. * (non-PHPdoc)
  218. * @see Builder/Admingenerator\GeneratorBundle\Builder.BuilderInterface::writeOnDisk()
  219. */
  220. public function writeOnDisk($outputDirectory)
  221. {
  222. $path = $outputDirectory . DIRECTORY_SEPARATOR . $this->getOutputName();
  223. $dir = dirname($path);
  224. if (!is_dir($dir)) {
  225. mkdir($dir, 0777, true);
  226. }
  227. if (!file_exists($path) || (file_exists($path) && $this->mustOverwriteIfExists)) {
  228. file_put_contents($path, $this->getCode());
  229. }
  230. }
  231. /**
  232. * (non-PHPdoc)
  233. * @see Builder/Admingenerator\GeneratorBundle\Builder.BuilderInterface::getCode()
  234. */
  235. public function getCode()
  236. {
  237. $locator = new TemplateLocator(new FileLocator($this->getTemplateDirs()));
  238. $templateNameParser = new TemplateNameParser();
  239. $loader = new FilesystemLoader($locator, $templateNameParser);
  240. $twig = new \Twig_Environment($loader, array(
  241. 'autoescape' => false,
  242. 'strict_variables' => true,
  243. 'debug' => true,
  244. 'cache' => $this->getGenerator()->getTempDir(),
  245. ));
  246. $this->addTwigExtensions($twig, $loader);
  247. $this->addTwigFilters($twig);
  248. $template = $twig->loadTemplate($this->getTemplateName());
  249. $variables = $this->getVariables();
  250. $variables['builder'] = $this;
  251. return $template->render($variables);
  252. }
  253. /**
  254. * (non-PHPdoc)
  255. * @see Builder/Admingenerator\GeneratorBundle\Builder.BuilderInterface::addTwigFilters()
  256. */
  257. public function addTwigFilters(\Twig_Environment $twig)
  258. {
  259. foreach ($this->twigFilters as $twigFilter) {
  260. if (($pos = strpos($twigFilter, ':')) !== false) {
  261. $twigFilterName = substr($twigFilter, $pos + 2);
  262. } else {
  263. $twigFilterName = $twigFilter;
  264. }
  265. $twig->addFilter($twigFilterName, new \Twig_Filter_Function($twigFilter));
  266. }
  267. }
  268. /**
  269. * (non-PHPdoc)
  270. * @see Builder/Admingenerator\GeneratorBundle\Builder.BuilderInterface::addTwigExtensions()
  271. */
  272. public function addTwigExtensions(\Twig_Environment $twig, \Twig_LoaderInterface $loader)
  273. {
  274. foreach ($this->twigExtensions as $twigExtensionName) {
  275. $twigExtension = new $twigExtensionName($loader);
  276. $twig->addExtension($twigExtension);
  277. }
  278. }
  279. /**
  280. * @return string the YamlKey
  281. */
  282. public function getYamlKey()
  283. {
  284. return $this->getSimpleClassName();
  285. }
  286. /**
  287. * Get model class from model param
  288. * @return string
  289. */
  290. public function getModelClass()
  291. {
  292. return $this->getSimpleClassName($this->getVariable('model'));
  293. }
  294. }