2015-12-15 4 views
2

Я создал правило проверки, которое проверяет, действительно ли существует URL. Я могу заставить его работать нормально, если я реализую его как настраиваемое правило в моих валидаторах таблиц. Однако я хотел бы сделать его многоразовым ... Я пробовал несколько разных способов, и мне либо сообщили, что метод не существует или не может быть найден, или что я вызываю функцию-член в NULL . Моя текущая ошибка :Как реализовать повторительный валидатор, который я создал для cakephp 3?

Error: Call to a member function add() on null

Я довольно новыми для программирования MVC и очень новой для CakePHP

согласно документации (и мое понимание этого) вот мой новый класс валидатора:

<?php 
// In src/Model/Validation/ContactValidator.php 
namespace App\Model\Validation; 

use Cake\Validation\Validator; 

class ContactValidator extends Validator 
{ 
    public function __construct() 
    { 
     parent::__construct(); 
     $validator 
      ->add('validDomain','custom',[ 
       'rule' => function($value){ 
       $url = parse_url($value); 
       $host = $url['host']; 
       if($host != gethostbyname($host)){ 
        return true; 
       } 
       return false; 
      } 
     ]); 

    } 
} 
?> 

здесь моя таблица (я удалил все действительные правила АТОР но один я пытаюсь заставить работать для этого примера):

<?php 
namespace App\Model\Table; 

use App\Model\Entity\Agent; 
use Cake\ORM\Query; 
use Cake\ORM\RulesChecker; 
use Cake\ORM\Table; 
use Cake\Validation\Validator; 
use Cake\Event\Event, ArrayObject; 

/** 
* Agents Model 
* 
* @property \Cake\ORM\Association\BelongsTo $Users 
* @property \Cake\ORM\Association\BelongsTo $Agencies 
* @property \Cake\ORM\Association\HasMany $Pictures 
* @property \Cake\ORM\Association\HasMany $Properties 
* @property \Cake\ORM\Association\HasMany $SoldProperties 
* @property \Cake\ORM\Association\BelongsToMany $Regions 
*/ 
class AgentsTable extends Table 
{ 

    /** 
    * Initialize method 
    * 
    * @param array $config The configuration for the Table. 
    * @return void 
    */ 
    public function initialize(array $config) 
    { 
     parent::initialize($config); 

     $this->table('agents'); 
     $this->displayField('user_id'); 
     $this->primaryKey('user_id'); 

     $this->addBehavior('Timestamp'); 

     $this->belongsTo('Users', [ 
      'foreignKey' => 'user_id', 
      'joinType' => 'INNER' 
     ]); 
     $this->belongsTo('Agencies', [ 
      'foreignKey' => 'agency_id' 
     ]); 
     $this->hasMany('Pictures', [ 
      'foreignKey' => 'agent_id' 
     ]); 
     $this->hasMany('Properties', [ 
      'foreignKey' => 'agent_id' 
     ]); 
     $this->hasMany('SoldProperties', [ 
      'foreignKey' => 'agent_id' 
     ]); 
     $this->belongsToMany('Regions', [ 
      'foreignKey' => 'agent_id', 
      'targetForeignKey' => 'region_id', 
      'joinTable' => 'agents_regions' 
     ]); 
    } 

    /** 
    * Default validation rules. 
    * 
    * @param \Cake\Validation\Validator $validator Validator instance. 
    * @return \Cake\Validation\Validator 
    */ 
    public function validationDefault(Validator $validator) 
    { 
     $validator = new \App\Model\Validation\ContactValidator; 

     $validator 
      ->add('agency_domain', 'valid',['rule' => 'validDomain', 'provider'=>'ContactValidator', 'message' => 'The url you have supplied does not exist!']); 

     return $validator; 
    } 
    public function isOwnedBy($userId) 
    { 
     return $this->exists(['user_id' => $userId]); 
    } 
    /** 
    * Returns a rules checker object that will be used for validating 
    * application integrity. 
    * 
    * @param \Cake\ORM\RulesChecker $rules The rules object to be modified. 
    * @return \Cake\ORM\RulesChecker 
    */ 

    public function beforeMarshal(Event $event, ArrayObject $data, ArrayObject $options) 
    { 
     if(isset($data['agency_domain'])) 
     { 
      $data['agency_domain']=strtolower($data['agency_domain']); 
      if(strpos($data['agency_domain'],"http")===false){ 
       $data['agency_domain'] = "http://".$data['agency_domain']; 
      } 
     } 
    } 
} 

если кто-то может мне точку в правильном направлении или даже показать мне рабочий пример того, как сделать это было бы весьма признателен ,

+0

Я думаю, вот что вам нужно. http://stackoverflow.com/questions/10958727/cakephp-import-controller удачи. – Netick

ответ

0

Просто создайте объект класса Validator.

public function __construct() 
{ 
    parent::__construct(); 
    $validator = new Validator(); 
    $validator 
     ->add('validDomain','custom',[ 
      'rule' => function($value){ 
      $url = parse_url($value); 
      $host = $url['host']; 
      if($host != gethostbyname($host)){ 
       return true; 
      } 
      return false; 
     } 
    ]); 

} 
Смежные вопросы