From 3ef9ca69d1b4d284eabf94ff6044dea3fe7eb430 Mon Sep 17 00:00:00 2001 From: Aaron Carlino Date: Thu, 27 Jul 2017 17:25:29 +1200 Subject: [PATCH 1/2] BUGFIX: DBComposite doesn't allow arbitrary property assignment To be more consistent with `ViewableData`, whose `setField()` method will fallback on [assigning properties arbitrarily](https://github.com/silverstripe/silverstripe-framework/blob/4/src/View/ViewableData.php#L213), `DBComposite` shouldn't bail out of `setField` when the field specified isn't in the record. Arbitrary property assignment is particularly important in injection. ```yaml SilverStripe\ORM\FieldType\DBComposite: dependencies: myService: %$Service ``` Right now, that fails, because `$obj->myService = Service` invokes `__set()` which calls `setField()` which refuses the assignment when `myService`is not in the record. --- src/ORM/FieldType/DBComposite.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/ORM/FieldType/DBComposite.php b/src/ORM/FieldType/DBComposite.php index 21751ade5..6febcc4f2 100644 --- a/src/ORM/FieldType/DBComposite.php +++ b/src/ORM/FieldType/DBComposite.php @@ -240,8 +240,9 @@ abstract class DBComposite extends DBField { $this->objCacheClear(); - // Skip non-db fields + // Non-db fields get assigned as normal properties if (!$this->hasField($field)) { + $this->$field = $value; return $this; } From 9903104fb8f29998230562b5c574b1b6d031a270 Mon Sep 17 00:00:00 2001 From: Aaron Carlino Date: Sun, 30 Jul 2017 22:39:42 +1200 Subject: [PATCH 2/2] Use parent::setField() --- src/ORM/FieldType/DBComposite.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/ORM/FieldType/DBComposite.php b/src/ORM/FieldType/DBComposite.php index 6febcc4f2..d8ee65478 100644 --- a/src/ORM/FieldType/DBComposite.php +++ b/src/ORM/FieldType/DBComposite.php @@ -242,7 +242,8 @@ abstract class DBComposite extends DBField // Non-db fields get assigned as normal properties if (!$this->hasField($field)) { - $this->$field = $value; + parent::setField($field, $value); + return $this; }