访问其他模型的实体类内的模型类

时间:2017-11-07 06:50:06

标签: cakephp cakephp-3.4 cakephp-model

我正在使用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
    • 使用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()

1 个答案:

答案 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数组