中小企業に勤めるITエンジニアの徒然日記

中小企業に勤めるITエンジニア(三十路女子)が日々のよしなしごとや、IT技術についての記事をつらつらと書いていきます。

Larabel

Laravel5でアップロードされたファイルをチェックするValidatorを作成する

Laravel5のカスタムバリデーターを作成するのが思いのほか簡単だったのでメモ


zipファイルの中に対象のファイルが存在することをチェックするValidatorを作成します。

       
■CustomValidatorクラスの作成

\app\Validatorに作成する。


このValidatorでは、ZIPファイルの中にaaa.txtがあることを確認する。

配列$parametersの一番最初の要素にファイルのパスを設定してもらう
use ZipArchive;

class CustomValidator
{
/**
* zipファイルの内容を確認
*
* @param unknown $attribute
* @param unknown $value
* @param unknown $parameters
* @return boolean
*/
public function validateCustomZipFile($attribute, $value, $parameters){

$adhtml = '';

$zipfile = $parameters[0];
$zip = new ZipArchive;
if ($zip->open($zipfile)){
$fp = $zip->getStream('aaa.txt');
if(!$fp){
// 失敗
return false;
}
}
return true;
}
}






■App\Providers\AppServiceProviderのbootに追加

use Validator;
use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider {

	public function boot()
	{
		// カスタムValidator
		Validator::extend('default_html', 'App\Validation\CustomValidator@validateCustomHtml');
	}
	
	
	
	
}





■Controllerにバリデート処理を追加
    アップロードされたファイルのパスをValidatorのパラメータに設定します。
	// バリデーションルール
	$custom_rules = ['file' => 'zip:'.$request->file('file')];
	$custom_msg = ['file.zip' => 'zipファイルの中に対象のファイルがありません'];

	// バリデーション処理の呼び出し
	$v = Validator::make($request->all(), $custom_rules, $custom_msg);
	if ($v->fails()){
		return redirect()->back()
		                 ->withInput()
		                 ->withErrors($v->errors());
	}


以上

とっても簡単でした。
このエントリーをはてなブックマークに追加

複数のカラムでユニークにしたいのですが、調べてもなかなか出てこずハマったのでメモをしておきます。

まず、単一のカラムがユニークかどうかは、普通にuniqueを使えばOKです。

$validator = Validator::make($input, [
    'name' => 'required',
    'password' => 'required|min:8',
    'email' => 'required|email|unique:users',
]);
では複数のカラムでユニークにするにはどうすればよいか?

上記例ではEメールアドレスが重複していたらNGですが、たとえばサービスごとにEメールアドレスが重複していたらNG、という複合ユニークにしたいとします。


ググったところ、まずこちらが出てきました。

http://stackoverflow.com/questions/29093061/composite-unique-key-validation-laravel

ふむふむ、unique_withで並べるらしいです。Laravel4と5で動くらしいとな。

$validator = Validator::make($input, [
    'name' => 'required',
    'password' => 'required|min:8',
    'service'=>'required',
    'email' => 'required|email|unique_with:users,service',
]);
さて、試してみると、

BadMethodCallException in Validator.php line 2594:
Method [validateUniqueWith] does not exist.

大嘘でした。unique_withなんてものはないようです。

http://readouble.com/laravel/5/0/0/ja/validation.html

上記URLに、以下の記載が!

さらにクエリーへWHERE節として追加される条件を追加することも可能です。

やってみます
$validator = Validator::make($input, [
    'name' => 'required',
    'password' => 'required|min:8',
    'service'=>'required',
    'email' => 'required|email|unique:users,email,NULL,service,service,'.$input['service'],
]);


unique以下の説明
users,email → usersテーブルのemailと重複していないか調べます
NULL,service → serviceがNULLでない行を対象とします
service,$input['service'] → serviceが入力した値を対象とします

2つのカラムでやってみましたが、3つ以上の場合もカンマで'カラム','値'というように条件をを繋いでいけばいける気がします(未確認)

このエントリーをはてなブックマークに追加

↑このページのトップヘ