Доступ к классу модели внутри класса сущности другой модели
Я использую 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
массив