2017 © Pedro PelΓ‘ez
 

library callback-container

Analysis and serialization of callbacks and closures

image

movephp/callback-container

Analysis and serialization of callbacks and closures

  • Thursday, November 30, 2017
  • by Alexey Sinkevich
  • Repository
  • 1 Watchers
  • 0 Stars
  • 3 Installations
  • PHP
  • 0 Dependents
  • 0 Suggesters
  • 0 Forks
  • 0 Open issues
  • 6 Versions
  • 0 % Grown

The README.md

Build Status Coverage Status, (*1)

Callback-ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€

Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° прСдставляСт собой нСбольшой класс-ΠΎΠ±Ρ‘Ρ€Ρ‚ΠΊΡƒ Π½Π°Π΄ встроСнным Π² PHP Ρ‚ΠΈΠΏΠΎΠΌ callable., (*2)

Главная ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒ этого ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° - ΠΎΠ½ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ интСрфСйс Serializable. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π½Π΅ всякий callable ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ сСриализован, ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ прСдоставляСт ΠΌΠ΅Ρ‚ΠΎΠ΄ isSerializable() для ΡƒΠ΄ΠΎΠ±Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ возмоТности сСриализации., (*3)

ОглавлСниС

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования

Π Π°Π±ΠΎΡ‡ΠΈΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° создаётся Ρ‡Π΅Ρ€Π΅Π· Ρ„Π°Π±Ρ€ΠΈΡ‡Π½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ make():, (*4)

use \Movephp\CallbackContainer\Container;
$factory = new Container();
$callback = $factory->make('my_callback');

ПослС Ρ‡Π΅Π³ΠΎ Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΅Ρ€ΠΈΠ°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ:, (*5)

if($callback->isSerializable()){
    var_dump(serialize($callback));
}

Или ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅:, (*6)

call_user_func($callback->closure());

ΠŸΠΎΠΏΡ‹Ρ‚ΠΊΠ° ΡΠ΅Ρ€ΠΈΠ°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ с нСсСриализуСмым ΠΊΠ°Π»Π±Π΅ΠΊΠΎΠΌ Π²Ρ‹Π·ΠΎΠ²Π΅Ρ‚ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ \Movephp\CallbackContainer\Exception\NonSerializableException, (*7)

Π’Π°ΠΆΠ½ΠΎ: ΠŸΡ€ΠΈ сСриализации CallbackContainer'Π° с ΠΊΠ°Π»Π±Π΅ΠΊΠΎΠΌ Π½Π° основС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° [$object, 'method'] сохраняСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ имя класса ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. Π‘ ΠΎΠ΄Π½ΠΎΠΉ стороны, Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΡΠ½ΠΈΠΆΠ°ΡŽΡ‚ΡΡ Π·Π°Ρ‚Ρ€Π°Ρ‚Ρ‹ Π½Π° процСсс сСриализации/дСсСриализации ΠΈ ΠΈΡΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹, связанныС с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ сам ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹ΠΉ $object ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ нСсСриализуСмым. Π‘ Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, Π²Π°ΠΆΠ½ΠΎ ΠΏΠΎΠ·Π°Π±ΠΎΡ‚ΠΈΡ‚ΡŒΡΡ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ послС дСсСриализации этот $object ΠΌΠΎΠ³ Π±Ρ‹Ρ‚ΡŒ автоматичСски восстановлСн ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ Π΅Π³ΠΎ класса (это Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Ссли Ρƒ Π½Π΅Π³ΠΎ конструктор Π±Π΅Π· Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΈΠ»ΠΈ с использованиСм PSR-ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°, см. Π΄Π°Π»Π΅Π΅)., (*8)

ДопустимыС callback Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹

Π’ Ρ‚Π°Π±Π»ΠΈΡ†Π΅ пСрСчислСны Ρ‚ΠΈΠΏΡ‹ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ make() Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°:, (*9)

Π’ΠΈΠΏ ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ
Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½Ρ‹ΠΉ callable ΠžΠ±ΡŠΠ΅ΠΊΡ‚ Closure (Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ сСриализован), строка с ΠΈΠΌΠ΅Π½Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠ»ΠΈ массив Π²ΠΈΠ΄Π° [$objectOrClassName, $methodName].
Π£ΡΡ‚Π°Ρ€Π΅Π²ΡˆΠ°Ρ Ρ„ΠΎΡ€ΠΌΠ° callable: [$className, $nonStaticMethodName] НСсмотря Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ такая Ρ„ΠΎΡ€ΠΌΠ° считаСтся ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠ΅ΠΉ, Π΄Π°Π½Π½Ρ‹ΠΉ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π΅Ρ‘ ΠΏΡ€ΠΈ условии, Ρ‡Ρ‚ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ класса ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ создан Π±Π΅Π· Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² для конструктора ΠΈΠ»ΠΈ Ρ‡Π΅Ρ€Π΅Π· PSR-ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€.
Массив Π²ΠΈΠ΄Π° [$psrContainerKey, $methodName] Допустуно ΠΏΡ€ΠΈ использовании Π΄Π°Π½Π½ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ с PSR-ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠΌ (см. Π½ΠΈΠΆΠ΅).

