Friday, January 13, 2012

Jason Longshore: Symfony 1.4 and subdirectories for models, forms and filters

Jason Longshore: Symfony 1.4 and subdirectories for models, forms and filters

Symfony 1.4 with Doctrine stores all models in lib/model/doctrine, all forms in lib/form/doctrine and all filters in lib/filter/doctrine. This is a good behavior for small projects but can get out of hand when you have lots of tables as the folders get really large.

While there is an option "package" there are a few problems with its implementation. First, it is intended to be used for internal plugin implementation. As such, it introduces intermediate plugin classes even when you aren't packaging your models as a plugin. Second, it doesn't apply to form or filter classes.

Below is a patch to allow symfony to honor a new option, "directory" which will build these three items in sub-directories instead. As with all Doctrine schema options, you can apply this option in individual schema.yml files to all models or to only specific ones.

I just developed these mods this morning so there may be some issues with them. Ad-hoc testing seems to indicate that they work with at least the Doctrine features we use in our codebase : )

The patch
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
Index: lib/plugins/sfDoctrinePlugin/lib/generator/sfDoctrineFormGenerator.class.php
===================================================================
--- lib/plugins/sfDoctrinePlugin/lib/generator/sfDoctrineFormGenerator.class.php (revision 6558)
+++ lib/plugins/sfDoctrinePlugin/lib/generator/sfDoctrineFormGenerator.class.php (working copy)
@@ -93,6 +93,10 @@
$this->modelName = $model;
$baseDir = sfConfig::get('sf_lib_dir') . '/form/doctrine';
+
+ if($dirOption = $this->table->getOption('directory')) {
+ $baseDir .= '/'.$dirOption;
+ }
$isPluginModel = $this->isPluginModel($model);
if ($isPluginModel)
Index: lib/plugins/sfDoctrinePlugin/lib/generator/sfDoctrineFormFilterGenerator.class.php
===================================================================
--- lib/plugins/sfDoctrinePlugin/lib/generator/sfDoctrineFormFilterGenerator.class.php (revision 6558)
+++ lib/plugins/sfDoctrinePlugin/lib/generator/sfDoctrineFormFilterGenerator.class.php (working copy)
@@ -76,6 +76,10 @@
$this->modelName = $model;
$baseDir = sfConfig::get('sf_lib_dir') . '/filter/doctrine';
+
+ if($dirOption = $this->table->getOption('directory')) {
+ $baseDir .= '/'.$dirOption;
+ }
$isPluginModel = $this->isPluginModel($model);
if ($isPluginModel)
Index: lib/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/Import/Builder.php
===================================================================
--- lib/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/Import/Builder.php (revision 6558)
+++ lib/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/Import/Builder.php (working copy)
@@ -1189,7 +1189,13 @@
$definition['inheritance']['extends'] = $prefix . $definition['inheritance']['extends'];
}
}
-
+
+ $__path = $this->_path;
+
+ if(isset($definition['options']['directory'])) {
+ $this->_path = sprintf('%s/%s', $this->getTargetPath(), $definition['options']['directory']);
+ }
+
$definitionCode = $this->buildDefinition($definition);
if ($prefix) {
@@ -1199,7 +1205,7 @@
}
$fileName = $this->_getFileName($originalClassName, $definition);
-
+
$packagesPath = $this->_packagesPath ? $this->_packagesPath:$this->_path;
// If this is a main class that either extends from Base or Package class
@@ -1274,6 +1280,8 @@
} else {
$bytes = file_put_contents($writePath, $code);
}
+
+ $this->_path = $__path;
if (isset($bytes) && $bytes === false) {
throw new Doctrine_Import_Builder_Exception("Couldn't write file " . $writePath);

Applying to a specific model in a schema.yml file (Any .yml file in config/doctrine)

1
2
3
4
5
6
7
8
User:
options:
directory: prevention
tableName: xxx
columns:
..
UserAccount:
..

Applying to all models in a schema.yml file (Any .yml file in config/doctrine)

1
2
3
4
5
6
7
8
9
options:
directory: prevention
User:
tableName: xxx
columns:
..
UserAccount:
..
More than 3 requests, I'll translate this to Chinese.
超过3个请求,我就会把这篇文章翻译成中文。

No comments: