Jump to content
php.lv forumi

CI objektu glabāšana sessijā


entu

Recommended Posts

Sveiki. Ja tas ir iespējams, tad kā CI sesijā varētu saglabāt objektu ar visu instanci.

 

Piemēram:

 

$user = new $this->user;
$this->session->set_userdata("user", $user );

un tagad kādā citā lapā:

 

$user = $this->session->userdata("user");
$user->change_name("zirgs"); //šo te neļauj izpildīt

 

Bet protams $user objekts tika atsūtits kā parasts objekts un ir "__PHP_Incomplete_Class". Kā varētu atjaunot šim objektam instanci?

Edited by entu
Link to comment
Share on other sites

Nav problēmas iedabut to objektu sessijā, bet gan atjaunot objekta instanci ar klasi. Bet varbūt ir pavisam cits piegājiens, lai varētu tikt pie tā paša objekta citā kontrolleri vai arī tā paša robežās?

Edited by entu
Link to comment
Share on other sites

Ahā, skaidrs. Labs jautājums!

 

Pieliekot class Foo {} pirms unserialize() to itkā atrisina.

 

Jebkurā gadījumā... nesaprotu kāpēc nerādās objekta metodes, tikai "propertiji".

Link to comment
Share on other sites

Diezgan esmu izmeklējiesu un izlasījies, bet vēl neesmu atradis risinājumu. Viens variants bija, papriekšu ielādetēt modeli, pirms tiek palaista sessija, nezinu vai tas strādā bet man atkrīt, jo lietoju CI sessijas bibliotāku, kuru ielādējas autoloadā.

Link to comment
Share on other sites

Ir tāda sarežģītāka faila sūtīšanas paņēmiens, ko es tagad cenšos uzlabot ar objekta palīdzibu :). Ok, itkā lietu atrsināju manuāli atjaunojot objekta instanci, izveodjoto jaunu objektu un uz to padodot caur sesiju iegūtos propertijus.

Link to comment
Share on other sites

Ieliek modeli sesijā

$user = serialize($this->user);
$this->session->set_userdata("user", $user );

 

Izņem modeli no sesijas

$this->load->model("user_model"); //pirms klases instances unserializēšanas jābūt ielādētai klases definīcijai
$user = unserialize($this->session->userdata("user"));
$user->change_name("zirgs");

 

Teorētiski jāsdrādā

 

 

P.S. Pievērs uzmanību savai terminoloģijai: "atjaunot objekta instanci ar klasi"

Edited by 101111
Link to comment
Share on other sites

Visticamāk, ka bezjēdzīgi, bet es sameklēju identisku piemēru no savas prakses (un tas darbojas)

 


//ieliek
$this->load->model("user_model", "user");
$this->user->username = trim($_POST["username"]);
...
$_SESSION["user"] = serialize($this->user);


//izmanto
$this -> load -> model("user_model");
$user = unserialize($_SESSION["user"]);

 

te gan netiek izmantotas CI sesiju bibliotēkas iespējas, bet lietas būtību tas nemaina.

Link to comment
Share on other sites

Uzpīpēju, padomāju.

 

Ir divas atsevišķas lietas: klase un objekts.

 

Klase Sevī neko neglabā. Tā ir kā struktūra... tai skaitā tā satur metodes.

 

Serializējot objektu (nejaukt!) tiek saglabātas vērtības, kas objektam ir bijušas. Nevis struktūra.

 

Tieši tāpēc pirms atserializācijas (tas ir vārds!) vajag iekļaut klasi, no kuras ir "būvēts" attiecīgais objekts.

 

Labot Mani, ja pārprotu.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...