Proyectos de Subversion Moodle

Rev

Rev 1 | | Comparar con el anterior | Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
1 efrain 1
<?php
2
 
3
namespace Laravel\SerializableClosure;
4
 
5
use Closure;
6
use Laravel\SerializableClosure\Exceptions\InvalidSignatureException;
7
use Laravel\SerializableClosure\Serializers\Signed;
8
use Laravel\SerializableClosure\Signers\Hmac;
9
 
10
class SerializableClosure
11
{
12
    /**
13
     * The closure's serializable.
14
     *
15
     * @var \Laravel\SerializableClosure\Contracts\Serializable
16
     */
17
    protected $serializable;
18
 
19
    /**
20
     * Creates a new serializable closure instance.
21
     *
22
     * @param  \Closure  $closure
23
     * @return void
24
     */
25
    public function __construct(Closure $closure)
26
    {
27
        $this->serializable = Serializers\Signed::$signer
28
            ? new Serializers\Signed($closure)
29
            : new Serializers\Native($closure);
30
    }
31
 
32
    /**
33
     * Resolve the closure with the given arguments.
34
     *
35
     * @return mixed
36
     */
37
    public function __invoke()
38
    {
39
        return call_user_func_array($this->serializable, func_get_args());
40
    }
41
 
42
    /**
43
     * Gets the closure.
44
     *
45
     * @return \Closure
46
     */
47
    public function getClosure()
48
    {
49
        return $this->serializable->getClosure();
50
    }
51
 
52
    /**
53
     * Create a new unsigned serializable closure instance.
54
     *
55
     * @param  Closure  $closure
56
     * @return \Laravel\SerializableClosure\UnsignedSerializableClosure
57
     */
58
    public static function unsigned(Closure $closure)
59
    {
60
        return new UnsignedSerializableClosure($closure);
61
    }
62
 
63
    /**
64
     * Sets the serializable closure secret key.
65
     *
66
     * @param  string|null  $secret
67
     * @return void
68
     */
69
    public static function setSecretKey($secret)
70
    {
71
        Serializers\Signed::$signer = $secret
72
            ? new Hmac($secret)
73
            : null;
74
    }
75
 
76
    /**
77
     * Sets the serializable closure secret key.
78
     *
79
     * @param  \Closure|null  $transformer
80
     * @return void
81
     */
82
    public static function transformUseVariablesUsing($transformer)
83
    {
84
        Serializers\Native::$transformUseVariables = $transformer;
85
    }
86
 
87
    /**
88
     * Sets the serializable closure secret key.
89
     *
90
     * @param  \Closure|null  $resolver
91
     * @return void
92
     */
93
    public static function resolveUseVariablesUsing($resolver)
94
    {
95
        Serializers\Native::$resolveUseVariables = $resolver;
96
    }
97
 
98
    /**
99
     * Get the serializable representation of the closure.
100
     *
1441 ariadna 101
     * @return array{serializable: \Laravel\SerializableClosure\Serializers\Signed|\Laravel\SerializableClosure\Contracts\Serializable}
1 efrain 102
     */
103
    public function __serialize()
104
    {
105
        return [
106
            'serializable' => $this->serializable,
107
        ];
108
    }
109
 
110
    /**
111
     * Restore the closure after serialization.
112
     *
1441 ariadna 113
     * @param  array{serializable: \Laravel\SerializableClosure\Serializers\Signed|\Laravel\SerializableClosure\Contracts\Serializable}  $data
1 efrain 114
     * @return void
115
     *
116
     * @throws \Laravel\SerializableClosure\Exceptions\InvalidSignatureException
117
     */
118
    public function __unserialize($data)
119
    {
120
        if (Signed::$signer && ! $data['serializable'] instanceof Signed) {
121
            throw new InvalidSignatureException();
122
        }
123
 
124
        $this->serializable = $data['serializable'];
125
    }
126
}