2015-04-30 27 views
9

Tôi đang sử dụng Laravel 5's Command Bus và tôi chưa rõ cách triển khai lớp trình xác thực.Tôi đang sử dụng Bus lệnh của Laravel 5 và tôi chưa rõ cách triển khai lớp trình xác nhận

Tôi muốn tạo lớp ResizeImageCommandValidator để kiểm tra xem hình ảnh có thực sự là hình ảnh hay không trước khi cố gắng thay đổi kích thước hình ảnh.

Mã tôi muốn rút ra ở đây là phương thức thay đổi kích thước ResizeImageCommandHandler.

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

Ý tưởng đến từ Laracasts Commands and Domain Events, nhưng Jeffrey không sử dụng kiến ​​trúc Laravel 5.

Đây là mã.

ResizeImageCommandHandler.php

<?php namespace App\Handlers\Commands; 

use App\Commands\ResizeImageCommand; 

use App\Exceptions\ImageInvalidException; 
use Illuminate\Queue\InteractsWithQueue; 
use Intervention\Image\Image; 

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 App\Commands; 

use App\Commands\Command; 

use Illuminate\Queue\SerializesModels; 
use Illuminate\Queue\InteractsWithQueue; 
use Illuminate\Contracts\Queue\ShouldBeQueued; 
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; 
    } 

} 
+1

chỉ đặt câu hỏi, tôi cũng không chắc chắn. Tại sao không sử dụng Yêu cầu bằng cách sử dụng quy tắc trong quy tắc? http://laravel.com/docs/5.0/validation#rule-mimes – borracciaBlu

+0

@borracciaBlu Tôi đang truyền trong một trường hợp của Hình ảnh bằng cách tham khảo để tôi có thể thay đổi kích thước nó. Tôi cần xác nhận rằng đối tượng mà tôi đang gửi thuộc loại đó để tôi có thể gọi kích thước hình ảnh trên đối tượng đó. Tại thời điểm này nó không có một loại mime vì nó là một nguồn tài nguyên php bản địa. – whoacowboy

+0

Trong trường hợp đó, tại sao không sử dụng Loại Gợi ý trên hình ảnh $? – borracciaBlu

Trả lời

4

Trong một nỗ lực để trả lời câu hỏi của bạn, tôi đề nghị không nhận được quá treo lên trên lệnh phần của nó. Trong Laravel 5.1 thư mục đó đang được đổi tên thành "Công việc" - tham khảo;

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

Đây chính là vì Taylor cảm thấy folks được trở nên quá khó khăn vào chữ "Command".

cũng Xem http://www.laravelpodcast.com/episodes/6823-episode-21-commands-pipelines-and-packageshttps://laracasts.com/lessons/laravel-5-commands

Các lớp validator trong các gói Illuminate là khá lớn, http://laravel.com/api/5.0/Illuminate/Validation/Validator.html - Tôi không chắc chắn những gì vấn đề là với điều đó, tôi đoán.

Tôi muốn nói rằng trừ khi bạn có lý do thuyết phục để sử dụng lớp Command cho việc này, đừng. cũng thấy: http://www.laravelpodcast.com/episodes/9313-episode-23-new-beginnings-envoyer-laravel-5-1

Tôi cho rằng bạn có thể đã đặt câu hỏi sai và có thể bạn không cần sử dụng Lệnh để xử lý vấn đề này.

Đây có lẽ là câu trả lời bạn đang tìm kiếm: https://mattstauffer.co/blog/laravel-5.0-validateswhenresolved

use Illuminate\Contracts\Validation\ValidatesWhenResolved;

và nếu điều đó không làm việc, đăng ký Larachat, http://larachat.co/ - một kênh Slack chỉ các loại điều này. Nơi tốt nhất bao giờ hết để giúp Laravel. (trừ Stack Overflow, tất nhiên)

Đây là một lớp nhỏ tôi sử dụng để kiểm tra định dạng của một hình ảnh, cũng được, nghĩ rằng bạn có thể thấy nó hữu ích.

<?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; 
    } 
} 
+0

Ngoài ra; theo như một gói thao tác hình ảnh, tôi rất muốn giới thiệu: https://packagist.org/packages/league/glide –

+1

Cảm ơn câu trả lời. Bất kể tên (Command hoặc Job) Tôi đang tìm cách tốt nhất để xác thực dữ liệu được gửi qua trong lệnh này. Sau khi viết điều này, tôi nhận ra rằng một hình ảnh có thể không phải là nghiên cứu điển hình. Tôi sẽ kiểm tra bài viết của Matt và xem nó hoạt động như thế nào. – whoacowboy

+0

Tôi nghĩ rằng điều này: https://mattstauffer.co/blog/laravel-5.0-validateswhenresolved#non-formrequest-validation-in-controllers - là bit bạn muốn. –

2

Bạn có thể sử dụng Laravel FormRequest lớp 5 để nắm bắt yêu cầu của bạn trước khi nó thậm chí được gửi đến Bus Command:

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

Sau đó, trong lớp ResizeImageRequest của bạn, hãy đặt trong các quy tắc, bạn có thể cần xác thực tùy chỉnh để xác thực xem tệp được tải lên có thực là hình ảnh hay không.

Bạn có thể sử dụng https://packagist.org/packages/intervention/image để làm việc với tệp hình ảnh. Hoặc bạn có thể sử dụng này https://github.com/cviebrock/image-validator

Hỏi tôi nếu bạn cần thêm trợ giúp về vấn đề này

+0

Tôi tin rằng có một mẫu trang trí, nhưng tôi không rõ ràng về cách nó được thực hiện. Tôi không thực sự muốn sử dụng gói cho thứ gì đó được tích hợp sẵn. – whoacowboy

+0

Bạn có thể tìm hiểu Mẫu trang trí theo cách dễ dàng tại đây: https://laracasts.com/lessons/the-decorator-pattern – kishanterry

+0

@whoacowboy nó không phải là một trang trí. Nó là một phương pháp tiêm đơn giản. Nó đưa đối tượng Form Request vào phương thức điều khiển của bạn sẽ tự động xác nhận yêu cầu của bạn ngay trước khi nó được xử lý bởi mã điều khiển của bạn http://laravel.com/docs/master/validation#form-request-validation –

Các vấn đề liên quan