Как добавить репозиторий l5 в проект laravel-livewire?

#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)
    {
        ...
    }
  

https://laravel-livewire.com/docs/2.x/actions