繁体   English   中英

更新数据库中在线用户的问题

[英]Problem with updating online users in database

我使用 laravel/ui 作曲家 package 在我的站点中安装登录和注册功能。 我必须制作在线/离线功能,所以我在供应商文件夹中编辑了 AuthenticatesUsers.php 特征和登录和注销功能,这样当用户登录时,它将用户表中的“在线”列更改为 1。现在我自己工作正常,但是当我在 git 上推送这些文件并且其他人拉动它们时,他们没有来自 AuthenticatesUsers.php 的代码并且该功能不起作用。 有没有办法在我自己的文件中实现该代码,以便当我推送到 git 时它们就在那里,或者以其他方式让它们留在 git 上? 任何帮助表示赞赏。 这是我的代码。

AuthenticatesUsers.php

<?php

namespace Illuminate\Foundation\Auth;

use App\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Validation\ValidationException;

trait AuthenticatesUsers
{
    use RedirectsUsers, ThrottlesLogins;

    /**
     * Show the application's login form.
     *
     * @return \Illuminate\Http\Response
     */
    public function showLoginForm()
    {
        return view('auth.login');
    }

    /**
     * Handle a login request to the application.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\RedirectResponse|\Illuminate\Http\Response|\Illuminate\Http\JsonResponse
     *
     * @throws \Illuminate\Validation\ValidationException
     */
    public function login(Request $request)
    {
        $this->validateLogin($request);

        if (method_exists($this, 'hasTooManyLoginAttempts') &&
            $this->hasTooManyLoginAttempts($request)) {
            $this->fireLockoutEvent($request);

            return $this->sendLockoutResponse($request);
        }

        if ($this->attemptLogin($request)) {
            $user = User::findOrFail(Auth::user()->id);
            User::setOnlineStatus($user->id, 1);  // HERE IS CHANGE!!!

            return $this->sendLoginResponse($request);
        }

        $this->incrementLoginAttempts($request);

        return $this->sendFailedLoginResponse($request);
    }

    protected function validateLogin(Request $request)
    {
        $request->validate([
            $this->username() => 'required|string',
            'password' => 'required|string',
        ]);
    }

    protected function attemptLogin(Request $request)
    {
        return $this->guard()->attempt(
            $this->credentials($request), $request->filled('remember')
        );
    }

    protected function credentials(Request $request)
    {
        return $request->only($this->username(), 'password');
    }

    protected function sendLoginResponse(Request $request)
    {
        $request->session()->regenerate();

        $this->clearLoginAttempts($request);

        return $this->authenticated($request, $this->guard()->user())
                ?: redirect()->intended($this->redirectPath());
    }

    protected function authenticated(Request $request, $user)
    {
        //
    }

    protected function sendFailedLoginResponse(Request $request)
    {
        throw ValidationException::withMessages([
            $this->username() => [trans('auth.failed')],
        ]);
    }

    public function username()
    {
        return 'email';
    }

    public function logout(Request $request)
    {
        $user = User::findOrFail(Auth::user()->id);
        User::setOnlineStatus($user->id, 0);  // HERE IS CHANGE!!!

        $this->guard()->logout();

        $request->session()->invalidate();

        $request->session()->regenerateToken();

        return $this->loggedOut($request) ?: redirect('/');
    }

    protected function loggedOut(Request $request)
    {
        //
    }

    protected function guard()
    {
        return Auth::guard();
    }
}

用户.php

public static function setOnlineStatus($user_id, $status)
{
    $user = User::getUser($user_id);
    $user->online = $status;
    $user->save();
}

您不应该在本地环境中编辑您的作曲家包。 你可以做的是; 覆盖您在AuthController中的AuthenticatesUsers特征上编辑的方法。 由于这些更改将反映在您的 Github 更改中(AuthController 未被 git 忽略),因此您的同事在拉动您的分支时将进行这些更改。

您的AuthController将具有以下方法,而不是您的本地vendor/AuthenticatesUsers

public function login(Request $request)
{
    $this->validateLogin($request);

    if (method_exists($this, 'hasTooManyLoginAttempts') &&
        $this->hasTooManyLoginAttempts($request)) {
        $this->fireLockoutEvent($request);

        return $this->sendLockoutResponse($request);
    }

    if ($this->attemptLogin($request)) {
        $user = User::findOrFail(Auth::user()->id);
        User::setOnlineStatus($user->id, 1);  // HERE IS CHANGE!!!

        return $this->sendLoginResponse($request);
    }

    $this->incrementLoginAttempts($request);

    return $this->sendFailedLoginResponse($request);
}
  • 另一种选择可能是在项目中编写AuthenticatesUsers特征并使用它。 升级 laravel 依赖项时,您需要跟踪更改。
  • 如果您认为您的更改修复了一些错误等,您可以在 laravel github 页面中打开一个拉取请求,当它被合并时,您可以使用更新的页面(它不适合您的情况,因为您正在customizing方法)
  • Fork laravel 项目,进行这些更改并使用这个 fork 而不是官方的。 这将需要在升级时进行大量手动工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM