12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 |
- <?php
- namespace League\Flysystem\Plugin;
- use BadMethodCallException;
- use League\Flysystem\FilesystemInterface;
- use League\Flysystem\PluginInterface;
- use LogicException;
- trait PluggableTrait
- {
- /**
- * @var array
- */
- protected $plugins = [];
- /**
- * Register a plugin.
- *
- * @param PluginInterface $plugin
- *
- * @throws LogicException
- *
- * @return $this
- */
- public function addPlugin(PluginInterface $plugin)
- {
- if ( ! method_exists($plugin, 'handle')) {
- throw new LogicException(get_class($plugin) . ' does not have a handle method.');
- }
- $this->plugins[$plugin->getMethod()] = $plugin;
- return $this;
- }
- /**
- * Find a specific plugin.
- *
- * @param string $method
- *
- * @throws PluginNotFoundException
- *
- * @return PluginInterface
- */
- protected function findPlugin($method)
- {
- if ( ! isset($this->plugins[$method])) {
- throw new PluginNotFoundException('Plugin not found for method: ' . $method);
- }
- return $this->plugins[$method];
- }
- /**
- * Invoke a plugin by method name.
- *
- * @param string $method
- * @param array $arguments
- * @param FilesystemInterface $filesystem
- *
- * @throws PluginNotFoundException
- *
- * @return mixed
- */
- protected function invokePlugin($method, array $arguments, FilesystemInterface $filesystem)
- {
- $plugin = $this->findPlugin($method);
- $plugin->setFilesystem($filesystem);
- $callback = [$plugin, 'handle'];
- return call_user_func_array($callback, $arguments);
- }
- /**
- * Plugins pass-through.
- *
- * @param string $method
- * @param array $arguments
- *
- * @throws BadMethodCallException
- *
- * @return mixed
- */
- public function __call($method, array $arguments)
- {
- try {
- return $this->invokePlugin($method, $arguments, $this);
- } catch (PluginNotFoundException $e) {
- throw new BadMethodCallException(
- 'Call to undefined method '
- . get_class($this)
- . '::' . $method
- );
- }
- }
- }
|