密码重置表列名覆盖Laravel 5

3

大家好,我修改了密码重置表格的列名为 'created_at' 而非 'created'。但是如果我在迁移时更改列名为 'created',会出现错误提示“找不到列名 'created_at'”。

 \vendor\laravel\framework\src\Illuminate\Auth\Passwords\DatabaseTokenRepository.php
 protected function getPayload($email, $token)
{
    return ['email' => $email, 'token' => $token, 'created_at' => new Carbon];
}

这是来自列名“created_at”的文件,我想覆盖此函数,请给予建议。

2个回答

4

我认为我找到了一种方法,在不触及供应商目录的情况下完成此操作。

对于 Laravel 5.2

  1. 创建一个类,继承 Illuminate\Auth\Passwords\DatabaseTokenRepository
  2. 在那里重写getPayload() 方法
  3. 创建一个类,继承 Illuminate\Auth\Passwords\PasswordBrokerManager
  4. 重写resolve() 方法,以使用第1步中的令牌存储库返回新的PasswordBroker
  5. 打开config/app.php 并将PasswordResetServiceProvider从提供程序数组中注释掉
  6. 在您的应用程序服务提供商中注册来自第3步的密码代理管理器

    $this->app->singleton('auth.password', function ($app) { return new YourPasswordBrokerManager($app); });

    $this->app->bind('auth.password.broker', function ($app) { return $app->make('auth.password')->broker(); });

对于Laravel 5

  1. 创建一个类,继承Illuminate\Auth\Passwords\DatabaseTokenRepository
  2. 在那里重写 getPayload() 方法
  3. 创建一个类,继承Illuminate\Auth\Passwords\PasswordResetServiceProvider
  4. 重写registerTokenRepository()以返回第1步中的存储库
  5. 打开config/app.php 并将PasswordResetServiceProvider 从提供程序数组中注释掉
  6. 将来自第3步的提供程序添加到提供程序数组中

请注意,我还没有测试过这个方法,但是理论上应该是可行的。


我正在使用 Laravel 5,但是找不到 Illuminate\Auth\Passwords\PasswordBrokerManager。请问在哪里可以获取 resolve() 方法?谢谢。 - MGS
@MGS 对不起,我写的这个方法是针对5.2版本的。请查看我上面编辑后的版本5的内容。 - thefallen
你能解释一下第六步我需要做什么吗?谢谢你的回复。 - MGS
从你在第5步中注释掉的提供程序数组中,添加你在第3步中创建的类。@MGS - thefallen

0

已解决:我在我的Laravel 5.4项目中应用了5.2步骤:

ForgotPasswordHelperRepository.php

 <?PHP


 namespace App\Helpers;


use Carbon\Carbon;

 class ForgotPasswordHelperRepository extends \Illuminate\Auth\Passwords\DatabaseTokenRepository
   {

/**
 * Build the record payload for the table.
 * I wanted to add an extra column organization_id
 * organizationId() is a helper method I created
 * @param string $email
 * @param string $token
 * @return array
 */
protected function getPayload($email, $token)
{
    return ['email' => $email, 'token' => $this->hasher->make($token), 'created_at' => new Carbon,'organization_id' => organizationId()];
}

  }

PasswordBrokerManagerHeler.php

<?PHP


namespace App\Helpers;


use Closure;
use Illuminate\Auth\Passwords\DatabaseTokenRepository;
use Illuminate\Auth\Passwords\PasswordBroker;
use Illuminate\Support\Str;

 class PasswordBrokerManagerHelper extends \Illuminate\Auth\Passwords\PasswordBrokerManager
{

/**
 * @inheritDoc
 */
public function sendResetLink(array $credentials)
{
    // TODO: Implement sendResetLink() method.
}

/**
 * @inheritDoc
 */
public function reset(array $credentials, Closure $callback)
{
    // TODO: Implement reset() method.
}

/**
 * @inheritDoc
 */
public function validator(Closure $callback)
{
    // TODO: Implement validator() method.
}

/**
 * @inheritDoc
 */
public function validateNewPassword(array $credentials)
{
    // TODO: Implement validateNewPassword() method.
}

/**
 * Resolve the given broker.
 *
 * @param  string  $name
 * @return \Illuminate\Contracts\Auth\PasswordBroker
 *
 * @throws \InvalidArgumentException
 */
protected function resolve($name)
{

    $config = $this->getConfig($name);

    if (is_null($config)) {
        throw new \InvalidArgumentException("Password resetter [{$name}] is not defined.");
    }

    // The password broker uses a token repository to validate tokens and send user
    // password e-mails, as well as validating that password reset process as an
    // aggregate service of sorts providing a convenient interface for resets.
    return new PasswordBroker(
        $this->createTokenRepository($config),
        $this->app['auth']->createUserProvider($config['provider'])
    );
}



protected function createTokenRepository(array $config)
{
    $key = $this->app['config']['app.key'];

    if (Str::startsWith($key, 'base64:')) {
        $key = base64_decode(substr($key, 7));
    }

    $connection = isset($config['connection']) ? $config['connection'] : null;

//        return new DatabaseTokenRepository(
    return new ForgotPasswordHelperRepository(
        $this->app['db']->connection($connection),
        $this->app['hash'],
        $config['table'],
        $key,
        $config['expire']
    );
}
}

接下来,只需将以下内容复制并粘贴到AppServiceProvider@register方法中。
  $this->app->singleton('auth.password', function ($app) { return new    PasswordBrokerManagerHelper($app); });
  $this->app->bind('auth.password.broker', function ($app) { return $app->make('auth.password')->broker(); });

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接