我在使用Laravel创建一些基本过滤时遇到问题

ezykj2lf  于 2022-12-24  发布在  其他
关注(0)|答案(3)|浏览(136)

我的索引页面显示了我的图片表中的所有图片,最新提交的图片在顶部。我试图添加一些基本的过滤功能,以便我能够理解这个概念,但我做错了一些事情。我的想法是:
添加2个<a>元素,其URL分别为www.domain.comwww.domain.com/ascending,如果用户转到www.domain.com,则图像将按降序显示,如果用户转到www.domain.com/ascending,则图像将按升序显示。
然后,我使我的主路径Route::get('/', 'PagesController@index')->name('home');具有可选参数,如Route::get('/{filter?}', 'PagesController@index')->name('home');
根据可选参数,我将向视图发送不同的$images变量:

public function index($filter){    
    switch($filter) {
        case 'ascending'    : $images = Image::orderBy('created_at', 'asc')->get();break;
        default             : $images = Image::orderBy('created_at', 'desc')->get();
    }

    return view('home', ['images' => $images]);
}

当我这样做的时候,到目前为止我得到了2个问题:
首先,当我转到www.domain.com时,我得到"Type error: Too few arguments to function App\Http\Controllers\PagesController::index(), 0 passed and exactly 1 expected"
其次,在将可选参数添加到路由Route::get('/{filter?}', 'PagesController@index')->name('home');之后,即使我要访问像http://example.com/adminhttp://example.com/albums这样的URL,我也会被发送到我的索引页面。
我认为这是因为我的代码假设/admin/albumshttp://example.com url中的可选参数,而不是一个单独的url。

Route::get('/{filter?}', 'PagesController@index')->name('home');
Route::get('/image/{id}', 'PagesController@specificImage')->name('specificImage');
Route::get('/tags', 'PagesController@tags')->name('tags');

所以即使我转到标记路径,也会显示索引视图而不是标记视图。

r7knjye2

r7knjye21#

您可以通过www.example.com执行此www.domain.com?orderby=asc

Route::get('/', 'PagesController@index')->name('home');

public function index(Request $request){

  $images = array();

  $images = Image::orderBy('created_at', $request->get('orderBy') ?? 'desc')->get();

  return view('home', ['images' => $images]);
}
hc8w905p

hc8w905p2#

我建议在这种情况下使用get params来避免url冲突。
/?order=asc/?order=desc
而是切换GetParamorder以知道是以降序还是升序显示页面。

p3rjfoxz

p3rjfoxz3#

首先,在这种情况下,使用query参数进行过滤比使用两个(或更多)url端点效果更好。
但是,如果您想坚持您的实现,有几件事要做:
1.声明路线时不要使用斜杠,例如:

Route::get('{filter?}', 'PagesController@index')->name('home')

虽然不是很确定这有什么不同,但我个人要注意的是(到处都是斜线)
1.通过在route声明后使用where(),使用具有受限值的可选路径变量:

Route::get('{filter?}', 'PagesController@index')->name('home')->where('filter', 'ascending|');

它接受提升或者什么都不接受。
1.将默认参数传递给控制器方法:

public function index($filter = null)
{
    .....
}

以防万一没有传递任何东西。这是使用可选路径变量时需要注意的要点之一。
最后,您可以完全避免if语句,方法是在进行查询之前使用Ternary运算符:

public function index($filter = null){    
    $order = $filter === 'ascending' ? 'asc' : 'desc';

    $images = Image::orderBy('created_at', $order)->get();

    return view('home', ['images' => $images]);
}

相关问题