将硬编码值从路径传递到控制器(Laravel)的正确方法?

时间:2016-07-29 10:47:58

标签: php laravel laravel-5 laravel-routing

我有PagesController一个动作:view。 此操作接受page参数。

我想要实现的目标:

拥有路线example.com/aboutexample.com/foobar。 触发其中一条路由时,将路由文件中预定义的值传递给PagesController@view

在我的路线档案中:

Route::get('about', function () {
    return App::make('App\Http\Controllers\PagesController')->view('about');
})->name('aboutPage');

Route::get('foobar', function () {
    return App::make('App\Http\Controllers\PagesController')->view('foobar');
})->name('foobarPage');

它按预期工作,但我想知道是否有更好,更正确的方法来实现相同的功能?

5 个答案:

答案 0 :(得分:4)

将您的网页作为路线参数传递:

Route::get('{page}', 'PagesController@view');

//controller
public function view($page)
{
    //$page is your value passed by route;
    return view($page);
}

答案 1 :(得分:2)

所以你只想为你的行动辩护。如果该参数可以为空,则可以使用可选参数。您可以阅读更多相关信息here

Route::get('{argument?}', 'PagesController@view')->name('page');

在您的PagesController

public function view($argument = 'default') {
    // Your logic
}

答案 2 :(得分:1)

如果您不需要路线名称,例如

->name('foobarPage');

你可以使用这样的东西

Route::get('{page_name}','PagesController@view')->where('page_name', '(about)|(foobar)');

这将仅接受page_name参数的正则表达式中传递的值。其他路线将引发404错误。我应该提一下,这种技术似乎只适用于只有一级url嵌套的应用程序,不应该用作模式。

答案 3 :(得分:1)

从我上面所看到的,如果您所做的只是显示正确的视图,我会选择

Route::get('{page}', function($page)
{
    if (view()->exists($page)) { 
        return view($page);
    } 
    return abort(404);
});

这可以防止你甚至在控制器中需要一个方法。

答案 4 :(得分:1)

根据你正在做的事情,你接受的答案是你想要的。

如果你真的想要一个硬编码值,你可以根据需要使用路线的'actions'数组部分。

public class FruitSalad
{
    private readonly Fruit _fruit;

    public FruitSalad(Fruit fruit)
    {
        _fruit = fruit;
    }

    public DoStuff()
    {
        // Prints "Apple being diced" or "Banana being cut to small pieces"
        // depending on the runtime type of `Fruit` being passed into the 
        // constructor of FruitSalad
        _fruit.CutToPieces();
    }
}

asklagbox - blog - random tips and tricks