2016-04-22 8 views
0

Ich versuche zu experimentieren und meine ersten Schritte mit Laravel 5 eine grundlegende Helpdesk-App implementieren, deren Hauptmodelle sind Ticket und Nachricht.Loading andere Modelle in Controller

I definiert zunächst den Endpunkt für die Hinzufügung einer neuen Nachricht in einem bestehenden Ticket mit dieser Route:

Route::post('tickets', '[email protected]'); 

und dem Speicher() -Methode innerhalb TicketsController:

/** 
    * Store a newly created resource in storage. 
    * 
    * @param \Illuminate\Http\Request $request 
    * @return \Illuminate\Http\Response 
    */ 
    public function store(Request $request) 
    { 
     $messageTxt = $request->get('message'); 
     $ticket = Ticket::findOrFail($request->get('ticket_id')); 
     $message = new Message(); 
     $message->text = $messageTxt; 
     $ticket->messages()->save($message); 
     return Redirect::action('[email protected]', $request->get('ticket_id')); 
    } 

Beachten Sie, dass beide Modelle haben eine Eins-zu-Viele-Beziehung, die in diesem Fall durch die Methode messages() definiert wird. Dies funktionierte ohne Probleme. Aber dann erkannte ich, dass diese Ressourcenmethode besser geeignet wäre, ein brandneues Ticket zu erstellen, keine Ticketnachricht.

Also, wenn jemand das Formular sendet eine neue Ticket-Nachricht zu erstellen, ist dies der Weg, den ich stattdessen definiert ist:

Route::post('messages', '[email protected]'); 

Next I in TicketsController :: Shop der gesamten Code oben bewegt(), um MessagesController :: store(), aber dann bekam ich diesen Fehler:

Zeile 40 entspricht der Anfrage für das Ticket mit der Ticket-ID. Es sieht so aus, als ob es etwas damit zu tun hat, dass das Ticket-Modell hier nicht geladen wird, da es per Konvention nicht in diesen Controller gehört und in TicketController perfekt funktioniert. Ich bin jedoch nicht so sicher.

Was soll ich tun, um das Ticket-Modell innerhalb des Nachrichtencontrollers verwenden zu können?

Antwort

1

Dies passiert viel aufgrund namespacing in Laravel 5+ hinzugefügt.

Sie haben ein paar Optionen, um dies zu beheben. Zunächst wird eine use Aussage:

use App\Ticket; 

Einschließlich dies in der Klassendeklaration für TicketsController Willen erlaubt Ticket::findOrFail() oder jede andere Ticket:: Funktion ohne Probleme aufgerufen werden.

Als eine zusätzliche Notiz, überprüfen Sie den Namespace in Ihrem Ticket.php Datei. Standardmäßig sollte ein Modell Namespace sein:

namespace App; 

Alternativ, wenn Sie nur eine einzige Verwendung in einem anderen Controller sagen möchten, können Sie den Namespace vor dem Funktionsaufruf angeben können. Zum Beispiel:

$ticket = \App\Ticket::where("id", "=", $ticketId)->first(); 

Das Problem ist, dass mit Namespacing, php eine Ticket Klasse in App\Http\Controllers zu finden versucht, die (logisch) es sollte nicht sein.

Hoffe, das hilft!

+0

Danke für Ihre Hilfe. Ich habe getan, was Sie gesagt haben, aber es wirft auch den Fehler mit Nachricht und sogar mit Redirect. Warum passiert das hier und nicht in der anderen Steuerung? –

+0

Jetzt sehe ich, ich muss es auch mit Message tun, genau wie ich in TicketsController. –

+0

Jetzt funktioniert es. Vielen Dank! –

1

Um dies zu tun, Sie die Modellklasse an der Spitze der Controller wie so importieren:

use App\Ticket;

Sie können dies für alle anderen Modelle auch, z use App\Message.

Ihre andere Option besteht darin, einfach auf den richtigen Namespace zu verweisen, wenn Sie ihn aufrufen, so; \App\Ticket::where().

Verwandte Themen