Laravel 5路由分页URL编码问题

5
我建立了一个 Laravel 5 应用程序,现在正在测试它如何处理不同的输入。因此,我遇到了一个奇怪的问题。在标题中,我有一个搜索字段,返回每页10个结果。如果用户输入英文字母,例如“e”,一切正常。然而,当用户输入保加利亚语字母“е”时,第一页结果正确显示,但当用户点击第二页时,搜索框中的查询从保加利亚语字母“е”变为“%D0%B5”,不再显示结果。这是网站的实际链接:http://podobri.eu
我猜测这与编码有关,但我看不出我的错误在哪里。
以下是实际代码:
路由
Route::get('/search', [
   'uses' => '\Podobri\Http\Controllers\SearchController@getResults',
    'as'=>'search.results',
]);

搜索控制器

public function getResults(Request $request){

        $query = $request->input('query');
        $comments = Comment::where(function($query){
           return $query; 
        })->orderBy('created_at', 'desc')->get();

        if(!$query || $query==''){
            return view('problems.index')->with('comments', $comments);
        }

        $problems = Problem::where(DB::raw("CONCAT(problem_title, ' ', problem_description)"), 'LIKE', "%$query%")
                ->orWhere('location', 'LIKE', "%$query%")
                ->orWhere('category', 'LIKE', "%$query%")
                ->orderBy('created_at', 'desc')->paginate(10);

        Carbon::setLocale('bg');
        return view('search.results')
                ->with('comments', $comments)
                ->with('problems', $problems)
                ->with('title', 'Резултати за "'."$query".'" | Подобри')
                ->with('description', 'Резултати за "'."$query".'" в системата на Подобри');
    }

查看

        @foreach($problems as $problem)
           <div>
              @include('problems.partials.problemblock')
           </div>
        @endforeach

        <!-- Paginating-->
        {!! $problems->appends(Request::except('page'))->render() !!}

搜索表单
<form action="{{ route('search.results') }}" role="search" class="navbar-form navbar-left head-form-responsive">
                    <div class="form-group">
                        <input type="text" required id='searchQuery' title="Търсете за проблеми" value="{{ Request::input('query') }}" name="query" class="form-control"
                               placeholder="Търсете за проблеми"/>
                    </div>
                    <button type="submit" id='searchBtn' class="btn btn-default">Търсете</button>
                </form>

当您访问页面2时,是否使用相同的操作方法处理数据? - Yehia Awad
我不太清楚你的意思。我是否做了一些被认为是不好的实践呢? - festiv
不,我的意思是这个方法 getResults() 是用来跳转到 page2 的那个方法吗? - Yehia Awad
你尝试过将 $query = $request->input('query'); 更改为 $query = urldecode($request->input('query')); 吗? - phaberest
1
我可以替他回答,是的 @яша,就是这样。Laravel分页是在URL末尾添加&page=X - phaberest
感谢您的反馈。我已经标记了一个答案为正确答案。 - festiv
2个回答

5

我认为您遇到的问题是由于分页器附加了一些奇怪的重定向和尾随斜杠导致的(不确定您是否使用自定义htaccess)。例如,如果您搜索e,则URL如下:

http://podobri.eu/search?query=e

然而,第二页的网址是这个:
http://podobri.eu/search/?query=e&page=2

请注意?query前面的斜杠。如果删除该斜杠,则可以正常工作。那么,你该如何解决这个问题呢?
这个问题在几个月前就已经被修复了。你可以在这里看到这个提交记录:https://github.com/laravel/framework/commit/806fb79f6e06f794349aab5296904bc2ebe53963 因此,如果你正在使用L5.1或5.2版本,你可以运行composer update,它会自动修复。但是,如果你正在使用5.0版本,似乎仍然存在这个错误,所以你可以使用setPath方法并尝试以下方式解决该问题:
{!! $problems->setPath('')->appends(Request::except('page'))->render() !!}

我正在使用Laravel 5.0。尝试了你的解决方案。非常好用。谢谢。 - festiv

0

我曾经遇到过类似的问题,我的解决方法是改变了路由的方式。

Route::post('uri', 'Controller@function')
    ->name ('view.function');

for:

Route::any('uri', 'Controller@function')
    ->name ('view.function');

它对我有效。

祝好运。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接