Väčšinu mojej kariéry v PHP som neukladal objekty v relácii. Nie že by to bola ťažká vec, jednoducho som to v minulosti nepotreboval. Teraz, keď to robím, objavil som v tom zvláštny (podľa mňa) aspekt.
Stalo sa to preto, že údaje o relácii v určitej oblasti príslušnej lokality by niekedy narástli príliš veľké pre pole databázy, do ktorého som ich ukladal. PHP serializuje objekty (aby ich reprezentoval ako reťazec) pred ich uložením do relácie, ale keď nie je schopný uložiť celý reťazec (čo sa stalo mne), skončíte s poškodenými dátami, ktoré PHP nedokáže odserializovať späť do objektovej formy. Keď som si uvedomil, že toto je zdroj mojich problémov, potreboval som dobré riešenie.
Našťastie som nemusel ukladať každý kúsok objektu, pretože tieto objekty mali množstvo chránených vlastností, ktoré som nemusel zotrvávať v mojich reláciách. Takže riešenie bolo jednoduché, implementujte Serializovateľné rozhranie PHP zásoby. Pomocou tohto rozhrania môžete definovať výsledok volania serializovať () (a unserialize()) na objekte. Presne toto som chcel; Teraz som si mohol vybrať len časti údajov, ktoré som chcel uložiť, a mohol som výrazne zmenšiť veľkosť údajov o mojej relácii.
Ale nefungovalo to! Bola to záhada. Testoval som to serializáciou inštancie jedného z týchto objektov a dostal by som očakávaný výsledok. Keď som to testoval na stránke, moja relácia sa naplnila serializovanými verziami obsahujúcimi celú sadu vlastností ako predtým. Skúšal som dokonca použiť magické metódy __sleep() a __wakeup(), ale nič nefungovalo. prečo? Prečo???
Nakoniec som odhalil tajomstvo. Teraz si nepamätám, kde som to čítal alebo ako som sa k tomu dostal, ale teraz sa s vami o toto tajomstvo delím. Keď PHP serializuje objekty pre relácie, robí to trochu iným spôsobom. To znamená, že je jedno, či ste vo svojich triedach implementovali Serializable alebo definovali __sleep(). Ak dáte PHP objekt na vloženie do relácie, serializuje ho, ale použije „trochu odlišnú“ metódu.
!!
prečo? Neviem. Môže existovať veľmi opodstatnený dôvod, prečo to tak musí byť, a to je v poriadku. Možno to bolo v určitom okamihu všeobecne známe, ale pre mňa to bolo trochu frustrujúce. Ale poučenie sa naučilo:
Serializujte svoje objekty pred ich uložením do relácie
To je riešenie. Nedávajte relácii objekt, dajte jej serializovanú verziu objektu a všetko bude v poriadku.
Začnite s hostingovým riešením Magento 2, ktoré vám dáva slobodu vytvárať.