Php Laravel-在创建帐户时检查

Php Laravel-在创建帐户时检查,php,jquery,laravel,Php,Jquery,Laravel,在我正在创建的网站上,当访问者加载页面时,帐户会自动生成。创建帐户时,将要求新用户通过创建模式窗口选择用户名,当用户提交新用户名时,数据将发送回服务器,模式窗口将关闭 所以现在唯一的问题是我不确定如何调用这个模式窗口,只有在生成新帐户时。现在,每次重新加载页面时,它都会显示出来,但应该是在生成帐户之后 因此,在创建帐户时应调用此函数,但仅当发生此情况时: $('#i-modal').foundation('reveal', 'open'); 创建帐户时,会发生这种情况。请求被发送到/creat

在我正在创建的网站上,当访问者加载页面时,帐户会自动生成。创建帐户时,将要求新用户通过创建模式窗口选择用户名,当用户提交新用户名时,数据将发送回服务器,模式窗口将关闭

所以现在唯一的问题是我不确定如何调用这个模式窗口,只有在生成新帐户时。现在,每次重新加载页面时,它都会显示出来,但应该是在生成帐户之后

因此,在创建帐户时应调用此函数,但仅当发生此情况时:

$('#i-modal').foundation('reveal', 'open');
创建帐户时,会发生这种情况。请求被发送到
/createUser

用户控制器:

public function createUser()
{

    $newUser = new User;

    $newUser->username = 'user-'.Helpers::randomLowerCase(4);

    $newUser->save();
    // Check if user isn't logged in yet
    if (!Auth::check()) {
        Auth::login($newUser);
    } else {
       // ...
    }
    // Return the user home
    return Redirect::action('HomeController@showHome');
}

那么我应该如何做到这一点,并且只调用
$('I-modal').foundation('discover','open')
在创建帐户后什么时候?

一种方法是将用户输入的用户名存储在http会话中,并且可能还会自动将用户登录到系统中。然后,如果页面重新加载,
UserController
检查会话中是否存储了用户名或用户是否登录。根据结果是否显示模态

因此,当第一次加载页面时,您可以执行以下步骤(然后是未测试的代码,作为放置代码每个部分的示例)

