Я создал 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, который разрешает классы.
Просветите меня..
Кажется, у вас есть проблемы в создании экземпляров 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 должен вызывать конструктор правильно под капотом.
Пожалуйста, удалите псевдоним и попробуйте
Не уверен, есть ли необходимость добавлять псевдоним, так как вы хотите ввести
use Carbon\Carbon;
class MyClass{
protected $today;
public function __construct(Carbon $carbon){
$this->today = $carbon->now();
}
}