php - 动态使用 setter 和 getter 的 symfony Doctrine

标签 php oop symfony doctrine

我正在使用 symfony 和 doctrine。

服务器获取 URL/company/{id} 的 HTTP PATCH 请求,其中包含模型的属性及其值,如 {"name": "My new name"} 新值需要持久化到数据库中。

$request = Request::createFromGlobals();
$requestContentJSON = $request->getContent();
$requestContentObj = json_decode($requestContentJSON);

$repository = $this->getDoctrine()->getRepository('MyBundle:Company');
$company = $repository->find($id);

现在我可以输入 $company->setName($requestContentObj[0]); 但收到的属性会有所不同。现在我正在使用以下代码来处理每个属性:

foreach($requestContentObj as $key => $value){
    switch($key){
        case 'name':
            $company->setName($value);
            break;
        case 'department':
            $company->setDepartment($value);
            break;
        case 'origin':
            $company->setOrigin($value);
            break;
        case 'headquarters':
            $company->setHeadquarters($value);
            break;
        case 'email':
            $company->setEmail($value);
            break;
        case 'twitterid':
            $company->setTwitterId($value);
            break;
        case 'description':
            $company->setDescription($value);
            break;
    }
}

但这看起来不太聪明,尤其是因为我知道我会有其他实体,如新闻、产品、用户等,它们的属性将以相同的方式更新。我想做这样的事情:

$company->set("property", "value");

我首先想到的是将此 switch 语句放在此 set 函数内的公司类中以及我拥有的所有其他实体类中。但是有更好的方法吗?也许 symfony/doctrine 已经内置了解决方案,但我没有找到适合我的东西。

我仍然希望将 setter 和 getter 作为一项长期投资。

谢谢。

最佳答案

假设您将拥有类似于方法名称的属性名称。

你可以这样做。设置多个属性。

Class customer {

    protected $_email;

    public function __construct(array $config = array()){
         $this->setOptions($config);
     }

    public function getEmail(){
        return $this->_email;
    }

    public function setEmail($email){
        $this->_email = $email;
    }

    public function setOptions(array $options)
    {
        $_classMethods = get_class_methods($this);
        foreach ($options as $key => $value) {
            $method = 'set' . ucfirst($key);
            if (in_array($method, $_classMethods)) {
                $this->$method($value);
            } else {
                throw new Exception('Invalid method name');
            }
        }
        return $this;
    }

    public function setOption($key, $value){
        return $this->setOptions(array($key, $value));
    }

}

现在你可以简单地这样做:

$array = array('email' => 'abc.@gmail.com');
$customer = new Customer($array);
echo $customer->getEmail();

关于php - 动态使用 setter 和 getter 的 symfony Doctrine ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23078604/

相关文章:

symfony - 从实体生成 db 表时如何使用 char 而不是 varchar?

php - 如果文件名减去分机号,.htaccess url 重写行为被覆盖。与网址相同

php - 在将值存储为 CSV 的列上使用多个标签进行最佳结果搜索

oop - 面向经验丰富的开发人员的修订书

symfony - 在 Symfony 项目中查找未使用的 TWIG 布局

caching - Symfony2 动态路由 - 缓存问题

以负数作为输入的 PHP 的 pow() 不起作用

php - 更改 WooCommerce 迷你购物车小部件上的购物车和结帐按钮链接

Java从对象到子类的转换

java - 如何在构造函数中创建给定类型的新对象