【问题标题】:Controller parameters via URL or POST通过 URL 或 POST 的控制器参数
【发布时间】:2019-01-09 21:59:59
【问题描述】:

我正在使用 laravel 提供具有以下路线的搜索页面:

Route::get('/search', 'PagesController@search');
Route::get('/search/{q}', 'PagesController@search');
Route::post('/search', 'PagesController@search');

第一个路由处理对应该显示搜索表单的搜索页面的访问。 第二个路由需要 URL 上的一个参数,该参数允许为搜索添加书签。 第三条路由从第一页接收表单作为 POST 并处理搜索。

三个路由中的每一个都尝试使用 PagesController 中的一个函数。

public function search(Request $request)
{
    if ($request->has('q')) {
        $q = $request->input('q');
    }

    if ($q) {
        $models = Model::where('name', 'LIKE', "%{$q}%") 
                ->orderBy('name', 'desc')
                ->take(10)
                ->get();

        return view('pages.search', [ 'models' => $models, 'query' => $q ]);
    }

    return view ('home')->withMessage('No Details found. Try to search again !');       
}

我的问题是如何让单个 Controller 函数来处理三个路由?要从 URL 中传入 {q},我认为我需要向搜索函数添加另一个参数,但这会在没有 {q} 的两条路由上失败。

在这种情况下,是不是每种响应都有一个单独的函数?

【问题讨论】:

    标签: php laravel laravel-5


    【解决方案1】:

    为了保持代码简洁,我建议制作单独的函数。一个用于显示表单,一个用于 POST,一个用于书签。它比 if 分支更容易维护,也更容易阅读。

    但是,如果您愿意,可以直接回答您的问题。只需向方法中添加一个可选参数,如下所示:

    public function search(Request $request, $q = false){}
    

    通过将$q 设置为默认值 false,没有该变量的传入路由将不会失败。它还允许进行简单的 if-check (if($q)...)。

    HTH

    【讨论】:

    • 感谢您的回答,解释了这两个选项。现在真的在踢自己
    • 不——很容易被忽视。很高兴它有帮助!
    • 或者,if($request->has('foo') && ($foo = $request->input('foo')) - 在表达式中赋值,同时检查。然后您可以将其用作$foo - 在本例中。
    猜你喜欢
    • 1970-01-01
    • 2014-02-21
    • 1970-01-01
    • 2017-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多