Laravel重定向URL控制器

时间:2018-04-17 13:11:17

标签: php laravel

我想将/ topic / {title}的重定向网址重定向到/ topic / {category} / {title}。 所以我尝试在路线中注册这个:

Route::get('/topic/{title}',function(){
    return redirect()->action('/topic/{category}/{title}','DetailController@index');
});

但我收到了错误

  

操作App \ Http \ Controllers / topic / {category} / {title}未定义。

有人可以帮我解决这些路线吗? 谢谢你的进步。

这是我的控制器

class DetailController extends Controller
    {
        /**
         * Display a listing of the resource.
         *
         * @return \Illuminate\Http\Response
         */
        public function index($section=0,$title = 0)
        {
            $detail = DB::table('t_artikel')
                ->join('t_section', 't_section.id_section', '=', 't_artikel.id_section')
                //->join('t_kolom', 't_kolom.id', '=', 't_artikel.penalar')
                ->where('publish', '=', 'Y')
                ->where('parent_id', '=', 0)
                ->where('tgl_pub', '<=', date('Y-m-d H:i:s'))
                ->where('t_artikel.urltitle', '=', $title)
                ->select('t_artikel.*', 't_section.*', 't_artikel.urltitle as urlartikel')
                ->first();
            $kategori = DB::table('t_section')
                ->where('id_supsection', '=', 0)
                ->where('status', '=', 1)
                ->orderBy('position', 'asc')
                ->whereNotIn('id_section', [34])
                ->select('t_section.*')
                ->get();
            $page = 'Detail';
            return view ('detail.detail',
                ['detail'       => $detail,
                 'kategori'     => $kategori,
                 'page'         => $page          
                 ]);
      }

4 个答案:

答案 0 :(得分:0)

根据documentation

  

如果您的控制器路由需要参数,您可以将它们作为第二个参数传递给操作方法

所以,你需要传递这样的参数:

return redirect()->action(
    'DetailController@index', ['category' => <enter_value>, 'title' => <enter_value>]
);

答案 1 :(得分:0)

我建议你使用2路和2路控制器。一个处理主题的细节,另一个处理“旧”URL的重定向。

例如:用户将访问由识别主题和类别的控制器处理的“/ topic / title”,然后将使用

public function handleTopic($title){
    // the code here will recognize topic and category
    // and will just provide the stuff to show the right page
    // in the end will redirect to that controller
    return redirect()->action('DetailController@index', ['category' => $category, 'title' => $title]);
}

public function index($stuffYouNeed){
    // retrieve the rest of data you need to show the page
    // you already know the title and category (cause of previous controller)
    // in the end return the view with data
    return view ('detail.detail',['data' => $data]);
}

在您的路线中,您必须添加一条路线并编辑现有路线,如:

Route::get('topic/{title}', 'DetailController@handleTopic')->name('handleTopic');

Route::get('topic/{category}/{title}', 'DetailController@index')->name('showTopic');

没有测试因为我没有在本地设置laravel env。但我认为它应该有效。让我知道

编辑:我忘了解释为什么会看到错误

  

操作App \ Http \ Controllers / topic / {category} / {title}未定义。

您使用的重定向不正确

Route::get('/topic/{title}',function(){
return redirect()->action('/topic/{category}/{title}','DetailController@index');
});

您只能提供动作控制器,而不能提供路线。并且目的地路线必须存在。所以正确的用途是:

return redirect()->action('Controller@action');

无论如何,你应该从路线中分离逻辑。你有控制器...即使是非常短的代码块。它将保持一切井然有序。在您的路线文件中,您应该只有路线。

答案 2 :(得分:0)

解决了,我在修改后找到了自己的方式。这是代码:

Route::get('/topik/{title}',function($title){    
    $article = DB::table('t_artikel')
            ->join('t_section', 't_section.id_section', '=', 't_artikel.id_section')          
            ->where('publish', '=', 'Y')
            ->where('parent_id', '=', 0)
            ->where('tgl_pub', '<=', date('Y-m-d H:i:s'))
            ->where('t_artikel.urltitle', '=', $title)
            ->select('t_artikel.*', 't_section.urltitle as urltitlesec', 't_artikel.urltitle as urlartikel')
            ->first();
     $kategori = $article->urltitlesec;
     return redirect("/topik/{$kategori}/{$title}");

});

答案 3 :(得分:0)

如果要重定向到URI,则使用redirect()->action();改为使用redirect()->to()

Route::get('/topic/{title}', function ($title) {
    $category = ''; // Get category some how

    return redirect()->to("/topic/{$category}/{$title}");
});