Allow Polymorphic_Field_Helper::parse() to accept array and object inputs
🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -5,11 +5,15 @@ namespace App\RSpade\Core;
|
|||||||
/**
|
/**
|
||||||
* Polymorphic Field Helper
|
* Polymorphic Field Helper
|
||||||
*
|
*
|
||||||
* Handles JSON-encoded polymorphic field values from form components.
|
* Handles polymorphic field values from form components.
|
||||||
* Provides parsing, validation, and security checks for polymorphic relationships.
|
* Provides parsing, validation, and security checks for polymorphic relationships.
|
||||||
*
|
*
|
||||||
* Polymorphic fields are submitted as JSON: {"model":"Contact_Model","id":123}
|
* Accepts multiple input formats:
|
||||||
* This class parses that JSON and validates the model type against a whitelist.
|
* - JSON string: '{"model":"Contact_Model","id":123}'
|
||||||
|
* - Array: ['model' => 'Contact_Model', 'id' => 123]
|
||||||
|
* - Object: stdClass with model and id properties
|
||||||
|
*
|
||||||
|
* Validates the model type against a whitelist of allowed classes.
|
||||||
*
|
*
|
||||||
* Usage in controllers:
|
* Usage in controllers:
|
||||||
*
|
*
|
||||||
@@ -67,25 +71,42 @@ class Polymorphic_Field_Helper
|
|||||||
private array $allowed_models = [];
|
private array $allowed_models = [];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Parse a JSON-encoded polymorphic field value
|
* Parse a polymorphic field value
|
||||||
*
|
*
|
||||||
* @param string|null $json_value The JSON string from form submission (e.g., '{"model":"Contact_Model","id":123}')
|
* Accepts multiple formats:
|
||||||
|
* - JSON string: '{"model":"Contact_Model","id":123}'
|
||||||
|
* - Array: ['model' => 'Contact_Model', 'id' => 123]
|
||||||
|
* - Object: stdClass with model and id properties
|
||||||
|
*
|
||||||
|
* @param string|array|object|null $value The polymorphic value in any supported format
|
||||||
* @param array $allowed_model_classes Array of allowed model class names (use Model::class syntax)
|
* @param array $allowed_model_classes Array of allowed model class names (use Model::class syntax)
|
||||||
* @return self
|
* @return self
|
||||||
*/
|
*/
|
||||||
public static function parse(?string $json_value, array $allowed_model_classes): self
|
public static function parse(string|array|object|null $value, array $allowed_model_classes): self
|
||||||
{
|
{
|
||||||
$instance = new self();
|
$instance = new self();
|
||||||
$instance->allowed_models = array_map(fn($class) => class_basename($class), $allowed_model_classes);
|
$instance->allowed_models = array_map(fn($class) => class_basename($class), $allowed_model_classes);
|
||||||
|
|
||||||
if (empty($json_value)) {
|
if (empty($value)) {
|
||||||
return $instance;
|
return $instance;
|
||||||
}
|
}
|
||||||
|
|
||||||
$decoded = json_decode($json_value, true);
|
// Normalize to array
|
||||||
|
$decoded = null;
|
||||||
|
if (is_string($value)) {
|
||||||
|
$decoded = json_decode($value, true);
|
||||||
if (!is_array($decoded)) {
|
if (!is_array($decoded)) {
|
||||||
return $instance;
|
return $instance;
|
||||||
}
|
}
|
||||||
|
} elseif (is_object($value)) {
|
||||||
|
$decoded = (array) $value;
|
||||||
|
} elseif (is_array($value)) {
|
||||||
|
$decoded = $value;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!$decoded) {
|
||||||
|
return $instance;
|
||||||
|
}
|
||||||
|
|
||||||
$instance->was_provided = true;
|
$instance->was_provided = true;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user