2017-06-13 17 views
9

blade.phplaravel xác nhận với chức năng sử dụng

...... 
<tr> 
    <td>{{ Form::label('cameraMac', 'Mac: ') }}</td> 
    <td>{{ Form::text('cameraMac')}}</td> 
</tr> 
...... 

controller.php

$data = Input::all(); 
function transform($cameraMac) { 
    return strtoupper($cameraMac); 
} 

//validation here 

$user = User::find($data['user_id']); 

if($data["cameraMac"]) 
{ 
    $user->camera_id = transform($data["cameraMac"]); 
    Cloud_camera::create(['id' => transform($data["cameraMac"]), 'user_id' => $user->id]); 
} 

$user->save(); 

tôi cần phải chuyển đổi cameraMac để khóa chính để lưu trữ trong db. Làm cách nào tôi có thể sử dụng hàm transform() trong quy tắc xác thực 'nullable|unique:cloud_cameras,id|size:6'. Đó là để nói, làm thế nào tôi có thể gọi chức năng này trong quá trình xác nhận.

Trả lời

3

Nếu bạn cần phải bằng cách nào đó chuyển đổi dữ liệu đầu vào bạn có thể sử dụng phương thức merge:

Input::merge(['cameraMac' => transform(Input::get('cameraMac')]); 
$this->validate(Input::getFacadeRoot(), [ 
    'cameraMac' => 'nullable|unique:cloud_cameras,id|size:6' 
]); 

Là sở thích cá nhân tôi muốn thay vì gõ gợi ý Illuminate\Http\Request $request trong phương pháp điều khiển và sau đó

$request->merge(['cameraMac' => transform($request->cameraMac)]); 
$this->validate($request, ['cameraMac' => 'nullable|unique:cloud_cameras,id|size:6' 
]); 
+0

là có cách gọi hàm này trong trình xác thực, không chuyển dữ liệu trước. –

+0

@KrisRoofe có, bạn có thể tạo một ["yêu cầu biểu mẫu" tùy chỉnh] (https://laravel.com/docs/5.4/validation#form-request-validation) nơi bạn có thể đặt logic xác thực và ủy quyền của mình và cũng ghi đè phương thức 'validationData' và thực hiện' merge' ở đó. – alepeino

1

Bạn có shure, rằng bạn muốn trường cameraMac được nullable như một (nhiều hơn hoặc ít hơn) chính khóa?

Bạn cũng nên sử dụng xác thực int để sử dụng xác thực size.
Thông số thứ ba của uniquevalidationexcept sẽ bỏ qua ID đã cho.

xác nhận của bạn trong bộ điều khiển có thể trông như thế này

$except_id = $request->input('cameraMac', null); 

$this->validate($request, [ 
    'cameraMac' => 'nullable|unique:cloud_cameras,id,'.$except_id.'|int|size:6' 
]); 

One example làm thế nào bạn có thể hiển thị lỗi xác nhận của bạn trong quan điểm sẽ này

@if (count($errors) > 0) 
    <div class="alert alert-danger"> 
     <ul> 
      @foreach ($errors->all() as $error) 
       <li>{{ $error }}</li> 
      @endforeach 
     </ul> 
    </div> 
@endif 
+0

Vâng Đó là một khóa chính. Khi nó thoát khỏi một máy ảnh mới sẽ được tạo ra. Và liên kết với người dùng. nếu không tồn tại camera_id của người dùng là null. –

1

Hiện tại tôi chuyển dữ liệu đầu vào trước, sau đó xác thực nó theo cách dưới đây.

Nhưng tôi đang tìm cách gọi funciton này trong quá trình xác thực.

$data = Input::all(); 
$data['cameraMac'] = transform($data['cameraMac']); 
$rules = array(
    'id' => 'required|unique:cloud_printers,id|size:6', 
    'cameraMac' => 'unique:cloud_cameras,id|size:6', 
); 
$validator = Validator::make($data, $rules); 
if ($validator->fails()) 
    return Redirect::back()->withInput()->withErrors($validator); 
+0

Quy tắc xác thực là so sánh một đối tượng với một đối tượng khác hoặc một quy tắc. Nó không có để chuyển đổi dữ liệu trước khi bạn so sánh nó.Tại sao bạn muốn nó có ở đó, vì vậy nó trông đẹp hơn? và nó có nên được lưu vào cơ sở dữ liệu với chữ hoa không? nếu có, bạn phải biến đổi nó trước. – mimo

+0

@mimo Biến đổi trên chỉ là một ví dụ đơn giản, thực ra tôi thực hiện một số mã hóa trên đó. –

+1

Vì vậy, bạn chỉ muốn chuyển đổi nó để xác nhận và sau đó nó sẽ trở lại bình thường? Bạn có thể viết thẻ xác nhận tùy chỉnh và thực hiện toàn bộ xác thực trong đó. – mimo

2

Tôi muốn xem xét defining a middleware.

Phần mềm trung gian sẽ thực hiện phép chuyển đổi và hợp nhất kết quả trở lại yêu cầu trước khi nhấn bộ điều khiển.

class TransformId { 
    public function handle(Request $request, Closure $next) { 
     // shout out to @alepeino 
     $request->merge(['cameraMac' => transform($request->cameraMac)]); 

     return $next($request); 
    } 
} 
1

Bạn có thể định nghĩa một custom validation rule:

Validator::extend('transformUpper', function ($attribute, $value, $parameters, $validator) { 
    return strtoupper($value); 
}); 

Sau đó sử dụng các quy tắc mới trong Yêu cầu như bình thường:

$this->validate($request, [ 
    'cameraMac' => 'required|transformUpper' 
]); 
+0

Tôi làm cách nào để sử dụng xác thực tùy chỉnh và xác thực duy nhất cùng nhau? Tôi muốn cameraMac được chuyển đổi trở thành duy nhất trong cơ sở dữ liệu. –

+0

Trình xác thực trả về true hoặc false, tôi không nghĩ rằng mã của bạn sẽ thay đổi giá trị đầu vào của máy ảnhMac. –

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