ИспользованиС с PSR-ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠΌ

Если Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ DI-ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€, Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰ΠΈΠΉ интСрфСйс PSR-11, Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° Π² ΠΌΠ΅Ρ‚ΠΎΠ΄ make() ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ массив, ΠΏΠΎΡ…ΠΎΠΆΠΈΠΉ Π½Π° ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ callable, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ элСмСмСнтом Π±ΡƒΠ΄Π΅Ρ‚ ΠΊΠ»ΡŽΡ‡, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΡ€ΠΎΡΠΈΡ‚ΡŒ Π½ΡƒΠΆΠ½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π² PSR-ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅., (*10)

Π’ ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΡ€ΠΈΠ²ΡΠ·Π°Ρ‚ΡŒ PSR-ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ ΠΊ Π΄Π°Π½Π½ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅:, (*11)

use \Movephp\CallbackContainer\Container;
$factory = new Container($psrContiner);
$callback = $factory->make(['psr_container_key', 'method']);

ΠšΠ»ΡŽΡ‡ΠΎΠΌ для PSR-ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, имя интСрфСйса, ΠΈΠ»ΠΈ любая строка, для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ $psrContiner->has($key) Π²Π΅Ρ€Π½Ρ‘Ρ‚ TRUE., (*12)

ΠŸΡ€ΠΈΠ²ΡΠ·ΠΊΠ° PSR-ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° послС дСсСриализации

ΠŸΡ€ΠΈ сСриализации CallbackContainer'Π° сохраняСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΡƒΠΏΡ€ΠΎΡ‰Ρ‘Π½Π½ΠΎΠ΅ прСдставлСниС исходного ΠΊΠ°Π»Π±Π΅ΠΊΠ°. БоотвСтствСнно, Ссли ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ Π±Ρ‹Π» использован PSR-ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€, Ρ‚ΠΎ послС дСсСриализации Π΅Π³ΠΎ Π½ΡƒΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ ΠΏΡ€ΠΈΠ²ΡΠ·Π°Ρ‚ΡŒ ΠΊ CallbackContainer'Ρƒ., (*13)

Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ дСсСризованного CallbackContainer'Π°:, (*14)

$callback = unserialize($serialized);
$callback->setPsrContainer($psrContiner);

Или ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π΄Π°Ρ‚ΡŒ PSR-ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ глобально для всСх Π±ΡƒΠ΄ΡƒΡ‰ΠΈΡ… CallbackContainer'ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ созданы Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ (new Container()) ΠΈΠ»ΠΈ ΠΏΡ€ΠΈ дСсСриализации, Π²Ρ‹Π·Π²Π°Π² ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΠ΅Ρ‚Π»ΡŒΠ½ΠΎ статичСский ΠΌΠ΅Ρ‚ΠΎΠ΄ setPsrContainerGlobal():, (*15)

use \Movephp\CallbackContainer\Container;
Container::setPsrContainerGlobal($psrContiner);
$callback = unserialize($serialized);

Анализ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΊΠ°Π»Π±Π΅ΠΊΠ°

ΠšΡ€ΠΎΠΌΠ΅ ΠΏΡ€ΠΎΡ‡Π΅Π³ΠΎ CallbackContainer ΠΈΠΌΠ΅Π΅Ρ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ parameters(), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ массив ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² класса Movephp\CallbackContainer\Parameter, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΡ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹, ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅ΠΌΡ‹Π΅ Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌ ΠΊΠ°Π»Π±Π΅ΠΊΠΎΠΌ. ΠšΠ»ΡŽΡ‡Π°ΠΌΠΈ этого массива ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΈΠΌΠ΅Π½Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ²., (*16)

ΠœΠ΅Ρ‚ΠΎΠ΄ parameters() Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Ρ‡Π΅Ρ€Π΅Π· Reflection API ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠΌ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠΈ ΠΈ Π·Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅Ρ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΏΡ€ΠΈ сСриализации, Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ увСличивая ΠΎΠ±Ρ‰ΡƒΡŽ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΡ€ΠΈ ΠΈΠ·Π²Π»Π΅Ρ‡Π΅Π½ΠΈΠΈ массива CallbackContainer'ΠΎΠ² ΠΈΠ· кСша., (*17)

Класс Movephp\CallbackContainer\Parameter ΠΈΠΌΠ΅Π΅Ρ‚ нСсколько Π³Π΅Ρ‚Ρ‚Π΅Ρ€ΠΎΠ² для получСния ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π΅:, (*18)

ΠœΠ΅Ρ‚ΠΎΠ΄ Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅
name(): string Имя ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°
hasType(): bool true, Ссли для ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½ Ρ‚ΠΈΠΏ
type(): string Π‘Ρ‚Ρ€ΠΎΠΊΠΎΠ²ΠΎΠ΅ ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° ('int', 'string' ΠΈ Ρ‚.Π΄.)
isVariadic(): bool true, Ссли это ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ с ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ количСством Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ²
isOptional(): bool true, Ссли ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ являСтся Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ
getDefault(): mixed Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ-ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ для ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°, ΠΈΠ»ΠΈ null, Ссли Π΅Π³ΠΎ Π½Π΅Ρ‚

