Я использую командную шину Laravel 5, и мне неясно, как реализовать класс валидатора

Я использую командный автобус Laravel 5 и мне непонятно, как реализовать класс валидатора.

Я хотел бы создать класс ResizeImageCommandValidator, который проверяет, что изображение на самом деле является изображением, прежде чем пытаться изменить размер изображения.

код, который я хотел бы вытащить, находится здесь из метода resizeimagecommandhandler resize.

if (!($image instanceof Image))
{
    throw new ImageInvalidException('ResizeImageCommandHandler');
}

идея пришла от Laracasts команды и события домена, но Джеффри не использует архитектуру Laravel 5.

вот код.

ResizeImageCommandHandler.в PHP

<?php namespace AppHandlersCommands;

use AppCommandsResizeImageCommand;

use AppExceptionsImageInvalidException;
use IlluminateQueueInteractsWithQueue;
use InterventionImageImage;

class ResizeImageCommandHandler {

    /**
     * Create the command handler.
     */
    public function __construct()
    {
    }
    /**
     * Handle the command.
     *
     * @param  ResizeImageCommand  $command
     * @return void
     */
    public function handle($command)
    {
        $this->resizeImage($command->image, $command->dimension);
    }
    /**
     * Resize the image by width, designed for square image only
     * @param Image $image Image to resize
     * @param $dimension
     * @throws ImageInvalidException
     */
    private function resizeImage(&$image, $dimension)
    {
        if (!($image instanceof Image))
        {
            throw new ImageInvalidException('ResizeImageCommandHandler');
        }
        $image->resize($dimension, null, $this->constrainAspectRatio());
    }
    /**
     * @return callable
     */
    private function constrainAspectRatio()
    {
        return function ($constraint) {
            $constraint->aspectRatio();
        };
    }


}      

ResizeImageCommand.в PHP

<?php namespace AppCommands;

use AppCommandsCommand;

use IlluminateQueueSerializesModels;
use IlluminateQueueInteractsWithQueue;
use IlluminateContractsQueueShouldBeQueued;
use Image;

class ResizeImageCommand extends Command {
    use InteractsWithQueue, SerializesModels;

    public $image;
    public $savePath;
    public $dimension;

    /**
     * Create a new command instance.
     * @param Image $image
     * @param string $savePath
     * @param int $dimension
     * @param int $pose_id
     * @param int $state_id
     */
    public function __construct(&$image, $savePath, $dimension)
    {
        $this->image = $image;
        $this->savePath = $savePath;
        $this->dimension = $dimension;
    }

}

2 ответов


в попытке ответить на ваш вопрос, я предлагаю не слишком зацикливаться на команда часть. В Laravel 5.1 эта папка переименовывается в "задания" - см.;

https://laravel-news.com/2015/04/laravel-5-1/

это именно потому, что Тейлор чувствовал, что люди слишком застряли на слове "команда"."

Смотрите также http://www.laravelpodcast.com/episodes/6823-episode-21-commands-pipelines-and-packages и https://laracasts.com/lessons/laravel-5-commands

классы валидаторов в пакетах Illuminate довольно велики,http://laravel.com/api/5.0/Illuminate/Validation/Validator.html - я не уверен, в чем проблема с этим, я думаю.

Я бы сказал, что если у вас нет веской причины использовать для этого класс Command, не делайте этого. также смотрите: http://www.laravelpodcast.com/episodes/9313-episode-23-new-beginnings-envoyer-laravel-5-1

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

это, вероятно, ответ, который вы ищете:https://mattstauffer.co/blog/laravel-5.0-validateswhenresolved

use Illuminate\Contracts\Validation\ValidatesWhenResolved;

и если это не сработает, зарегистрируйтесь в Larachat, http://larachat.co/ - слабый канал для такого рода вещей. Лучшее место для помощи Laravel. (за исключением переполнения стека, конечно)

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

<?php
Class FileUploadFormat
{
public function is_image($image_path)
  {
      if (!$f = fopen($image_path, 'rb'))
      {
          return false;
      }

      $data = fread($f, 8);
      fclose($f);

      // signature checking
      $unpacked = unpack("H12", $data);
      if (array_pop($unpacked) == '474946383961' || array_pop($unpacked) == '474946383761') return "gif";
      $unpacked = unpack("H4", $data);
      if (array_pop($unpacked) == 'ffd8') return "jpg";
      $unpacked = unpack("H16", $data);
      if (array_pop($unpacked) == '89504e470d0a1a0a') return "png";
      return false;
  }
}

вы можете использовать Laravel 5's FormRequest класс для захвата вашего запроса, прежде чем он будет отправлен в командную шину:

public function postResizeImage(ResizeImageRequest $request) {
    // Send request to the Command Bus
}

затем в ResizeImageRequest class, поместите в правила, вам может потребоваться пользовательская проверка для проверки того, является ли загруженный файл на самом деле изображением.

вы можете использовать https://packagist.org/packages/intervention/image для работы с файлами изображений. Или вы можете использовать это https://github.com/cviebrock/image-validator

спросите меня, если вам нужна дополнительная помощь в этом