2014-11-20 3 views
0

Я хотел бы написать свой код в соответствии с парадигмой MVC в cakePHP3:cakePHP3: Как написать чистый код MVC?

У меня есть формуляр для регистрации владельца, но как владелец основного пользователь с дополнительными информациями, у меня есть 2 таблицы SQL; один для пользователя, указывающего на владельца, и один для владельца.

Идея здесь в том, что пользователю не нужен владелец.

Итак, в настоящее время я написал код, который делает то, что я хочу в действии add в OwnerController.php.

public function add() { 

    $this->loadModel('Users'); 

    $user = $this->Users->newEntity($this->request->data); 
    $owner = $this->Owners->newEntity($this->request->data); 

    $addDatas = [ 
      'owner_id' => 'id', 
      'email'  => $owner['email'], 
      'role' => 'owner', 
      'token'  => md5(time() . '-' . uniqid()), 
    ]; 

    $user = $this->Users->patchEntity($user, $addDatas); 

    $owner->users = [$user]; 

    if ($this->request->is('post')) { 
     if ($this->Owners->validate($owner)) { 
      if ($this->Owners->save($owner)) { 
       $email = new Email('gmail'); 
       $email->template('activationLink') 
        ->emailFormat('text') 
        ->to($owner['email']) 
         ->from('[email protected]') 
        ->subject(__('Votre inscription sur monsite.fr')) 
        ->viewVars(['user' => $user, 'id' => $user['id']]) 
        ->send(); 

       $this->Flash->success(__("Merci de vous être enregistré. un email a été envoyé à {0} pour activer votre compte", $owner['email'])); 
       return $this->redirect(['action' => 'index']); 
      } 
      $this->Flash->error(__("Impossible de vous enregistrer, veuillez corriger les erreurs")); 
     } else { 
      $this->Flash->error(__("Impossible de vous enregistrer, veuillez corriger les erreurs")); 
     } 
    } 
    $this->set(compact('owner')); 
} 

теперь, я хотел бы написать это так:

public function add() { 

    $owner = $this->Owners->newEntity($this->request->data); 

    if ($this->request->is('post')) { 

     if ($owner->addOwner($this->request->data)) { 
      $this->Flash->success(__("Merci de vous être enregistré. un email a été envoyé à {0} pour activer votre compte", $owner['email'])); 
      return $this->redirect(['action' => 'index']); 
     } else { 
      $this->Flash->error(__("Impossible de vous enregistrer, veuillez corriger les erreurs")); 
     } 
    } 

    $this->set(compact('owner')); 
} 

И так, я бы действие addOwner() в моем Owner.php и позволить ему делать все, что нужно.

Моя проблема заключается в том, что я не вижу в документации, как я могу получить доступ к моей модели User из моей модели Owner, а точнее, как сделать модель User проверкой и сохранить ее запись.

Возможно, я ошибаюсь, но я не вижу такого способа кодирования в учебниках.

Owner.php

class Owner extends Entity { 

    /** 
    * Fields that can be mass assigned using newEntity() or patchEntity(). 
    * 
    * @var array 
    */ 
     protected $_accessible = [ 
      'email' => true, 
      'phone' => true, 
      'company' => true, 
      'tva_number' => true, 
      'address' => true, 
      'postcode' => true, 
      'city' => true, 
      'users' => true, 
     ]; 


     public function addOwner($data = array()) { 

      // This is where I want to create both the owner and the user 
      // as the owner is basically a user with additional contact infos. 
      // But how to access the User model here to realize the validation 
      // as save the record? 
     } 
    } 

User.php

class User extends Entity { 

/** 
* Fields that can be mass assigned using newEntity() or patchEntity(). 
* 
* @var array 
*/ 
    protected $_accessible = [ 
     'username' => true, 
     'password' => true, 
     'first_name' => true, 
     'last_name' => true, 
     'email' => true, 
     'role' => true, 
     'owner' => true, 
     'sites_user' => true, 
     'active' => true, 
     'token' => true, 
    ]; 

    protected function _setPassword($password) { 
     return (new DefaultPasswordHasher)->hash($password); 
    } 

} 

UsersTable.php

public function initialize(array $config) { 
    $this->table('users'); 
    $this->displayField('id'); 
    $this->primaryKey('id'); 

    $this->belongsTo('Owners', [ 
     'foreignKey' => 'owner_id', 
    ]); 
    $this->belongsTo('SitesUsers', [ 
     'foreignKey' => 'sites_users_id', 
    ]); 
} 

OwnersTable.php

public function initialize(array $config) { 
    $this->table('owners'); 
    $this->displayField('id'); 
    $this->primaryKey('id'); 
    $this->addBehavior('Timestamp'); 

    $this->hasMany('Users', [ 
     'foreignKey' => 'owner_id', 
    ]); 
} 

Можете ли вы показать мне отношения между ними?

+0

Можете ли вы показать модели plz? –

+0

@may saghira, да, я отредактировал мое сообщение для этого. – 2ndGAB

+0

где отношение между двумя моделями? Я не вижу никаких прав на использование или hasMany? –

ответ

0

Во-первых, вы должны нормализовать свою базу данных (на сущности Owners я вижу, что у вас есть пользователи, которые представляют собой массив пользователей).

Кроме того, использование CakePHP конвенций 3 именовании: http://book.cakephp.org/3.0/en/intro/conventions.html

Тогда, так как это, кажется, первые шаги в CakePHP 3, вы должны попробовать испечь (CakePHP) Леса строительные приложения.

Выпекать (CakePHP лес): http://book.cakephp.org/3.0/en/bake/usage.html

Выпечка это отличный способ, чтобы посмотреть, как вы должны начать кодирование в CakePHP 3.

Надеется, что это помогает.

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