Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/249.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在其他字段上处理验证程序后设置字段_Php_Symfony 1.4_Validation - Fatal编程技术网

Php 在其他字段上处理验证程序后设置字段

Php 在其他字段上处理验证程序后设置字段,php,symfony-1.4,validation,Php,Symfony 1.4,Validation,在我的模型中,歌曲链接到类型。类型可以是Youtube、Soundcloud、Deezer等 当我的验证器验证了链接值后,我想用正确的类型设置style_id值 最好的方法是什么?我认为最好的方法是执行两次检查: 第一次:使用验证器,让您知道它是这些视频提供商之一,然后返回视频链接(而不是id) 第二次:重新定义setLink()以获取链接,提取id并保存链接和样式id 如何做到这一点 创建自定义库,如lib/videoProvider.class.php。这是一种原型类,用于从视频提供商处

在我的模型中,歌曲链接到类型。类型可以是Youtube、Soundcloud、Deezer等

当我的验证器验证了
链接
值后,我想用正确的类型设置style_id值


最好的方法是什么?

我认为最好的方法是执行两次检查:

  • 第一次:使用验证器,让您知道它是这些视频提供商之一,然后返回视频链接(而不是id)
  • 第二次:重新定义
    setLink()
    以获取链接,提取id并保存
    链接和
    样式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(一个布尔值)。