Php 在其他字段上处理验证程序后设置字段
在我的模型中,歌曲链接到类型。类型可以是Youtube、Soundcloud、Deezer等 当我的验证器验证了Php 在其他字段上处理验证程序后设置字段,php,symfony-1.4,validation,Php,Symfony 1.4,Validation,在我的模型中,歌曲链接到类型。类型可以是Youtube、Soundcloud、Deezer等 当我的验证器验证了链接值后,我想用正确的类型设置style_id值 最好的方法是什么?我认为最好的方法是执行两次检查: 第一次:使用验证器,让您知道它是这些视频提供商之一,然后返回视频链接(而不是id) 第二次:重新定义setLink()以获取链接,提取id并保存链接和样式id 如何做到这一点 创建自定义库,如lib/videoProvider.class.php。这是一种原型类,用于从视频提供商处
链接
值后,我想用正确的类型设置style_id值
最好的方法是什么?我认为最好的方法是执行两次检查:
- 第一次:使用验证器,让您知道它是这些视频提供商之一,然后返回视频链接(而不是id)
- 第二次:重新定义
以获取链接,提取id并保存setLink()
链接和
样式id
lib/videoProvider.class.php
。这是一种原型类,用于从视频提供商处有效检索id。当然,它需要改进
class videoProvider
{
private $url;
private $providers = array('youtube','deezer','soundcloud');
private $youtubePattern = '%^# Match any youtube URL
(?:https?://)? # Optional scheme. Either http or https
(?:www\.)? # Optional www subdomain
(?: # Group host alternatives
youtu\.be/ # Either youtu.be,
| youtube\.com # or youtube.com
(?: # Group path alternatives
/embed/ # Either /embed/
| /v/ # or /v/
| /watch\?v= # or /watch\?v=
) # End path alternatives.
) # End host alternatives.
([\w-]{10,12}) # Allow 10-12 for 11 char youtube id.
$%x';
private $deezerPattern = '/\d+/';
private $soundcloudPattern = '[\w-]+/[\w-]+$';
public function __construct($url)
{
$this->url = $url;
}
/**
* @return true / false
*/
private function checkYoutube()
{
return preg_match($this->youtubePattern, $this->url) ? true : false;
}
/**
* @return true / false
*/
private function checkDeezer()
{
// A Deezer URL has this format : http://www.deezer.com/track/61340079
return preg_match($this->deezerPattern, $this->url) ? true : false;
}
/**
* @return true / false
*/
private function checkSoundcloud()
{
// A Soundcloud URL has this format : http://soundcloud.com/[A-Z Artist]/[A-Z Title]
return preg_match($this->soundcloudPattern, $this->url) ? true : false;
}
/**
* @return true / false
*/
public function isValid()
{
// check all video provider as you do in your validator
// so it will return true if it find one, otherwise false
foreach ($this->providers as $provider)
{
$function = 'check'.ucfirst($provider);
if (true === $this->$function())
{
return true;
}
}
return false;
}
/**
* @return string
*/
public function getId()
{
if ($this->checkYoutube() && preg_match($this->youtubePattern, $this->url, $matches))
{
return $matches[1];
}
if ($this->checkDeezer() && preg_match($this->deezerPattern, $this->url, $matches))
{
return $matches[1];
}
if ($this->checkSoundcloud() && preg_match($this->deezerPattern, $this->url, $matches))
{
return $matches[1];
}
}
/**
* @return string
*/
public function getProvider()
{
if ($this->checkYoutube())
{
return 'youtube';
}
if ($this->checkDeezer())
{
return 'deezer';
}
if ($this->checkSoundcloud())
{
return 'soundcloud';
}
}
}
然后在验证器的doClean
中,您只需要调用这个类,如下所示:
$videoProvider = new videoProvider($url);
if (false === $videoProvider->isValid())
{
throw new sfValidatorError($this, 'invalid', array('value' => $url));
}
return $url;
最后,Song.class.php中的setLink
现在应该是:
public function setLink($value)
{
// only perform this tweak if the value is a http link
if (preg_match('/^http/i', $value))
{
$videoProvider = new videoProvider($value);
// define url id
parent::_set('link', $videoProvider->getId());
// define type id
$provider = $videoProvider->getProvider();
$type = Doctrine_Core::getTable('Type')->findOneByName($provider);
parent::_set('type_id', $type->getId());
}
}
这是必须测试和改进的初稿(测试getId()是否返回id而不是false,getProvider是否返回id,等等……)我将回答与您的其他问题相同的答案:也许,我的问题还不清楚。问题是我选择了validator方法,那么在处理validator时如何设置另一个表的值呢验证程序不应更新数据库中的值。验证器检查此字段是否正常,然后返回true或字段不正常抛出异常。这就是全部。如果验证程序通过,则表示您的url正常。然后,您应该在保存表单时更新您的
style\u id
。这就是我在youtube验证之前在另一个答案中所做的。您应该使用函数定义提供者,然后设置样式\u id
,而不是youtube验证。你看到了吗?你建议我停止使用验证器,但是你向我解释的第一种方法?验证器是一种很好的方法,因为当错误发生时,它很容易通知用户!保留验证器。这是做这件事的方法。只要重新使用我开始向你展示的方式,实现歌曲和类型之间的联系。这看起来很完美!今晚我来测试一下。非常感谢。第一次更新。然后我有两个问题:在最后一段代码中,为什么在验证器进行验证时检查该值是否为HTTP链接。getId和getProvider的功能与check函数完全相同,只是它们将返回一个字符串,code replication no?,关于setLink
,因为当您从后端编辑id时,您必须直接使用它来设置id。是的,这段代码可能会被重构,正如我说的,这是我刚刚从头开始写的草稿:)代码会被更新。我有一个错误:您必须指定findOneBy的值。我理解getProvider()不返回任何内容。此外,findOneBy是否区分大小写?check*函数没有返回true/false(而是一个整数),并且验证器检查是否返回where false(一个布尔值)。