在默认的用户注册方法中(RegisterController@create)使用依赖注入报错

  • laravel 6.4
  • php 7.3

我想在用户注册的时候生成默认的头像,所以用了 Identicon 这个生成头像开源项目。并且参考 laravel-identicon 添加了 ServiceProvider 以及 Facade。

我在其他控制器中可以这样正常注入,但是不知道为什么在这个 create 方法里会报一个这样的错:

Symfony\Component\Debug\Exception\FatalThrowableError

Argument 1 passed to App\Http\Controllers\Auth\RegisterController::create() must be an instance of Identicon\Identicon, array given

User::create() 方法怎么就变成需要 Identicon 实例了呢?

以下是 create 方法主要源码:

# app/Http/Controllers/Auth/RegisterController.php
protected function create(Identicon $identicon, array $data) {
    .
    .
    $user = User::create([
            'name'     => $data['name'],
            'email'    => $data['email'],
            'password' => Hash::make($data['password']),
        ]);
    $base64_img = $identicon->getImageData($data['email'], 100, null,'#f0f0f0', 10);
    .
    .
}

ServiceProvider 以及 Facade 完整源码:

# app/Providers/IdenticonServiceProvider.php
class IdenticonServiceProvider extends ServiceProvider {
    protected $defer = false;
    public function register() {
        $method = version_compare(Application::VERSION, '5.2', '>=') ? 'singleton' : 'bindShared';
        $this->app->$method(Identicon::class, function ($app) {
        return new Identicon;
        });
    }
    public function provides() {
        return ['identicon'];
    }
}

# app/Facades/Identicon.php
class Identicon extends Facade {
    protected static function getFacadeAccessor() {
        return 'identicon';
    }
}

这样是可以运行通过的:

public function test(Identicon $identicon)
{
    $url = $identicon->getImageDataUri('blahblah', 150, null, '#f0f0f0', 10);
    return "<img src='$url' style='border-radius: 50%'>";
}

如果有谁有思路的话可以提示一下吗,User::create() 方法为啥会报错呀?

《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
最佳答案

User::create () 方法怎么就变成需要 Identicon 实例了呢?

现在给出的报错信息是

Argument 1 passed to App\Http\Controllers\Auth\RegisterController::create() must be an instance of Identicon\Identicon, array given

这不是 RegisterController::create() 的错误吗?应该跟 User::create() 没关系吧?

Illuminate\Routing\Router 中得知,自带路由中注册的时候会调用 register

file

Auth\RegisterController@register 中,使用了 trait RegistersUsers , 从里面的 register 可以看到,会调用 create 并且参数为 $request->all() , 而 $request->all() 必然为一个 array

file

希望可以给到帮助

2个月前 评论
WuChienKun (楼主) 2个月前
讨论数量: 4

RegisterController中的create()方法的第一个参数就是Identicon对象

2个月前 评论

难道不是array $data 的问题么。

2个月前 评论
leo

create() 方法是 protected?那是你自己手动调用的吧

2个月前 评论

User::create () 方法怎么就变成需要 Identicon 实例了呢?

现在给出的报错信息是

Argument 1 passed to App\Http\Controllers\Auth\RegisterController::create() must be an instance of Identicon\Identicon, array given

这不是 RegisterController::create() 的错误吗?应该跟 User::create() 没关系吧?

Illuminate\Routing\Router 中得知,自带路由中注册的时候会调用 register

file

Auth\RegisterController@register 中,使用了 trait RegistersUsers , 从里面的 register 可以看到,会调用 create 并且参数为 $request->all() , 而 $request->all() 必然为一个 array

file

希望可以给到帮助

2个月前 评论
WuChienKun (楼主) 2个月前

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!