【问题标题】:Problem with updating online users in database更新数据库中在线用户的问题
【发布时间】:2020-08-28 01:06:36
【问题描述】:

我使用 laravel/ui composer 包在我的站点中安装登录和注册功能。我必须制作在线/离线功能,所以我在供应商文件夹中编辑了 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();
}

【问题讨论】:

  • 永远不要编辑vendor文件夹中的文件,那样只会给你带来麻烦

标签: php laravel


【解决方案1】:

您不应该在本地环境中编辑您的作曲家包。你可以做的是;在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 trait 并使用它。升级 laravel 依赖项时,您需要跟踪更改。
  • 如果您认为您的更改修复了一些错误等,您可以在 laravel github 页面中打开一个拉取请求,当它被合并时您可以使用更新的请求(它不适合您的情况,因为您是 customizing方法)
  • fork laravel 项目,进行这些更改并使用这个 fork 而不是官方的。这将需要在升级时进行大量手动工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-25
    • 2011-12-03
    • 2015-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-08
    相关资源
    最近更新 更多