НСсСриализуСмыС ΠΊΠ°Π»Π±Π΅ΠΊΠΈ

Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ сСриализации CallbackContainer'Π°, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, для ΠΊΠ΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ с Ρ†Π΅Π»ΡŒΡŽ ΠΏΠΎΠ²Ρ‹ΡΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ прилоТСния, слСдуСт Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ сСриализации ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ элСмСнта Ρ‡Π΅Ρ€Π΅Π· isSerializable(), Π½ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ Π² Ρ†Π΅Π»ΠΎΠΌ ΠΈΠΌΠ΅Ρ‚ΡŒ Π²Π²ΠΈΠ΄Ρƒ, ΠΊΠ°ΠΊΠΈΠ΅ Π²ΠΈΠ΄Ρ‹ ΠΊΠ°Π»Π±Π΅ΠΊΠΎΠ² Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ сСриализованы. Π­Ρ‚ΠΎ:, (*19)

  • Замыкания, Ρ‚.Π΅. ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ встроСнного класса \Closure, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ ΠΏΡƒΡ‚Ρ‘ΠΌ объявлСния Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ.
  • Π›ΡŽΠ±Ρ‹Π΅ callable, связанныС с Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹ΠΌΠΈ классами, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρ‚Π°ΠΊΠΈΠ΅ классы Π½Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ постоянного ΠΈΠΌΠ΅Π½ΠΈ ΠΈ ΠΈΡ… Π±ΡƒΠ΄Π΅Ρ‚ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΎΡΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ послС дСсСриализации.

ΠŸΡ€Π°ΠΊΡ‚ΠΈΡ‡Π΅ΡΠΊΠΎΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅, ΠΏΡ€ΠΈΠΌΠ΅Ρ€

Допустим, сущСствуСт Π½Π΅ΠΊΠΈΠΉ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ Ρ€ΠΎΡƒΡ‚ΠΈΠ½Π³Π° для прилоТСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ связываСт ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΎΠ² с ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ классов, ΠΈ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ достаточно слоТно устроСн, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΈΠΌΠ΅Π΅Ρ‚ смысл ΠΏΠΎΡΡ‚Π°Ρ€Π°Ρ‚ΡŒΡΡ Π·Π°ΠΊΠ΅ΡˆΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ. Π’ΠΎΡ‚ условный ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΊΠ°ΠΊ это ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ΠΎ:, (*20)

use Movephp\CallbackContainer\Container;

Container::setPsrContainerGlobal($psrContainer);

if ($cache->isHit()) {
    $routes = $cache->get();
} else {
    $callbackFactory = new Container();

    $rules = getRoutingRulesOverWholeProject(); // Π‘ΠΎΠ±ΠΈΡ€Π°Π΅ΠΌ ΠΏΠΎ всСму ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρƒ ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹ Ρ€ΠΎΡƒΡ‚ΠΎΠ² ΠΈ связанныС с Π½ΠΈΠΌΠΈ ΠΊΠ°Π»Π±Π΅ΠΊΠΈ
    $routes = [];
    foreach ($rules as $rule) {
        try {
            $callback = $callbackFactory->make($rule->callback);
        } catch (\Exception $e) {
            $logger->error($e);
            continue;
        }
        $routes[] = [
            'template' => $rule->template,
            'callback' => $callback
        ];
    }

    // ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅ΠΌ, Ρ‡Ρ‚ΠΎ всС ΠΊΠ°Π»Π±Π΅ΠΊΠΈ сСриализуСмыС
    $serializable = array_reduce(
        $routes,
        function ($result, $route) {
            return $result && $route['callback']->isSerializable();
        },
        true
    );
    if ($serializable) {
        // ΠšΠ΅ΡˆΠΈΡ€ΡƒΠ΅ΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚
        $cache->set($routes);
        $cachePool->save($cache);
    }
}

The Versions

30/11 2017

dev-master

9999999-dev

Analysis and serialization of callbacks and closures

  Sources   Download

Apache-2.0

The Requires

 

The Development Requires

30/11 2017

v2.0.0

2.0.0.0

Analysis and serialization of callbacks and closures

  Sources   Download

Apache-2.0

The Requires

 

The Development Requires

30/11 2017

dev-develop

dev-develop

Analysis and serialization of callbacks and closures

  Sources   Download

Apache-2.0

The Requires

 

The Development Requires

26/11 2017

v1.0.2

1.0.2.0

Analysis and serialization of callbacks and closures

  Sources   Download

Apache-2.0

The Requires

 

The Development Requires

26/11 2017

v1.0.1

1.0.1.0

Analysis and serialization of callbacks and closures

  Sources   Download

Apache-2.0

The Requires

 

The Development Requires

26/11 2017

v1.0.0

1.0.0.0

Analysis and serialization of callbacks and closures

  Sources   Download

Apache-2.0

The Requires

 

The Development Requires