Laravel -5:我如何让我的表单输入验证(除其他外)


Laravel -5: How do I get my form inputs to validate (among other things..)?

我有几个问题。

  1. 我似乎无法在表单输入中显示保存的数据。
  2. 我无法让我的url验证唯一。
  3. 我的控制器代码看起来非常冗余。

让url验证唯一优先。

我还创建了一个表,用于与用户共享一对多关系的社会链接。我认为这是正确的。如果没有,请纠正我。

update只是一个想法…我认为我可能是复杂的事情,只有一个单一的"类型"列。这将是更容易,如果我有一个列的每一种类型的链接,即facebook col, twitter col等。如果用户没有为某些服务提供信息,我只是不想要空列下面是我的代码:

UPDATE我放弃了,只是为不同类型的url添加单独的列,并将其更改为一对一的关系。

{!! Form::model($user_links,['method' => 'PATCH', 'action'=> ['UserController@update_social']]) !!}
                <div class='row form-group'>
                    <div class='col-md-2'>
                        {!! Form::label('facebook', 'Facebook Username') !!}
                    </div>
                    <div class='col-md-7'>
                        {!! Form::text('facebook', '',['class'=>'form-control']) !!}
                    </div>
                </div>
                <div class='row form-group'>
                    <div class='col-md-2'>
                        {!! Form::label('twitter', 'Twitter Username') !!}
                    </div>
                    <div class='col-md-7'>
                        {!! Form::text('twitter', null,['class'=>'form-control']) !!}
                    </div>
                </div>
                <div class='row form-group'>
                    <div class='col-md-2'>
                        {!! Form::label('reddit', 'Reddit Username') !!}
                    </div>
                    <div class='col-md-7'>
                        {!! Form::text('reddit', null,['class'=>'form-control']) !!}
                    </div>
                </div>
                <div class='row form-group'>
                    <div class='col-md-3'>
                        {!! Form::submit('Save Changes',['class'=>'btn btn-md btn-success']) !!}
                    </div>
                </div>
                {!! Form::close() !!}
<<p> 控制器/strong>
    public function show_social(Request $request){
      $user_links= $request->user()->links;
      return view('user.edit.social_connect',compact('user_links'));
    }
    public function update_social(SocialRequest $request){
      $facebook= Input::get('facebook');
      $twitter= Input::get('twitter');
      $reddit= Input::get('reddit');
      $user = $request->user();
      $this->validate($request,['url'=>'unique']);
      if(Input::has('facebook')||Input::has('google')||Input::has('reddit')||Input::has('twitter'))
      {
        if($facebook != ""){
          $link = new SocialLinks();
          $link->type = 'facebook';
          $link->url='https//www.facebook.com/'.$facebook;
          $link->user_id=$user->id;
          $link->save(); 
        }
        if($twitter != ""){
          $link = new SocialLinks();
          $link->type = 'twitter';
          $link->url='https//www.twitter.com/'.$twitter;
          $link->user_id=$user->id;
          $link->save(); 
        }
        if($reddit != ""){
          $link = new SocialLinks();
          $link->type = 'reddit';
          $link->url='https//www.reddit.com/user'.$reddit;
          $link->user_id=$user->id;
          $link->save(); 
        }
        return Redirect::back()->with('message','Your profile has been updated');     
      }
        return Redirect::back();
    }

my model file

<?php
namespace App;
use Illuminate'Database'Eloquent'Model;
use Eloquent;
class SocialLinks extends Eloquent{
    protected $table= 'social_links';
    protected $fillable=[
        'type',
        'url'                                       
    ];
    public function user()
    {
        return $this->belongsTo('App'User');
    }
}
?>

my request

<?php
namespace App'Http'Requests;
use App'Http'Requests'Request;
class SocialRequest extends Request
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
            return [
                'url'=>'unique|user_id'      
                ];
            }
}

好吧,这里有一些错误。您的请求文件被错误地使用。你需要一个模型,当然,除非你只是把"请求文件"answers"模型"弄混了。为了这个注释的目的,我将在控制器中使用Laravel的验证方法。

值得注意的是,你的"url"没有出现在表单中。验证在请求内部查找"url"参数,但由于您似乎没有在表单中发送该参数,因此这是相当多余的。此外,当您使用"唯一"验证器时,您需要提供一个数据库表,以便它根据提供的值进行搜索和检查,在这种情况下;url。

我已经添加了,但是,它真的没有做任何事情,因为url将永远是空的,直到你在表单中提供它,所以请求将始终通过。

public function show_social(Request $request)
{
  $user_links = $request->user()->links;
  return view('user.edit.social_connect', compact('user_links'));
}
public function update_social(Request $request)
{
  $facebook = $request->facebook;
  $twitter = $request->twitter;
  $reddit = $request->reddit;
  $user = $request->user();
  $this->validate($request, [
        'url' => 'unique:social_links,column',  
  ]);
  if($request->has('facebook') || $request->has('google') || $request->has('reddit') || $request->has('twitter'))
  {
    if($facebook != ""){
      $link = new SocialLinks();
      $link->type = 'facebook';
      $link->url = 'https//www.facebook.com/'.$facebook;
      $link->user_id = $user->id;
      $link->save(); 
    }
    if($twitter != ""){
      $link = new SocialLinks();
      $link->type = 'twitter';
      $link->url = 'https//www.twitter.com/'.$twitter;
      $link->user_id = $user->id;
      $link->save(); 
    }
    if($reddit != ""){
      $link = new SocialLinks();
      $link->type = 'reddit';
      $link->url = 'https//www.reddit.com/user'.$reddit;
      $link->user_id = $user->id;
      $link->save(); 
    }
    return Redirect::back()->with('message','Your profile has been updated');     
  }
    return Redirect::back();
}

正如您所看到的,我删除了请求的类型提示,因为您实际上正在做的(从我可以看出)是对模型进行类型提示。您提供的"请求文件"是一个模型,应该在App/目录中,并使用命名空间引用。

如果您确实使用该文件作为模型,那么您的关系看起来不错,当然假设您在数据库中有正确的外部列设置,引用用户表。

至于你的模型绑定不工作,你有没有试过转储$user_links变量,像这样:-看看它是否真的包含任何东西?因为你在这里使用请求,我不知道你从哪里得到的信息。

希望这对你有帮助,如果你还有什么问题,请随时提问。