2016-12-22 8 views
5

OK, trzymaj się mnie tutaj. Mam proces, który muszę wykonać, i istnieje kilka stwierdzeń, które zepsułem na mniejsze klasy zamiast jednego brzydkiego przełącznika lub instrukcji else/else. Zasadniczo nazywam metodę obsługi klasy, która określa, gdzie jesteśmy w procesie, tworzy instancję odpowiedniej klasy, która następnie buduje potrzebną kolekcję i zwraca ją.Uzyskanie wartości pustej przy użyciu cechy, ale var_dump w klasie zwraca poprawne dane

Mam model, w którym próbuję uzyskać nextAction dla tego konkretnego rekordu. Numer nextAction będzie zawierał nazwę, datę, godzinę i klucze trasy zwrócone jako kolekcja. Oto metoda w moim modelu FreeLook.php:

public function nextAction() 
{ 
    // handle basically just calls a handle method on the NextActionHandler class. 
    return handle(new NextActionHandler($this)); 
} 

Klasa NextActionHandler domyśla się, gdzie jesteśmy w procesie. Czyni to za pomocą cechy, którą utworzyłem pod nazwą Actionable. Oto klasa NextActionHandler:

class NextActionHandler 
{ 
    use Actionable; 

    protected $freeLook; 

    public function __construct($freeLook) 
    { 
     $this->freeLook = $freeLook; 
    } 


    public function handle() 
    { 
     switch (true) { 
      case $this->wantsSign() && !$this->signJobIsComplete(): 
       return handle(new SignNextAction($this->freeLook)); 
      case $this->wantsPaint() && !$this->paintJobIsComplete(): 
       return handle(new PaintNextAction($this->freeLook)); 
      case $this->needsToSubmitCoOp(): 
       return handle(new CoOpNextAction($this->freeLook)); 
      default: 
       return handle(new DefaultNextAction($this->freeLook)); 
     } 
    } 
} 

Oto niektóre cechy Actionable. Nie umieszczam tego wszystkiego tutaj, ponieważ jest naprawdę długi. Zawiera wiele logiki, aby dowiedzieć się, gdzie jesteśmy w trakcie. Należy zauważyć, że zawiera ona logikę, aby zbudować wyjście z kolekcji, którą wracam. (Jeśli chcesz pełny kod Actionable, przejdź here)

protected function needToChooseVendor() 
    { 
     $this->name = 'Choose Vendor'; 
     $this->duration = $this->freeLook->status->expected_duration; 
     $this->calculateTimeRemaining(); 

     return $this->buildOutput(); 
    } 

    protected function calculateTimeRemaining() 
    { 
     if ($this->duration) { 
      $this->timeRemaining = Carbon::now()->diffInDays($this->date); 
     } 
    } 

    protected function buildOutput() 
    { 
     return collect([ 
      'name' => $this->name, 
      'date' => $this->date, 
      'timeRemaining' => $this->timeRemaining, 
      'route' => $this->route, 
     ]); 
    } 

I wreszcie moja DefaultNextAction klasy, który również wykorzystuje cechę w celu skonstruowania wyjście i odesłać go.

class DefaultNextAction 
{ 

    use Actionable; 

    public function __construct($freeLook) 
    { 
     $this->freeLook = $freeLook; 
     $this->date = $freeLook->next_action_at; 
    } 

    public function handle() 
    { 
     return $this->returnDefaultNextAction(); 
    } 

    protected function returnDefaultNextAction() 
    { 
     $this->name = $this->freeLook->status->name; 
     $this->duration = $this->freeLook->status->expected_duration; 
     $this->calculateTimeRemaining(); 
     $this->output = $this->buildOutput(); 

     return $this->output; 
    } 
} 

Więc kiedy zrobić zrzut & umrzeć w metodzie returnDefaultNextAction, uzyskać oczekiwane rezultaty. Ale kiedy porzucam i giną w moim modelu, zawsze otrzymuję null. Jaki byłby tego powód? Ponieważ używam cechy i cech nie można utworzyć, myślałem, że mam do czynienia z tą samą instancją obiektu i wszystkie powinny działać.

Wszelkie pomysły byłyby bardzo pomocne!

EDIT 1 Oto metoda handle Używam owinąć wokół wszystkich moich obiektów.

if (!function_exists('handle')) { 
    function handle($object) 
    { 
     if (!is_object($object)) { 
      throw new Exception('An object must be passed to the handle method. This is not what happened.'); 
     } 

     call_user_func([$object, 'handle']); 
    } 
} 

EDIT 2 Nawet jeśli zgłoszę moją metodę uchwytu tak jak w moim modelu, mam ten sam null wynik:

public function nextAction() 
{ 
    $nextAction = new NextActionHandler($this); 

    return $nextAction->handle(); 
} 
+0

Proszę pokazać 'uchwyt()' Metoda zadzwonić w swoim 'NextActionHandler' przypadkach – deefour

+0

@deefour dodałem go dla Ciebie. Jestem prawie pewien, że o to prosiłeś, prawda? – dericcain

+0

Tak. Nic z tego nie wracasz. To jest problem. – deefour

Odpowiedz

2

Twoja funkcja handle nie zwraca niczego. Musi być

if (!function_exists('handle')) { 
    function handle($object) 
    { 
     if (!is_object($object)) { 
      throw new Exception('An object must be passed to the handle method. This is not what happened.'); 
     } 

     return call_user_func([$object, 'handle']); 
    } 
} 
Powiązane problemy