Рубрики
Uncategorized

PHP-конвейер для создания примера кода промежуточного программного обеспечения

Автор оригинала: David Wong.

Схема проектирования трубопровода

Водопроводная труба слишком длинная, пока она сломана, она будет протекать и не способствует использованию изгиба и поворота в сложных условиях. Поэтому мы разделим водопроводную трубу на очень короткие секции и секции, а затем максимально увеличим размер и функции труб. Мы можем адаптировать меры к местным условиям и собрать их для удовлетворения различных потребностей.

Схема проектирования трубопровода состоит в том, чтобы разделить сложные и длительные процессы на небольшие процессы и небольшие задачи. Каждое минимальное количество задач может быть повторно использовано для формирования сложных и разнообразных процессов путем сборки различных небольших задач.

Наконец, “входные данные” вводятся в конвейер, и входные данные обрабатываются (обрабатываются и фильтруются) в соответствии с каждой небольшой задачей, и, наконец, выходные данные удовлетворяют потребностям.

Вы можете взять в качестве эталона механизм промежуточного программного обеспечения koa, то есть мы часто говорим об идее резки лука

В интерфейсе был ранний инструмент инженерной упаковки gulp Способ написания лучше отражен конвейер

gulp.task('css', function(){
 return gulp.src('client/templates/*.less')
  .pipe(less())
  .pipe(minifyCSS())
  .pipe(gulp.dest('build/css'))
});

gulp.task('js', function(){
 return gulp.src('client/javascript/*.js')
  .pipe(sourcemaps.init())
  .pipe(concat('app.min.js'))
  .pipe(sourcemaps.write())
  .pipe(gulp.dest('build/js'))
});

gulp.task('default', [ 'html', 'css', 'js' ]);

Осветить Трубопровод

Промежуточное программное обеспечение в платформе laravel должно использовать Illuminate\Конвейер Первоначально я хотел написать о своей интерпретации исходного кода “промежуточного программного обеспечения larravel”, но обнаружил, что в Интернете есть много сообщений, в которых они выражены. Поэтому в этой статье мы кратко расскажем о том, как его использовать Осветить\Трубопровод

public function demo(Request $request)
{
  $pipe1 = function ($payload, Closure $next) {
    $payload = $payload + 1;
    return $next($payload);
  };

  $pipe2 = function ($payload, Closure $next) {
    $payload = $payload * 3;
    return $next($payload);
  };

  $data = $request->input('data', 0);

  $pipeline = new Pipeline();

  return $pipeline
    ->send($data)
    ->through([$pipe1, $pipe2])
    ->then(function ($data) {
      return $data;
    });
}

Сегодня я в основном изучаю “конвейер” и рекомендую плагин PHP: лига/конвейер

composer require league/pipeline

Это также очень удобно в использовании

use League\Pipeline\Pipeline;

class TimesTwoStage
{
  public function __invoke($payload)
  {
    return $payload * 2;
  }
}

class AddOneStage
{
  public function __invoke($payload)
  {
    return $payload + 1;
  }
}

$pipeline = (new Pipeline)
  ->pipe(new TimesTwoStage)
  ->pipe(new AddOneStage);

// Returns 21
$pipeline->process(10);

Затем мы добавим быстрый маршрутизатор для использования в моем проекте.

Приведенный выше код изменен таким образом, чтобы он выглядел следующим образом

Давайте посмотрим Responsejson Что там происходит

php
namespace Platapps\Middlewares;
class RespondJson
{
  public function __invoke($payload)
  {
    header('Content-type:text/json');
    return $payload;
  }
}

Просто добавьте один заголовок

Давайте попробуем поместить аннотации в канал

Когда мы приезжаем снова, это становится

Конечно, это очень простое промежуточное программное обеспечение. Такого рода промежуточного программного обеспечения далеко не достаточно. Вот основной код. Вы можете пойти сюда и посмотреть. Это также относительно просто.

Наконец, нам нужно изменить метод трубы

namespace League\Pipeline;

class Pipeline implements PipelineInterface
{
  /**
   * @var callable[]
   */
  private $stages = [];

  /**
   * @var ProcessorInterface
   */
  private $processor;

  public function __construct(ProcessorInterface $processor = null, callable ...$stages)
  {
    $this->processor = $processor ?? new FingersCrossedProcessor;
    $this->stages = $stages;
  }

  public function pipe(callable $stage): PipelineInterface
  {
    $pipeline = clone $this;
    $pipeline->stages[] = $stage;

    return $pipeline;
  }

  public function process($payload)
  {
    return $this->processor->process($payload, ...$this->stages);
  }

  public function __invoke($payload)
  {
    return $this->process($payload);
  }
}

Рамки tp6 достаточно для моей справки.

[email protected]>
// +----------------------------------------------------------------------
namespace think;

use Closure;
use Exception;
use Throwable;

class Pipeline
{
  protected $passable;

  protected $pipes = [];

  protected $exceptionHandler;

  /**
   *Initial data
   * @param $passable
   * @return $this
   */
  public function send($passable)
  {
    $this->passable = $passable;
    return $this;
  }

  /**
   *Call stack
   * @param $pipes
   * @return $this
   */
  public function through($pipes)
  {
    $this->pipes = is_array($pipes) ? $pipes : func_get_args();
    return $this;
  }

  /**
   *Implementation
   * @param Closure $destination
   * @return mixed
   */
  public function then(Closure $destination)
  {
    $pipeline = array_reduce(
      array_reverse($this->pipes),
      $this->carry(),
      function ($passable) use ($destination) {
        try {
          return $destination($passable);
        } catch (Throwable | Exception $e) {
          return $this->handleException($passable, $e);
        }
      });

    return $pipeline($this->passable);
  }

  /**
   *Set exception handler
   * @param callable $handler
   * @return $this
   */
  public function whenException($handler)
  {
    $this->exceptionHandler = $handler;
    return $this;
  }

  protected function carry()
  {
    return function ($stack, $pipe) {
      return function ($passable) use ($stack, $pipe) {
        try {
          return $pipe($passable, $stack);
        } catch (Throwable | Exception $e) {
          return $this->handleException($passable, $e);
        }
      };
    };
  }

  /**
   *Exception handling
   * @param $passable
   * @param $e
   * @return mixed
   */
  protected function handleException($passable, Throwable $e)
  {
    if ($this->exceptionHandler) {
      return call_user_func($this->exceptionHandler, $passable, $e);
    }
    throw $e;
  }
}

Что хорошего в таком способе письма?

На самом деле, хорошо то, что в процессе обработки запроса, когда вы назначаете задачи, в процессе обработки каждому человеку в середине нужно только выполнить свою собственную обработку запроса и результата, а также запроса. Когда данные поступают на контроллер, отображение бизнес-логики становится более мощным

Эта статья о реализации промежуточного программного обеспечения PHP-конвейера в примере кода для представления этого, более связанного содержимого промежуточного программного обеспечения PHP-конвейера, пожалуйста, найдите предыдущие статьи developeppaer или продолжайте просматривать соответствующие статьи ниже, я надеюсь, что вы сможете больше поддерживать developeppaer в будущем!