Codeigniter, где запустить модель сохранения кода, если не в деструкторе? - PullRequest
1 голос
/ 08 августа 2011

У меня есть модель, которая работает с одним пользователем в базе данных.
Он предназначен для внесения множества небольших изменений в пользователя, поэтому вместо многократного запроса к базе данных я решил получить всю информацию о пользователе в конструкторе модели, а затем поработать с этой информацией через оставшуюся часть модель (поэтому вместо обновления базы данных, это будет обновление массива, который я получил). Тогда я бы просто сохранил этот массив обратно в базу данных в деструкторе.

Это отлично работает, но я читал немного больше, и оказалось, что вы не должны запускать какой-либо неочищенный код в деструкторе (именно здесь я выполняю запрос на обновление базы данных). Так что мне было любопытно, есть ли лучший способ сделать это? Мне не хватает лучшего решения?

Спасибо, Макс

EDIT: Вот пример того, что я делаю (Примечание: это пример класса корзины покупок, а не класса пользователя):

<?php
class cartmodel extends CI_Model
{
    private $sessionPrefix = 'Cart_';
    private $CartCache = array();


    function __construct ()
    {
        if ($this->session->userdata($this->sessionPrefix.'data') === FALSE)
            $this->session->set_userdata($this->sessionPrefix.'data', array());

        $this->CartCache = $this->session->userdata($this->sessionPrefix.'data');

        parent::__construct();
    }
    function __destruct ()
    {
        $this->session->set_userdata($this->sessionPrefix.'data', $this->CartCache);
    }   

    function AddItem ($id, $count)
    {
        if ($count == 0 || $count == '' || !is_numeric($count))
            return;

        if (!isset($this->CartCache[$id]))
            $this->CartCache[$id] = 0; //Initialize it so that += works

        $this->CartCache[$id] += (int)$count;
    }
?>

1 Ответ

1 голос
/ 30 августа 2011

Вы можете напрямую манипулировать данными сеанса в вашем методе AddItem (). Примерно так:

function AddItem ($id, $count)
    {
        // UPDATE CartCache VARIABLE
        $this->CartCache = $this->session->userdata($this->sessionPrefix.'data');

        // YOUR CODE BELOW
        if ($count == 0 || $count == '' || !is_numeric($count))
            return;

        if (!isset($this->CartCache[$id]))
            $this->CartCache[$id] = 0; //Initialize it so that += works

        $this->CartCache[$id] += (int)$count;

        // SAVE CartCache IN SESSION AGAIN
        $this->session->set_userdata($this->sessionPrefix.'data', $this->CartCache);
    }

Таким образом, если вы хотите манипулировать сессионной переменной Cart_data другими методами, вы все равно можете это сделать. Просто обновите массив CartCache в каждом методе и снова сохраните его в переменной сеанса, как только вы закончите манипулировать данными в нем.

...