Laravel 5.2 从控制器返回视图

Posted

技术标签:

【中文标题】Laravel 5.2 从控制器返回视图【英文标题】:Laravel 5.2 Returning View from a controller 【发布时间】:2016-08-14 10:12:40 【问题描述】:

我在子目录“admin”中定义了一个视图,它是一个编辑表单。提交后,它会使用以下代码传递给控制器​​:

class ThisSiteController extends Controller

    public function updateSite(Request $request)
    
        $thissite = DB::table('this_site')->where('id',1)->get();
        $thissite->headline = $request->headline;
        $thissite->save();  
        return view('admin.editfront')->with('site', $thissite);
    ;

它正在更新一个标题,但我总是得到

NotFoundHttpException in RouteCollection.php line 161:

虽然调用编辑的路由是(并且工作正常):

Route::get('/admin/editfront', function() 
    $thissite = DB::table('this_site')->where('id',1)->get();
    return view('admin.editfront')->with('site', $thissite);
);

【问题讨论】:

是的。数据库更新正常。是调用视图的行给出了错误。 不 - 我只是从表单中调用控制器方法。 @Jim 你什么时候收到这个错误?提交表单之后还是之前? 像这样返回视图 ... return view('admin.editfront' , ['site' => $thissite]); 【参考方案1】:

如果您要提交表单,请确保路由使用的是 post。

Route::post('/admin/editfront', 'ThisSiteController@updateSite');

如果这不是问题,您能否显示您的表单代码和更新路径?

编辑

class ThisSiteController extends Controller

    public function updateSite(Request $request)
    
        DB::table('this_site')
            ->where('id',1)
            ->update(['headline' => $request->input('headline')]);
        $thissite = DB::table('this_site')->where('id',1)->first();
        return view('admin.editfront')->with('site', $site);
    ;

【讨论】:

我已将表单更改为
但我仍然收到错误
抱歉错字。 Fiorm 现在是表单 id="form1" method="post" action="/admin/editf‌​ront"> 我现在在 ThisSiteController.php 第 16 行收到“ErrorException:尝试获取非对象的属性” " 当引用 $thissite->headline = $request->headline;. 那是因为get() 返回一个结果数组。使用find(1)$thissite[0]->headline 做到了。现在我在 ThisSiteController.php 第 18 行有 FatalErrorException:调用数组上的成员函数 save() 再一次,$thissite 是一个数组,$thissite[0]->save() 如果您想保存该模型,但最好使用first()find() 方法【参考方案2】:

我建议您也将编辑操作移至控制器方法,以下对 updateSite 方法的更改将解决更新问题。如果你使用了模型会简单得多。

class ThisSiteController extends Controller

  public function updateSite(Request $request)
    $thissite = DB::table('this_site')->where('id',1)->update(['headline' => $request->get('headline')]);

    return view('admin.editfront',['site' => $thissite]);
  

  public function editSite()
    $thissite = DB::table('this_site')->where('id',1)->first();
    return view('admin.editfront',['site' => $thissite]);
  

还将editfront路由路由到ThisSiteController@editSite方法。

对于表单操作,您可以使用action=" action('ThisSiteController@editSite') "

【讨论】:

【参考方案3】:

您在路由中使用 get 请求,这可能会导致问题。

如果您在表单中使用 POST 方法,请将您的路线更改为:

Route::post('/admin/editfront',ThisSiteController@updateSite);

如果你能显示整个错误信息或路由文件会非常有用。

【讨论】:

以上是关于Laravel 5.2 从控制器返回视图的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 5.2控制器返回一个对象

未找到 Laravel 视图 5.2

如何从 laravel 5.2 中的网站提取 API? [关闭]

Api 调用 Laravel 8 后如何从控制器返回视图?

Laravel:我正在尝试将变量从视图传递到控制器,但它返回 null

如何通过 post 方法将数据从 ajax 传递到 laravel 5.2 控制器