Сохранение объекта в сеансе. Как извлечь объект из сеанса, как это было раньше? - PullRequest
0 голосов
/ 11 декабря 2018

Я сохраняю класс клиента с некоторыми переменными и методами в сеансе.

Как мне заставить все его методы работать при извлечении его из сеанса?(Как точный оригинал, если это возможно)

Это то, что я сделал до сих пор:

<?php
namespace MyApp\Models;
use MyApp\Core\Database;
use MyApp\Helpers\Session;
use MyApp\Core\Config;

class Customer {

    private $db;

    public $host;

    public $dbName; 

    public $type;


    public function __construct($customerName = NULL)
    {
        # Get database instance
        $this->db = Database::getInstance();

        # If customer name passed as a variable 
        if ( $customerName ) {

            # Get Customer data from db
            $data = $this->customerDataByName($customerName);

            if ($data) {
                # Set data to $this Obj
                $this->setCustomerData($data['db_host'], $data['db_name'], $data['system_type']);
                # Set $this Obj to Session
                $this->setCustomerToSession();
            } else {
                return false; 
            }
        } 
    }


    public function setCustomerData($host, $dbName, $type)
    {
        # Set customer host in object
        $this->host     = $host;
        # Set customer name in object
        $this->dbName   = $dbName;
        # Set customer type in object
        $this->type     = $type;
    }


    public function setCustomerToSession()
    {
        Session::put(Config::$customer, $this); 
    }


    public function customerDataByName($customer_name) 
    {
        return $this->db->row("SELECT `db_name`, `db_host`, `system_type` FROM customers WHERE customer_name = :customer_name", array('customer_name' => $customer_name));
    }



    public function __sleep()
    {
        return array('host', 'dbName', 'type', 'customerDataByName()', 'setCustomerData()' );
    }

    public function __wakeup()
    {
        $this->db = Database::getInstance();
    }

}

"host", "dbName" и "type" восстанавливаются правильно, используя__sleep() метод, я попытался добавить функции несколькими различными способами, но не повезло ... Я бы хотел, чтобы он также мог подключаться к базе данных.

А также попытался использовать другой метод:

public function setCustomerToSession()
{
    $serialized = serialize($this);
    Session::put(Config::$customer, $serialized); 
}

Без __wakup и __sleep, Затем попытался:

$a = unserialize($_SESSION['customer']);
var_dump($a);

и получил эту ошибку:

Неустранимая ошибка PHP: Uncaught PDOException: Вы не можете сериализовать или десериализовать экземпляры PDO в ...

Указывая на строку $serialized = serialize($this);

1 Ответ

0 голосов
/ 11 декабря 2018

Вы должны использовать функцию serialize(), чтобы вернуть строку, содержащую представление значения в байтовом потоке. В обратном порядке вы можете использовать unserialize().Потому что вы не можете сохранить объект в PHP SESSION.

Код должен быть,

session_start();

$a = your_object;
$b = serialize($a);

$_SESSION["serialized_data"] = $b; 
# To store in Session

$unserialized_data = unserialize($_SESSION["serialized_data"]); 
# To get from Session as Object
...