2014-09-02 5 views
2

В моей текущей конфигурации электронное письмо пользователя хранится на удаленном сервере, который мне нужен, чтобы получить с помощью curl quest.Как кэшировать атрибуты модели в Laravel

К счастью, мне нужен адрес электронной почты один раз в день, когда выполняется определенный процесс. Однако, когда этот процесс выполняется, ему нужно будет указывать адрес электронной почты несколько раз.

Это текущий аксессуар, который я установил для email. Проблема заключается в том, что запрос curl вызывается каждый раз, когда я использую $user->email. Каков наилучший способ избежать этого?

в UserModel:

public function getEmailAttribute(){ 
    $curl = new Curl; 
    $responseJson = $curl->post('https://www.dailycred.com/admin/api/user.json',array(
     'client_id'=>getenv('dailycredId') 
     ,'client_secret'=>getenv('dailycredSecret') 
     ,'user_id'=>$this->id 
    )); 
    $response = json_decode($responseJson); 
    return $response->email; 
} 
+0

Этот процесс выполняется в одном запросе (выполняется) или по нескольким запросам? то есть вам нужно сохранить значение электронной почты только для продолжительности одиночного запроса или вы хотите сохранить постоянство, как кеш? –

+0

@VeljaMatic один процесс. Мне не нужно упорствовать. Возможно, «кеш» было неправильным словом. –

ответ

2
private $cached_email = false; 

public function getEmailAttribute(){ 
    if ($this->cached_email){ 
    // if set return cached value 
    return $this->cached_email; 
    } 
    // get the email 
    $curl = new Curl; 
    $responseJson = $curl->post('https://www.dailycred.com/admin/api/user.json',array(
    'client_id'=>getenv('dailycredId') 
    ,'client_secret'=>getenv('dailycredSecret') 
    ,'user_id'=>$this->id 
)); 
    $response = json_decode($responseJson); 
    // cache the value 
    $this->cached_email = $response->email; 
    // and return 
    return $this->cached_email; 
} 

В зависимости от вашего случая использования внести коррективы (т.е. сеанса, кэш, статическое свойство ....).

+1

Я предполагаю, что это единственный способ сделать это, я предположил, что для этого будет какая-то стандартная реализация. –

+0

Можем ли мы улучшить этот код, добавив обратный вызов после вызова api? – olleh

Смежные вопросы