cakePHP3: Как написать чистый код MVC?

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

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

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

Итак, в настоящее время я написал код, который делает то, что я хочу, в действии добавления в 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 проверять и сохранять свою запись.

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

Владелец.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?
        }
    }

Пользователь.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',
    ]);
}

Таблица владельцев.php

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

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

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


person fralbo    schedule 20.11.2014    source источник
comment
Можешь показать модели плз?   -  person may saghira    schedule 21.11.2014
comment
@may saghira, да, я отредактировал свой пост для этого.   -  person fralbo    schedule 21.11.2014
comment
где связь между двумя моделями? я не вижу ни одного createdTo или hasMany ?   -  person may saghira    schedule 21.11.2014
comment
ок, извините, есть в настольных моделях. я редактирую сообщение   -  person fralbo    schedule 21.11.2014


Ответы (1)


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

Также используйте соглашения об именах CakePHP 3: http://book.cakephp.org/3.0/en/intro/conventions.html

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

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

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

Надеюсь это поможет.

person Sidney    schedule 01.04.2016