【问题标题】:Laravel - Check when account is createdLaravel - 检查帐户何时创建
【发布时间】:2013-12-06 01:40:18
【问题描述】:

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

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

所以应该在创建帐户时调用它,但仅在发生这种情况时调用:

$('#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('reveal', 'open');

【问题讨论】:

  • 假设有两个人使用计算机。你将如何区分它们?
  • 您应该考虑进行 ajax 调用来创建用户。
  • 您确定这是您要使用的模式吗?我在这里看到了很多滥用的可能性。即,以隐身模式(或同等模式)打开,加载您的页面,创建用户名,关闭隐身模式,然后重复。

标签: php jquery laravel


【解决方案1】:

我会使用 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'); 
            }
        }
    });
});

【讨论】:

    【解决方案2】:

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

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

    1.检查会话(php http session,例如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'));
              }
        }
        ....
    

    1.1如果存在,不要执行显示基础模态和欢迎用户的js代码。

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

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

    $.ajax({
           url: "checkUser"
            success: function(data) { 
                if(!data.exists) {
                    $('#i-modal').foundation('reveal', 'open');
                }else{
                    /*set any content e.g. welcome user*/
                }
            }
        });
    

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

    php

    ....
    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*/
                    }
                }
            });
    

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        【解决方案4】:

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

        为此,您可以创建一个与所有视图共享的全局变量

        View::share('user', $current_user);
        

        然后在<head>你的视图文件中你可以添加这个:

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

        然后你可以这样做:

        if (User.id == 0)
            $('#i-modal').foundation('reveal', 'open');
        

        【讨论】:

        • 安全性不太好。你真的想把这些东西保留在服务器端。
        • @Steve 你可以保护用户模型中的某些用户数据,或者,也许只是输出一个布尔值。
        猜你喜欢
        • 1970-01-01
        • 2016-04-20
        • 2019-02-03
        • 2020-05-11
        • 1970-01-01
        • 1970-01-01
        • 2011-11-12
        • 2011-01-29
        • 2023-03-17
        相关资源
        最近更新 更多