我的索引页面显示了我的图片表中的所有图片,最新提交的图片在顶部。我试图添加一些基本的过滤功能,以便我能够理解这个概念,但我做错了一些事情。我的想法是:
添加2个<a>
元素,其URL分别为www.domain.com
和www.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/admin
或http://example.com/albums
这样的URL,我也会被发送到我的索引页面。
我认为这是因为我的代码假设/admin
和/albums
是http://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');
所以即使我转到标记路径,也会显示索引视图而不是标记视图。
3条答案
按热度按时间r7knjye21#
您可以通过www.example.com执行此www.domain.com?orderby=asc
hc8w905p2#
我建议在这种情况下使用get params来避免url冲突。
/?order=asc
或/?order=desc
而是切换GetParam
order
以知道是以降序还是升序显示页面。p3rjfoxz3#
首先,在这种情况下,使用query参数进行过滤比使用两个(或更多)url端点效果更好。
但是,如果您想坚持您的实现,有几件事要做:
1.声明路线时不要使用斜杠,例如:
虽然不是很确定这有什么不同,但我个人要注意的是(到处都是斜线)
1.通过在route声明后使用
where()
,使用具有受限值的可选路径变量:它接受提升或者什么都不接受。
1.将默认参数传递给控制器方法:
以防万一没有传递任何东西。这是使用可选路径变量时需要注意的要点之一。
最后,您可以完全避免
if
语句,方法是在进行查询之前使用Ternary运算符: