我有一个用户雄辩的模型,在其构造函数中接受UserMailer类的实例,但是我收到此错误
Argument 1 passed to User::__construct() must be an instance of TrainerCompare\Mailers\UserMailer, none given, called in /var/www/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php on line 631 and defined
我理解错误,但无法弄清楚我做错了什么,但我不会很好地了解命名空间和作曲家类地图vs psr0自动加载。我记得使用composer dump-autoload所以它不是那个
相关文件夹结构
composer.json
app/
models/
User.php
TrainerCompare/
Mailers/
Mailer.php
UserMailer.php
Services/
Validation/
composer.json自动加载部分。 psr-0部分是从我添加验证服务时可以看到的,你可以在TrainerCompare /中看到这些类很有用。我按照下面的教程将app / TrainerCompare / Mailers添加到了类图中,以便加载邮件程序类
"autoload": {
"classmap": [
"app/commands",
"app/controllers",
"app/models",
"app/database/migrations",
"app/database/seeds",
"app/tests/TestCase.php",
"app/tests/helpers",
"app/TrainerCompare/Mailers"
],
"psr-0":{
"TrainerCompare": "app/"
}
}
user.php的
<?php
use Illuminate\Auth\UserInterface;
use Illuminate\Auth\Reminders\RemindableInterface;
use TrainerCompare\Mailers\UserMailer as Mailer;
class User extends BaseModel implements UserInterface, RemindableInterface
{
protected $mailer;
public function __construct(Mailer $mailer)
{
$this->mailer = $mailer;
}
}
Mailer.php
<?php namespace TrainerCompare\Mailers;
use Mail;
/**
* Email mailing class
*/
abstract class Mailer
{
public function __construct()
{
# code...
}
public function sendTo($user, $subject, $view, $data = [])
{
Maill::send($view, $data, function ($message) use ($user, $subject) {
$message->to($user->email)
->subject($subject);
});
}
}
UserMailer.php
<?php namespace TrainerCompare\Mailers;
use User;
/**
* User Mailer Class
*/
class UserMailer extends Mailer
{
public function __construct()
{
# code...
}
public function welcome($user)
{
$view = 'emails.users.welcome';
$data = [];
$subject = 'Welcome to Laracsts';
return $this->sendTo($user, $subject, $view, $data);
}
}
答案 0 :(得分:5)
Eloquent(重新)通过调用内部创建自己:
new static
一个例子是创建一个新查询:
return with(new static)->newQuery();
我不确定在这种情况下自动依赖项解析是否有效,它应该始终在laravel中工作,但是因为它也有自己的构造方法,所以你必须至少转发一个调用它并支持$attribute
参数:
public function __construct(array $attributes = array(), Mailer $mailer)
{
$this->mailer = $mailer;
parent::__construct($attributes);
}
修改强>
打开一个问题来理解它:https://github.com/laravel/framework/issues/3862
编辑2
正如我在评论中所说,你最好创建一项服务,正如你自己所指出的,是一种更好的应用程序设计。您不应该使用您的模型发送电子邮件。接收用户模型(或只是名称和电子邮件)并将消息发送给该用户的服务将是更好的方式。
泰勒奥特威尔在这个问题上给出的答案:
模型并不意味着以这种方式将依赖注入其中。 我想,只是ActiveRecord风格ORM的风格。 我建议将用户传递给Mailer类或类似的东西。 或者,如果您对它感到满意,可以使用App :: make来获取实例 来自模型实例的邮件,特别是如果您只需要该依赖项 从单一方法。