В моем проекте laravel у меня есть следующие интерфейс, репозиторий и контроллер.
Это интерфейс
interface TrainingClassTypeInterfaces
{
public function updateTrainingClassType($id, $request);
}
Это репозиторий
use App\Models\Trainings\AppTrainingClassType;
class TrainingClassTypeEloquent implements TrainingClassTypeInterfaces
{
protected $model;
public function __construct(AppTrainingClassType $appTrainingClassType)
{
$this->model = $appTrainingClassType;
}
public function updateTrainingClassType($id, $request)
{
$response = false;
$isUpdated = $this->model::where('training_class_id',$id)->update([
'app_id' => $request->app_id
]);
....
}
}
Это контроллер
class TrainingClassTypesController extends \TCG\Voyager\Http\Controllers\VoyagerBaseController
{
protected $trainingService;
public function __construct(TrainingClassTypeEloquent $trainingClassTypeInterfaces) {
$this->trainingService = $trainingClassTypeInterfaces;
}
public function insertOrUpdate()
{
...
$this->trainingService->updateTrainingClassType($id, $request);
..
}
}
Здесь все работает нормально
Как видите, я использую метод TrainingClassTypeEloquent внутри TrainingClassTypesController
. Но он возвращал ошибку вроде
Argument 1 passed to ...::__construct() must be an instance of
В основном он просил меня поместить экземпляр модели в класс TrainingClassTypeEloquent
. Затем я сделал следующее
$TCTypes = new AppTrainingClassType();
$TCT = new TrainingClassTypeEloquent($TCTypes);
$TCT->updateTrainingClassType($id, $request);
, который работал нормально, но я был смущен тем, что этот подход неправильный, должен быть какой-то правильный способ.
После поиска в Google я нашел другое решение, которое является одноэлементная привязка, а затем я попытался выполнить в AppServiceProvider
$this->app->singleton(
\App\Services\Voyager\Eloquent\TrainingClassType\TrainingClassTypeInterfaces::class,
\App\Services\Voyager\Eloquent\TrainingClassType\TrainingClassTypeEloquent::class
);
После добавления этой одноэлементной привязки я заметил, что скрипт работал без предоставления экземпляра модели в класс TrainingClassTypeEloquent
.
Я хотел бы знаю, как работает $this->app->singleton()
, так что таким образом моя концепция будет прояснена. Если кто-то знает, пожалуйста, расскажите мне об этом.
Большое спасибо