Laravel 5如果条件在最后一个条件下不起作用(否则)


Laravel 5 if condition not working on last condition (else)

我有一个文本字段status-text,允许用户提交他们的状态。

我还有一个图像上传字段,可以在状态中添加图片。

在我的if条件下,我首先检查输入是否有任何数据,然后检查输入是否具有图像AND验证器是否失败,然后检查验证器是否失败(提交没有图像的状态),最后我做一个else,它应该是"如果输入没有任何数据"

前3次检查有效,但最后一次else无效。显然,由于某种原因,代码没有达到最终版本。

这是视图

@if (count($errors) > 0)
        <div class="alert alert-danger">
            <ul>
                @foreach ($errors->all() as $error)
                    <li>{{ $error }}</li>
                @endforeach
            </ul>
        </div>
@endif
@include('partials/flash')
<div class="row">
        <div class="col-md-12">
            {!! Form::open(['files' => true]) !!}
            <div class="panel panel-default">
                <div class="panel-heading">Add New Status</div>
                <div class="panel-body">
                    <div class="form-group">
                        <label for="status-text">Write Something</label>
                        <textarea class="form-control" name="status-text" id="status-text"></textarea>
                    </div>
                </div>
                <div class="panel-footer clearfix">
                    <div class="row">
                        <div class="col-md-6">
                            <label for="file-upload" class="custom-file-upload">
                                <i class="fa fa-image"></i>
                            </label>
                            <input id="file-upload" name="status_image_upload" type="file">
                        </div>
                        <div class="col-md-6">
                            <button class="btn btn-info btn-sm pull-right"><i class="fa fa-plus"></i> Add Status</button>
                        </div>
                    </div>
                </div>
    </div>
    {!! Form::close() !!}

这是FeedController@index

if($request->has('status-text')) {
        $text = Input::get('status-text');
        $rules = [
            'status-text' => 'required|string'
        ];
        $validator = Validator::make($request->all(), $rules);
        if($request->hasFile('status_image_upload') && !$validator->fails()) {
            $image = $request->file('status_image_upload');
            $imageName = str_random(8) . '_' . $image->getClientOriginalName();
            //$imageFull = str_random(8) . '_' . $image->getClientOriginalName();
            $image->move('uploads/status_images', $imageName);
            $userStatus = new Status;
            $userStatus->status_text = $text;
            $userStatus->image_url = $imageName;
            $userStatus->type = 1;
            $userStatus->user_id = Auth::user()->id;
            $userStatus->save();
            flash('Your status has been posted');
            return redirect(route('feed'));
        } elseif(!$validator->fails()) {
            $userStatus = new Status;
            $userStatus->status_text = $text;
            $userStatus->user_id = Auth::user()->id;
            $userStatus->save();
            flash('Your status has been posted', 'success');
            return redirect(route('feed'));
        } else {
            $messages = $validator->errors();
            return redirect(route('feed'))->withErrors($messages);
        }

我试过用if($validator->fails()),但没有用。我还尝试返回一个简单的字符串return 'field cannot be empty';来测试它,但它也不起作用。

我为post_comment运行了相同的代码,它也适用于else,所以如果我将注释字段留空并提交它,我会被重定向到提要页面,并显示一条错误消息,说明该字段不能为空。

这个工作

if(Input::has('post_comment')) {
        $rules = [
            'comment-text' => 'required|string'
        ];
        $validator = Validator::make($request->all(), $rules);
        if(!$validator->fails()) {
            $status = Input::get('post_comment');
            $commentBox = Input::get('comment-text');
            $selectedStatus = Status::find($status);
            $selectedStatus->comments()->create([
                'comment_text' => $commentBox,
                'user_id' => Auth::user()->id,
                'status_id' => $status
            ]);
            flash('Your comment has been posted', 'success');
            return redirect(route('feed'));
        } else {
            $messages = $validator->errors();
            return redirect(route('feed'))->withErrors($messages);
        }
    }

我不知道还能尝试什么。

在伪代码中,您您正在尝试执行

if input exists
  if image exists and validator passes
  elsif validator passes
  end
else 
  // no data
end

但你的代码显示你正在进行

if input exists
  if image exists and validator passes
  elsif validator passes
  else 
    // no data
  end
end

我会完全重构它。防守型程序。

if no data
  // handle no data
  return;
end
if validator fails
  // handle invalid data
  return;
end
create new Status
if image exists
  // handle image upload
end
flash message
redirect

如果您这样做,您将通过验证检查、创建状态、闪烁消息和重定向来消除重复。

尽量避免嵌套条件语句。尽量避免使用elseelse if语句。因此,您的代码将更加干净和可读。

如果您的文本字段在提交时为空,它将不会在请求中。