Доступ к классу модели внутри класса сущности другой модели

Я использую CakePHP 3.4+

Я написал заявление с multi level membership,

Pro Участники получат возможность просмотреть короткий URL-адрес для внешних ссылок, который при совместном использовании будет записывать количество посещений для этого URL-адреса.

Исходный URL хранится в PostVideos таблица для всех пользователей.

Я создал таблицу для хранения uniuqe keys за short urls внутри short_video_post_urls с колоннами

+----+---------------+------------+-------------+
| id | post_video_id | unique_key | visit_count |
+----+---------------+------------+-------------+

Поскольку число членов Pro будет меньше, чем у обычных пользователей, я не хочу создавать unique_key entry в short_video_post_urls потому что это затопит базу данных бесполезными записями.

Итак, я хочу генерировать их динамически и хранить их только для членов PRO

Сейчас в template файл, который я использую $postVideo->video_url отобразить оригинальную ссылку на видео с post_videos Таблица.

Вопрос

Что я хочу, это настроить video_url вызов объекта, который проверит

  • Уровень участия вошедшего в систему пользователя
  • Если член профессионал
    • проверить, существует ли уникальный ключ в ShortVideoPostUrls модель для запрошенного URL
    • Если записи не существует, создайте ключ unique_key в ShortVideoPostUrls
    • вернуть новый URL с unique_key

Но для этого мне нужен доступ logged_in пользовательские данные в классе сущности.

Что я пробовал?

class PostVideoLog extends Entity
{
    /*
     * ----
     * ----
    */

    protected function _getVideoUrl()
    {
        $user = $this->Users->get($this->Auth->user('id'), [
            'contain' => [
                'MembershipLevels'
            ]
        ]);

        if ($user) {
            if (strtolower($user->membership_level->title) === 'pro') {
                /**
                 * check if unique_key exists for this request
                 */
                $checkShortUrl = $this->ShortVideoPostUrls->find()
                    ->where(['post_video_log_id' => $this->_properties['id']])
                    ->first();

                if ($checkShortUrl) {
                    return $this->_generateUrl($checkShortUrl->unique_key);
                }

                /**
                 * create new record
                 */
                $unique_key_generator = new Hashids(UNIQUE_SHORT_URL_SALT, 4);
                $unique_key = $unique_key_generator->encode($this->_properties['id']);

                $newShortUrl = $this->ShortVideoPostUrls->newEntity();
                $newShortUrl = $this->ShortVideoPostUrls->patchEntity($newShortUrl, [
                    'unique_key' => $unique_key,
                    'post_video_log_id' => $this->_properties['id']
                ]);

                if ($this->ShortVideoPostUrls->save($newShortUrl)) {
                    return $this->_generateUrl($unique_key);
                }
            }
        }

        return $this->_properties['video_url'];
    }

    private function _generateUrl($unique_key)
    {
        $base_url = Router::url('/', true);

        return $base_url . '/u/' . $unique_key;
    }
}

Я не уверен, является ли мой подход правильным или неправильным.

Загрузить Users модель и другие модели, которые я использую в вышеупомянутой функции требует использования

$this->loadModel('Users');

Но, loadModel Кажется, не работает здесь.

Какой другой подход к этому? Или как загрузить внешнюю модель и компонент Auth в класс Entity?

Редактировать 2

Есть ли лучшая альтернатива делать то, что я хочу без сущности? или просто какой-то способ вызвать функцию из template на каждой сущности?

Ex.

$postVideo->video_url()

1 ответ

Для загрузки другой модели внутри сущности Вы можете использовать TableRegistry учебный класс

use Cake\ORM\TableRegistry;

class MyModel extends Entity {

    protected function _getVideoUrl() {

        $table = TableRegistry::get('Users');
        $users = $table->find('all')->toArray();
    }
}

Я думаю, что это не лучшая идея для использования Auth компонент в модели - я не знаю, как это сделать "правильно", но все данные сеанса (включая данные аутентификации) по-прежнему доступны в $_SESSION массив

Другие вопросы по тегам