2017-10-01 1 views
0

ich die folgende Funktion subscribe haben zum Ziel:

public function subscribe() { 
    $plans = Configure::read('Stripe.american_plans'); 
    $plans['premium_american_monthly'] = __('Premium Monthly') . ' - 4.99'; 
    $plans['premium_american_annually'] = __('Premium Annually') . ' - 49.99'; 

    if ($this->request->is('post')) { 
     $user = $this->Users->get($this->Auth->user('id')); 

     if ($this->Users->save($user)) { 
      $this->Flash->success(__('Your account has been subscribed')); 
      debug($this->redirect(['controller' => 'Users', 'action' => 'edit'])); 
      die(); 
     } else { 
      $this->Flash->error('User could not be subscribed.'); 
     } 
    } 

    $this->set(compact('plans')); 
} 

ich manipulieren tun, um die Benutzer $ Objekt, bevor ich sie in der eigentlichen Funktion speichern, aber dies ist die einfachste kann ich mach die funktion und lass die seite noch laden und der fehler passiert noch.

Die Debug-Anweisung um die Umleitung zu überprüfen, wo es den Benutzer umgeleitet, und dass ausspuckt:

object(Cake\Http\Response) { 

'status' => (int) 302, 
'contentType' => 'text/html', 
'headers' => [ 
    'Content-Type' => [ 
     (int) 0 => 'text/html; charset=UTF-8' 
    ], 
    'Location' => [ 
     (int) 0 => 'https://localhost/users/subscribe' 
    ] 
], 
'file' => null, 
'fileRange' => [], 
'cookies' => [ 
    'cookies go here' 
    ] 
], 
'cacheDirectives' => [], 
'body' => '' 

} 

Wie Sie es nicht umleiten sehen, wo ich es erwarten. In der Tat, egal was ich in diese Redirect-Anweisung einfüge, es wird immer auf die gleiche Funktion umgeleitet, subscribe.

Ich habe keine Ahnung, was ich falsch mache, da dieser Code mit anderen Funktionen identisch aussieht, die ich richtig funktioniere. Weiß jemand, wie man diese Weiterleitung dorthin bringt, wo ich es umleiten möchte?

+0

'Controller :: redirect()' wird nur den Header 'Location' setzen, wenn er noch nicht gesetzt wurde, also prüfen Sie, wie' $ this-> response' aussieht. Beachten Sie auch, dass 'Controller.beforeRedirect' hier stören kann und die Antwort so ändert, dass 'redirect()' es nicht ändert. – ndm

Antwort

0

Dank @ndm für seinen Kommentar, führte mich zu einer Lösung. Es fühlt sich an wie eine schmutzige Lösung, da ich glaube nicht, dass ich das eigentliche Problem lösen kann, aber es funktioniert. Bevor ich weiterleiten, habe ich Folgendes hinzugefügt:

$url = Router::url(['controller' => Users', 'action' => 'edit']); 
$this->response = $this->response->withLocation($url); 

Das Problem trat auf, weil irgendwo meine Header bereits mit dem falschen Speicherort festgelegt wurden. Ich bin nicht sicher, wo das passiert, da keine unserer anderen Redirect-Logik getroffen wurde, und wir implementieren beforeRedirect nicht überall in unserem Code.

Aber wie gesagt, das funktioniert und löst das Problem.

+0

Ohne die Codebasis zu kennen würde ich immer noch auf das 'Controller.beforeRedirect'-Event setzen, es könnte ein Plugin sein, aber wer weiß. Ich würde vorschlagen, Haltepunkte in 'Response :: location()', 'Response :: withLocation()' und 'MessageTrait :: withHeader()' zu setzen, um herauszufinden, woher die Änderung stammt. – ndm