Внедрение зависимостей: невозможно внедрить класс Carbon в классе custom-helper в приложении laravel

Я создал app\lib папка для хранения моего пользовательского вспомогательного класса. Я добавил его в автозагрузку в composer.json и запустил composer dump-autoload,
Для теста я быстро создал класс MyHelper и попытался создать его экземпляр, и он работал как ожидалось. Пользовательский класс помощника прекрасно загружался.

В моем приложении мне нужно было работать с датами. Поэтому я решил работать с датами с помощью расширения Carbon. Я обнаружил, что это уже было в папке продавца Laravel.
Чтобы было проще, я добавил alias в app.php

'Carbon' => 'Carbon\Carbon'

Ниже мой custom helper class. (Код ниже работает нормально)

class MyHelper{

public $today;

public function __construct(){
$this->today = Carbon::now();
}

В приведенном выше коде я создаю углеродный объект, выполняя Carbon::now(), Это выглядит нормально и работает нормально, но, насколько я знаю, лучше делать внедрение зависимостей, чем создавать экземпляры внутри метода construct. Это сделает тестирование более простым.

Таким образом, я изменил выше метод конструирования, как показано ниже:

public function __construct(Carbon $carbon){
$this->today = $carbon->now();
}

Но приведенный выше код не работает. И сообщение об ошибке говорит мне, что аргумент метода конструкции должен быть экземпляром Carbon \ Carbon.

Аргумент 1, передаваемый в Date :: __ construct (), должен быть экземпляром
Углерод \ Углерод, никто не дал

Я также добавил use Carbon\Carbon as Carbon но не радость Я думаю, что я неправильно понимаю некоторую простую логику Laravel. Может быть недоразумение с внедрением зависимости или IOC, который разрешает классы.

Просветите меня..

1

Решение

Кажется, у вас есть проблемы в создании экземпляров MyHelper, Убедитесь, что вы передаете Carbon вашему конструктору. Я полагаю, у вас есть что-то вроде

$myHelper = new MyHelper();

Тем не менее, ваш конструктор ожидает Carbon параметр. При условии, что $carbon это Carbon Например, вы можете сделать что-то вроде:

$myHelper = new MyHelper($carbon);

РЕДАКТИРОВАТЬ:
Laravel имеет Inversion of control, который используется следующим образом:

class FooBar {

public function __construct(Baz $baz)
{
$this->baz = $baz;
}

}

$fooBar = App::make('FooBar');

(взято из Вот)

make необходимо использовать метод вместо вызова конструктора чистого PHP. Laravel должен вызывать конструктор правильно под капотом.

2

Другие решения

Пожалуйста, удалите псевдоним и попробуйте
Не уверен, есть ли необходимость добавлять псевдоним, так как вы хотите ввести

use Carbon\Carbon;

class MyClass{

protected $today;

public function __construct(Carbon $carbon){
$this->today = $carbon->now();
}

}
0

По вопросам рекламы [email protected]