加载控制器内的其他型号

时间:2016-04-22 20:39:06

标签: php laravel laravel-5 eloquent

我正在尝试使用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模型?

2 个答案:

答案 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()