1.检查会话(php http会话,例如
session_start();if(isset($_session[$username]){..
)以查看用户名是否存在或
Auth::Check()

php

Route::get('checkUser', 'UserController@checkUser');
Route::get('createUser/{username}', 'UserController@createUser');
class UserController extends BaseController {
public function checkUser(){
      session_start();
      if(isset($_SESSION["username"])){/*or use something like Auth::check()*/
        return Response::json(array('exists' => 'true'));
/*or redirect e.g.  return Redirect::action('HomeController@showHome');*/
/*or render a view e.g. return View::make('user.page', array('username' => $username));*/
          }else{
            return Response::json(array('exists' => 'false'));
          }
    }
    ....
....
Route::get('createUser/{username}', 'UserController@createUser');

class UserController extends BaseController {
....
/*your code slightly modified*/
  public function createUser($username)
{

  // Check if user isn't logged in yet
  if (!Auth::check()/*&& if persistence is used, which is best to actually use it to persist usernames, check if the username is available*/) {

     $newUser = new User;

     //$newUser->username = 'user-'.Helpers::randomLowerCase(4);
     $newUser->username=$username;

     $newUser->save();

     Auth::login($newUser);
  } else {
     return Response::json(array('created' => 'false'));
   /* or  return Redirect::action('HomeController@loginFailed');*/
  }

  // Return the user home
  return Redirect::action('HomeController@showHome');
}
....

<强> 1.1 < /强>如果存在,则不执行显示基础模态和欢迎用户的JS代码。

1.2如果不存在,则执行js代码并显示要求用户登录的模式窗口

js(或通过视图从php代码中输入,例如从控制器返回视图::make('user.page',array('username'=>$username));)

1.2.1如果用户输入现有用户名或生成新用户名,请登录该用户并将用户名存储在会话中

php

Route::get('checkUser', 'UserController@checkUser');
Route::get('createUser/{username}', 'UserController@createUser');
class UserController extends BaseController {
public function checkUser(){
      session_start();
      if(isset($_SESSION["username"])){/*or use something like Auth::check()*/
        return Response::json(array('exists' => 'true'));
/*or redirect e.g.  return Redirect::action('HomeController@showHome');*/
/*or render a view e.g. return View::make('user.page', array('username' => $username));*/
          }else{
            return Response::json(array('exists' => 'false'));
          }
    }
    ....
....
Route::get('createUser/{username}', 'UserController@createUser');

class UserController extends BaseController {
....
/*your code slightly modified*/
  public function createUser($username)
{

  // Check if user isn't logged in yet
  if (!Auth::check()/*&& if persistence is used, which is best to actually use it to persist usernames, check if the username is available*/) {

     $newUser = new User;

     //$newUser->username = 'user-'.Helpers::randomLowerCase(4);
     $newUser->username=$username;

     $newUser->save();

     Auth::login($newUser);
  } else {
     return Response::json(array('created' => 'false'));
   /* or  return Redirect::action('HomeController@loginFailed');*/
  }

  // Return the user home
  return Redirect::action('HomeController@showHome');
}
....
js

$.ajax({
           url: "createUser",
           data:{usernae:the_username_from_modal}
            success: function(data) { 
                if(!data.created) {
                    /*if the redirection is not handled by the controller, handle the failed login/registration of existing username*/
                }
            }
        });

此外,在代码中,您可能还应该将用户名存储到持久层,以便检查现有用户名,允许用户使用其现有用户名,并恢复/检索您可能在应用程序中保存的任何类型的状态或数据。

我将使用AJAX检查帐户。加载完文档后,请关闭一个请求,该请求将检查以确保帐户已使用用户名完全设置。如果没有,则您可以弹出模式,我假设您已经设置了

对于本例,我正在创建一个AjaxController,您可以在其中放置所有ajax调用逻辑,但这些函数可以放在任何地方。请确保相应地更改路由。请注意,此代码大部分未经测试

// Route
Route::post('ajax/checkUserAccount', array('uses' => 'AjaxController@checkUserAccountExists', as 'ajax.checkUserAccount');

// Controller
AjaxController extends BaseController {
    public function checkUserAccountExists {
        // Do user account check logic here.  This is just an example as I'm not sure how you plan on handling this or what variables are set when someone creates an account
        $userCount = DB::table('users')->where('username', Input::get('username'))->count();
        if($userCount > 0) { 
            return Response::json(array('member' => 'true'));
        } else {
            return Response::json(array('member' => 'false'));
        }
    }
}

// jQuery AJAX 
$(document).ready(function()
{
    $.ajax({
        method: "POST"
        , url: "{{ URL::route('ajax.checkUserAccount') }}"
        success: function(data) { 
            if(data.member === false) {
                $('#i-modal').foundation('reveal', 'open'); 
            }
        }
    });
});

我认为更好的解决方案是在HTML文档的标题中包含javascript变量
User

为此,您可以创建一个全局变量,通过使用

View::share('user', $current_user);
然后在
的视图文件中,可以添加以下内容:

<script type="text/javascript">var User = {{ $user->toJson() }}</script>

这毫无意义。为什么在加载页面时会自动创建帐户?你不知道谁加载了页面,也不知道为什么,也不知道他们是否有资格创建帐户。除非用户单击“创建帐户”,否则不应打开“创建帐户”模式链接或执行等效的操作调用。此外,在modal提交的表单数据在后端成功验证之前,不应实际创建帐户

此模式中显示的表单应在前端使用JavaScript验证。这将节省用户等待数据发布后发现他们没有正确完成表单的麻烦。您可以通过将Ajax合并到前端验证中来进一步增强UX。例如,美国的onblur事件er名称输入可以触发查询数据库并检查用户名是否可用的方法。对于电子邮件输入,您可以使用类似的Ajax方法来检查电子邮件地址是否已注册。您可以使用stock jQuery验证插件完成所有这一切


请注意,前端验证只是为了方便用户。您仍然需要在服务器端验证数据,因为恶意用户很容易绕过客户端JS。

假设有两个人在使用计算机。您将如何区分他们?您应该考虑制作ajax调用来创建用户。你确定这是你想要使用的模式吗?我发现这里有很多滥用的可能性。即,以匿名方式打开(或同等方式),加载页面,创建用户名,关闭incognito,然后重复。这在安全性方面不是很好。你真的想在服务器端保留这些内容。@Steve你可以在用户模型中保护某些用户数据,或者,只输出一个布尔值。