使用Yii 1.1,我考虑创建一个基于SOAP的Web服务,该服务在模型上执行常见的CRUD操作。例如,我只想为接收一些参数的所有模型创建一个CreateObject函数,即时查找模型并将这些参数分配给适当的模型属性。 例如,对于用户模型,我在我的Web服务控制器中创建了以下操作:
/** Create a new User record
* @param string username
* @param string password
* @param string family
* @param string name
* @param string title
* @param string email
* @param string mobile
* @return mixed true on success or an array of validation errors on failure
* @soap
*/
public function createUser($username, $password, $family, $name="", $title="", $email="",$mobile="")
{
$newUser = new User();
$newUser->username = $username;
$newUser->password = $password;
$newUser->family = $family;
$newUser->name = $name;
$newUser->title = $title;
$newUser->email = $email;
$newUser->mobile = $mobile;
//Get user roles
/* if (is_array($roles) && !empty($roles)) {
$roleList = User::getRoleList();
$newUser->_roles = array_intersect($roles, $roleList);
} else $newUser->_roles = array();*/
if($newUser->save())
return true;
else
return $newUser->getErrors();
}
此功能通过Web服务调用以创建新用户,并且工作正常。但是我必须做同样的事情来从其他模型创建一个新对象。
我听说过实体模式或实体工厂,这可能会帮助我归档这个目标,但我没有找到任何关于此的好教程。 任何建议都受到高度赞赏。
答案 0 :(得分:0)
使用接口或继承与SOAP是相当棘手的,因此更容易的方法是修改您的SOAP Web服务,以便它将接收两个字符串,一个用于模型的名称,另一个是带有属性的json字符串您的模型,因此您可以通过以下方式实现模型:
public function create($model,$attributes){
$model=new $modelName;
}
此外,您可以使用php json函数解码编码为json对象的属性
的更新强>
如果您需要一些复杂的逻辑来初始化模型,您可以尝试使用工厂方法或Factory类。一个非常简单的例子可能是这样的:
class ModelsFactory{
//use constants to identify the classes that you can return
const Model1=1;
const Model2=2;
public static getInstance($model){
$modelInstance=null;
switch($model){
case Model1:
//... initialize a model1 class and asign to $modelInstance
case Model2:
//...
}
return $modelInstance;
}
}
如您所见,您可以轻松地初始化复杂类。您也可以根据需要进行扩展。此外,如果您需要参数,只需将它们以对象的形式或作为关联数组添加到creator方法中 希望这有帮助!