Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Koflikt sygnatury Trait i Klasy
Forum PHP.pl > Forum > PHP > Object-oriented programming
markonix
Klasa rodzica ma metodę response() i ma ją też trait, niestety sygnatury (i także treść metody są zupełnie różne).
Dziecko dziedziczy po rodzicu i używa trait i powoduje to problem:"
Cytat
Declaration of Dingo\\Api\\Routing\\Helpers::response() should be compatible with Optimus\\Bruno\\LaravelController::response($data, $statusCode = 200, array $headers = Array)

Jak się można domyśleć po przestrzeniach nazw nie mam możliwości ingerencji bezpośrednio w kod tych klas.
Da się to jakoś zgrać? Niestety use + insteadof tu nie zadziałało bo można to użyć tylko dla Trait.
Xelah
A możesz trochę więcej szczegółów podać? O co w ogóle chodzi? Dlaczego takie rozwiązanie? Jak to się stało, że masz trait (bo to ty go dodajesz do klasy, jak mniemam), który ma inną sygnaturę niż klasa, w której chcesz go używać?

Jaki problem w ogóle próbujesz rozwiązać? Bo podałeś tylko objawy bez jakiegokolwiek kontekstu.
Pyton_000
Mnie to wygląda jak błąd samych klas i problemu z paczkami.
markonix
Mam mój kontroler ApiBaseController który ma dziedziczyć po:
https://github.com/esbenp/bruno/blob/master...lController.php
natomiast w moim API korzystam też z biblioteki Dingo, który ma Trait następujący:
https://github.com/dingo/api/blob/master/sr...ing/Helpers.php

Kontekst jest taki, że korzystam z Dingo, i chciałem dodać "queries" do mojego RESTowego API za pomocą tej małej biblioteki, na którą się składa Trait + BaseController.
To są dwie zupełnie osobne biblioteki stąd kolizja.

Wprawdzie zrezygnowałem z tej biblioteki LaravelController bo okazało się, że biblioteka do repozytoriów, którą już mam w projekcie świetnie sobie radzi.
Problemu więc nie mam ale ciekawość pozostaje czy taki konflikt da się rozwiązać.
Xelah
Nie jestem pewien, czy w 100% zrozumiałem problem, ale może coś takiego?:

  1. class RoutingHelpers
  2. {
  3. use Dingo\Api\Routing\Helpers;
  4.  
  5. public function getRequest()
  6. {
  7. return $this->request();
  8. }
  9. }
  10.  
  11. class MyController extends SomeOtherController
  12. {
  13. private $routingHelpers;
  14.  
  15. public function __construct(RoutingHelpers $helpers)
  16. {
  17. $this->routingHelpers = $helpers;
  18. }
  19. }


Jeśli dobrze rozumiem co chcesz osiągnąć, to powyższy kod rozwiązuje problem. Kontroler nie używa traita tylko inną klasę. Metody traita są wywoływane pośrednio.
Evinek
Ciekawy problem, aż musiałem sam sprawdzić jak to można rozwiązać.

Pierwsza rzecz, którą spróbowałem to użycie "as" aby zmienić nazwę metody z traits.
Niestety to nie pomogło.
Przykład:
https://ideone.com/ddRQZO

Dodałem własną metodę, która używa metody z klasy abstrakcyjnej i wtedy śmiga poprawnie.
Przykład:
https://ideone.com/tL0CoG

Więc jakieś rozwiązanie jest na to choć nie wygląda na jakieś dobre.
Szkoda, że ten pierwszy przykład z samym "as" nie działa.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.