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();
}
Proszę pokazać 'uchwyt()' Metoda zadzwonić w swoim 'NextActionHandler' przypadkach – deefour
@deefour dodałem go dla Ciebie. Jestem prawie pewien, że o to prosiłeś, prawda? – dericcain
Tak. Nic z tego nie wracasz. To jest problem. – deefour