我正在尝试使用Laravel 5实现我的第一步,实现一个基本的帮助台应用程序,其主要模型是Ticket和Message。
我首先使用此路由定义了在现有故障单中添加新消息的端点:
Route::post('tickets', 'TicketsController@store');
TicketsController中的store()方法:
/**
* 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('TicketsController@show', $request->get('ticket_id'));
}
请注意,在这种情况下,两个模型都通过messages()方法定义了一对多关系。这没有任何问题。但后来我意识到这种资源方法更适合创建一个全新的票证,而不是票证消息。
因此,当有人发送表单来创建新的票证消息时,这就是我定义的路径:
Route::post('messages', 'MessagesController@store');
接下来,我将TicketsController :: store()中的所有代码移动到MessagesController :: store(),但后来我收到了这个错误:
MessagesController.php第40行中的FatalErrorException:Class '未找到'App \ Http \ Controllers \ Ticket'
第40行对应于具有票证ID的票证请求。看起来它与Ticket模型没有被加载在这里有关,因为它不按惯例属于这个控制器,并且它在TicketsController中完美地工作。我虽然不确定。
我应该怎么做才能在MessagesController中使用Ticket模型?
答案 0 :(得分:1)
由于Laravel 5 +中添加了namespacing
,这种情况发生了很多。
您可以选择一些方法来解决此问题。首先,use
声明:
use App\Ticket;
将此内容包含在TicketsController
的类声明中,可以在不发出问题的情况下调用Ticket::findOrFail()
或任何其他Ticket::
函数。
作为补充说明,请检查yout Ticket.php
文件中的命名空间。默认情况下,模型的名称空间应为:
namespace App;
或者,如果您只想在不同的控制器中使用一次,则可以在函数调用之前指定命名空间。例如:
$ticket = \App\Ticket::where("id", "=", $ticketId)->first();
问题在于,使用命名空间,php正试图在Ticket
中找到一个App\Http\Controllers
类,其中(逻辑上)不应该这样。
希望这有帮助!
答案 1 :(得分:1)
要执行此操作,您可以在控制器顶部导入模型类,如下所示:
use App\Ticket;
您也可以为所有其他模型执行此操作,例如use App\Message
。
你的另一个选择是在调用它时引用正确的命名空间,就像这样; \App\Ticket::where()
。