我正在使用CakePHP 3.4 +
我用multi level membership
编写了一个应用程序。
Pro
成员可以查看外部链接的短网址,共享时会将访问次数记录到该网址。
原始网址存储在所有用户的PostVideos
表格中。
我创建了一个表,用于存储uniuqe keys
short urls
short_video_post_urls
内的{<1}}列
+----+---------------+------------+-------------+
| 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
模型中是否存在所请求网址的唯一密钥ShortVideoPostUrls
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
似乎没有在这里工作。
这样做的其他方法是什么?或者如何在Entity类中加载外部模型和Auth组件?
编辑2
在没有实体的情况下,还有更好的选择吗?或者只是某种方式从template
调用每个实体的功能?
实施例
$postVideo->video_url()
答案 0 :(得分:0)
在实体中加载其他模型您可以使用TableRegistry
类
use Cake\ORM\TableRegistry;
class MyModel extends Entity {
protected function _getVideoUrl() {
$table = TableRegistry::get('Users');
$users = $table->find('all')->toArray();
}
}
我认为在模型中使用Auth
组件不是最好的主意 - 我不知道如何做到这一点&#34;正确&#34;,但所有会话数据(包括auth数据)仍然可用于$_SESSION
数组