#laravel #repository #laravel-livewire
#laravel #репозиторий #laravel-livewire
Вопрос:
В laravel-livewire / project мне нужно использовать репозитории. Я нашел библиотеку https://github.com/andersao/l5-repository и посмотрите на пример, как назначить репозиторий PostsController
namespace AppHttpControllers;
use AppPostRepository;
class PostsController extends BaseController {
protected $repository;
public function __construct(PostRepository $repository){
$this->repository = $repository;
}
....
}
Я пытаюсь сделать подобное с компонентом :
use AppRepositoriesInterfacesFacilityRepositoryInterface;
class Facilities extends Component
{
use WithPagination;
public $form= [
'name'=>'',
'descr'=> '',
'created_at'=> '',
'is_reopen' => false,
];
public $current_facility_id;
public $filter_name= '';
public $updateMode = 'browse';
protected $FacilityRepository;
public function __construct(FacilityRepositoryInterface $FacilityRepository)
{
$this->FacilityRepository = $FacilityRepository;
}
public function render()
{
$backend_per_page = Settings::getValue('backend_per_page', CheckValueType::cvtInteger, 20);
$this->emit('facility_opened', [ 'mode'=>'browse', 'id'=>null ] );
return view('livewire.admin.facilities.container', [
'facilityDataRows' => $this->FacilityRepository->filterWithPagination(
[
'name'=>$this->filter_name,
'per_page'=> $backend_per_page
]
),
'facility_rows_count'=> $this->facility_rows_count
]);
}
где filterWithPagination — это метод
class FacilityRepository extends BaseRepository implements FacilityRepositoryInterface
{
private $UserRepository;
...
I found definition of __construct in in vendor/livewire/livewire/src/Component.php as :
public function __construct($id)
{
$this->id = $id;
$this->ensureIdPropertyIsntOverridden();
$this->initializeTraits();
}
Есть ли действительный способ?
Спасибо!
Ответ №1:
У меня также были те же проблемы. Я думаю, что livewire в настоящее время не поддерживает внедрение зависимостей. Что вы можете сделать прямо сейчас, так это внедрить свой репозиторий в метод монтирования.
public function mount(FacilityRepositoryInterface $FacilityRepository)
{
$this->FacilityRepository = $FacilityRepository;
}
Ответ №2:
Предполагается, что вы используете mount
метод для внедрения зависимостей
Так что это должно сработать
class Facilities extends Component {
public function mount(FacilityRepositoryInterface $FacilityRepository) {
$this->FacilityRepository = $FacilityRepository;
}
}
Смотрите документы:https://laravel-livewire.com/docs/rendering-components#injecting-parameters
Ответ №3:
Если для вашего действия требуются какие-либо службы, которые должны быть разрешены с помощью контейнера для внедрения зависимостей Laravel, вы можете перечислить их в подписи действия перед любыми дополнительными параметрами
public function addTodo(TodoService $todoService, $id, $name)
{
...
}