Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
"doctrine/inflector": "^1.4|^2.0",
"dragonmantank/cron-expression": "^3.0.2",
"egulias/email-validator": "^2.1.10",
"laravel/serializable-closure": "^1.0",
"league/commonmark": "^1.3|^2.0.2",
"league/flysystem": "^1.1",
"monolog/monolog": "^2.0",
Expand Down
7 changes: 2 additions & 5 deletions src/Illuminate/Bus/Batch.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
use Illuminate\Contracts\Queue\Factory as QueueFactory;
use Illuminate\Contracts\Support\Arrayable;
use Illuminate\Queue\CallQueuedClosure;
use Illuminate\Queue\SerializableClosure;
use Illuminate\Support\Arr;
use Illuminate\Support\Collection;
use JsonSerializable;
Expand Down Expand Up @@ -420,17 +419,15 @@ public function delete()
/**
* Invoke a batch callback handler.
*
* @param \Illuminate\Queue\SerializableClosure|callable $handler
* @param callable $handler
* @param \Illuminate\Bus\Batch $batch
* @param \Throwable|null $e
* @return void
*/
protected function invokeHandlerCallback($handler, Batch $batch, Throwable $e = null)
{
try {
return $handler instanceof SerializableClosure
? $handler->__invoke($batch, $e)
: call_user_func($handler, $batch, $e);
return $handler($batch, $e);
} catch (Throwable $e) {
if (function_exists('report')) {
report($e);
Expand Down
8 changes: 4 additions & 4 deletions src/Illuminate/Bus/PendingBatch.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
use Illuminate\Bus\Events\BatchDispatched;
use Illuminate\Contracts\Container\Container;
use Illuminate\Contracts\Events\Dispatcher as EventDispatcher;
use Illuminate\Queue\SerializableClosure;
use Illuminate\Queue\SerializableClosureFactory;
use Illuminate\Support\Arr;
use Illuminate\Support\Collection;
use Throwable;
Expand Down Expand Up @@ -78,7 +78,7 @@ public function add($jobs)
public function then($callback)
{
$this->options['then'][] = $callback instanceof Closure
? new SerializableClosure($callback)
? SerializableClosureFactory::make($callback)
: $callback;

return $this;
Expand All @@ -103,7 +103,7 @@ public function thenCallbacks()
public function catch($callback)
{
$this->options['catch'][] = $callback instanceof Closure
? new SerializableClosure($callback)
? SerializableClosureFactory::make($callback)
: $callback;

return $this;
Expand All @@ -128,7 +128,7 @@ public function catchCallbacks()
public function finally($callback)
{
$this->options['finally'][] = $callback instanceof Closure
? new SerializableClosure($callback)
? SerializableClosureFactory::make($callback)
: $callback;

return $this;
Expand Down
3 changes: 1 addition & 2 deletions src/Illuminate/Bus/Queueable.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@

use Closure;
use Illuminate\Queue\CallQueuedClosure;
use Illuminate\Queue\SerializableClosure;
use Illuminate\Support\Arr;
use RuntimeException;

Expand Down Expand Up @@ -245,7 +244,7 @@ public function dispatchNextJobInChain()
public function invokeChainCatchCallbacks($e)
{
collect($this->chainCatchCallbacks)->each(function ($callback) use ($e) {
$callback instanceof SerializableClosure ? $callback->__invoke($e) : call_user_func($callback, $e);
$callback($e);
});
}
}
24 changes: 23 additions & 1 deletion src/Illuminate/Encryption/EncryptionServiceProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,8 @@

use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Str;
use Opis\Closure\SerializableClosure;
use Laravel\SerializableClosure\SerializableClosure;
use Opis\Closure\SerializableClosure as OpisSerializableClosure;

class EncryptionServiceProvider extends ServiceProvider
{
Expand All @@ -17,6 +18,7 @@ public function register()
{
$this->registerEncrypter();
$this->registerOpisSecurityKey();
$this->registerSerializableClosureSecurityKey();
}

/**
Expand All @@ -37,8 +39,28 @@ protected function registerEncrypter()
* Configure Opis Closure signing for security.
*
* @return void
*
* @deprecated Will be removed in a future Laravel version.
*/
protected function registerOpisSecurityKey()
{
if (\PHP_VERSION_ID < 80100) {
$config = $this->app->make('config')->get('app');

if (! class_exists(OpisSerializableClosure::class) || empty($config['key'])) {
return;
}

OpisSerializableClosure::setSecretKey($this->parseKey($config));
}
}

/**
* Configure Serializable Closure signing for security.
*
* @return void
*/
protected function registerSerializableClosureSecurityKey()
{
$config = $this->app->make('config')->get('app');

Expand Down
4 changes: 2 additions & 2 deletions src/Illuminate/Events/InvokeQueuedClosure.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ class InvokeQueuedClosure
/**
* Handle the event.
*
* @param \Illuminate\Queue\SerializableClosure $closure
* @param \Laravel\SerializableClosure\SerializableClosure $closure
* @param array $arguments
* @return void
*/
Expand All @@ -19,7 +19,7 @@ public function handle($closure, array $arguments)
/**
* Handle a job failure.
*
* @param \Illuminate\Queue\SerializableClosure $closure
* @param \Laravel\SerializableClosure\SerializableClosure $closure
* @param array $arguments
* @param array $catchCallbacks
* @param \Throwable $exception
Expand Down
6 changes: 3 additions & 3 deletions src/Illuminate/Events/QueuedClosure.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
namespace Illuminate\Events;

use Closure;
use Illuminate\Queue\SerializableClosure;
use Illuminate\Queue\SerializableClosureFactory;

class QueuedClosure
{
Expand Down Expand Up @@ -114,10 +114,10 @@ public function resolve()
{
return function (...$arguments) {
dispatch(new CallQueuedListener(InvokeQueuedClosure::class, 'handle', [
'closure' => new SerializableClosure($this->closure),
'closure' => SerializableClosureFactory::make($this->closure),
'arguments' => $arguments,
'catch' => collect($this->catchCallbacks)->map(function ($callback) {
return new SerializableClosure($callback);
return SerializableClosureFactory::make($callback);
})->all(),
]))->onConnection($this->connection)->onQueue($this->queue)->delay($this->delay);
};
Expand Down
4 changes: 2 additions & 2 deletions src/Illuminate/Foundation/Bus/PendingChain.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
use Closure;
use Illuminate\Contracts\Bus\Dispatcher;
use Illuminate\Queue\CallQueuedClosure;
use Illuminate\Queue\SerializableClosure;
use Illuminate\Queue\SerializableClosureFactory;

class PendingChain
{
Expand Down Expand Up @@ -112,7 +112,7 @@ public function delay($delay)
public function catch($callback)
{
$this->catchCallbacks[] = $callback instanceof Closure
? new SerializableClosure($callback)
? SerializableClosureFactory::make($callback)
: $callback;

return $this;
Expand Down
12 changes: 6 additions & 6 deletions src/Illuminate/Queue/CallQueuedClosure.php
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ class CallQueuedClosure implements ShouldQueue
/**
* The serializable Closure instance.
*
* @var \Illuminate\Queue\SerializableClosure
* @var \Laravel\SerializableClosure\SerializableClosure
*/
public $closure;

Expand All @@ -38,10 +38,10 @@ class CallQueuedClosure implements ShouldQueue
/**
* Create a new job instance.
*
* @param \Illuminate\Queue\SerializableClosure $closure
* @param \Laravel\SerializableClosure\SerializableClosure $closure
* @return void
*/
public function __construct(SerializableClosure $closure)
public function __construct($closure)
{
$this->closure = $closure;
}
Expand All @@ -54,7 +54,7 @@ public function __construct(SerializableClosure $closure)
*/
public static function create(Closure $job)
{
return new self(new SerializableClosure($job));
return new self(SerializableClosureFactory::make($job));
}

/**
Expand All @@ -77,7 +77,7 @@ public function handle(Container $container)
public function onFailure($callback)
{
$this->failureCallbacks[] = $callback instanceof Closure
? new SerializableClosure($callback)
? SerializableClosureFactory::make($callback)
: $callback;

return $this;
Expand All @@ -92,7 +92,7 @@ public function onFailure($callback)
public function failed($e)
{
foreach ($this->failureCallbacks as $callback) {
call_user_func($callback instanceof SerializableClosure ? $callback->getClosure() : $callback, $e);
$callback($e);
}
}

Expand Down
29 changes: 29 additions & 0 deletions src/Illuminate/Queue/QueueServiceProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -17,23 +17,52 @@
use Illuminate\Queue\Failed\NullFailedJobProvider;
use Illuminate\Support\Arr;
use Illuminate\Support\ServiceProvider;
use Laravel\SerializableClosure\SerializableClosure;

class QueueServiceProvider extends ServiceProvider implements DeferrableProvider
{
use SerializesAndRestoresModelIdentifiers;

/**
* Register the service provider.
*
* @return void
*/
public function register()
{
$this->configureSerializableClosureUses();

$this->registerManager();
$this->registerConnection();
$this->registerWorker();
$this->registerListener();
$this->registerFailedJobServices();
}

/**
* Configure serializable closures uses.
*
* @return void
*/
protected function configureSerializableClosureUses()
{
SerializableClosure::transformUseVariablesUsing(function ($data) {
foreach ($data as $key => $value) {
$data[$key] = $this->getSerializedPropertyValue($value);
}

return $data;
});

SerializableClosure::resolveUseVariablesUsing(function ($data) {
foreach ($data as $key => $value) {
$data[$key] = $this->getRestoredPropertyValue($value);
}

return $data;
});
}

/**
* Register the queue manager.
*
Expand Down
3 changes: 3 additions & 0 deletions src/Illuminate/Queue/SerializableClosure.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,9 @@

use Opis\Closure\SerializableClosure as OpisSerializableClosure;

/**
* @deprecated It will be removed in Laravel 9.
*/
class SerializableClosure extends OpisSerializableClosure
{
use SerializesAndRestoresModelIdentifiers;
Expand Down
25 changes: 25 additions & 0 deletions src/Illuminate/Queue/SerializableClosureFactory.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
<?php

namespace Illuminate\Queue;

use Closure;
use Laravel\SerializableClosure\SerializableClosure;
use Opis\Closure\SerializableClosure as OpisSerializableClosure;

class SerializableClosureFactory
{
/**
* Creates a new serializable closure from the given closure.
*
* @param \Closure $closure
* @return \Laravel\SerializableClosure\SerializableClosure
*/
public static function make($closure)
{
if (\PHP_VERSION_ID < 70400) {
return new OpisSerializableClosure($closure);
}

return new SerializableClosure($closure);
}
}
1 change: 1 addition & 0 deletions src/Illuminate/Queue/composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
"illuminate/filesystem": "^8.0",
"illuminate/pipeline": "^8.0",
"illuminate/support": "^8.0",
"laravel/serializable-closure": "^1.0",
"opis/closure": "^3.6",
"ramsey/uuid": "^4.0",
"symfony/process": "^5.1.4"
Expand Down
20 changes: 14 additions & 6 deletions src/Illuminate/Routing/Route.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,9 @@
use Illuminate\Support\Arr;
use Illuminate\Support\Str;
use Illuminate\Support\Traits\Macroable;
use Laravel\SerializableClosure\SerializableClosure;
use LogicException;
use Opis\Closure\SerializableClosure;
use Opis\Closure\SerializableClosure as OpisSerializableClosure;
use ReflectionFunction;
use Symfony\Component\Routing\Route as SymfonyRoute;

Expand Down Expand Up @@ -975,9 +976,10 @@ public function getMissing()
$missing = $this->action['missing'] ?? null;

return is_string($missing) &&
Str::startsWith($missing, 'C:32:"Opis\\Closure\\SerializableClosure')
? unserialize($missing)
: $missing;
Str::startsWith($missing, [
'C:32:"Opis\\Closure\\SerializableClosure',
'O:47:"Laravel\\SerializableClosure\\SerializableClosure',
]) ? unserialize($missing) : $missing;
}

/**
Expand Down Expand Up @@ -1226,11 +1228,17 @@ public function setContainer(Container $container)
public function prepareForSerialization()
{
if ($this->action['uses'] instanceof Closure) {
$this->action['uses'] = serialize(new SerializableClosure($this->action['uses']));
$this->action['uses'] = serialize(\PHP_VERSION_ID < 70400
? new OpisSerializableClosure($this->action['uses'])
: new SerializableClosure($this->action['uses'])
);
}

if (isset($this->action['missing']) && $this->action['missing'] instanceof Closure) {
$this->action['missing'] = serialize(new SerializableClosure($this->action['missing']));
$this->action['missing'] = serialize(\PHP_VERSION_ID < 70400
? new OpisSerializableClosure($this->action['missing'])
: new SerializableClosure($this->action['missing'])
);
}

$this->compileRoute();
Expand Down
Loading