laravel 如何根据开发人员提供的参数自定义控制器输出?

ggazkfy8  于 2022-12-05  发布在  其他
关注(0)|答案(1)|浏览(111)

是否有任何方法可以根据路由中提供的参数(而不是查询参数)自定义控制器返回的内容?例如,如果有两种显示模式,但显示方式取决于访问的URL。
一个简化的、虚构的例子:

class MyController extends Controller
{
    // $display_mode can be "large" or "small"

    public function show($display_mode = null)
    {
         ...
    }
}

给药途径:
对于/page 1,我希望$display_mode是“large”,对于/page 2,我希望它是“small”。我如何通过函数参数传递它?这将是首选的方式,但如果Laravel用不同的方式传递,请告诉我。

Route::get('/page1', [MyController::class, 'show']);

Route::get('/page2', [MyController::class, 'show']);

为了更好地了解我想要完成的任务。假设控制器函数有五个不同的可自定义参数(基于显示和业务逻辑)。我无法事先知道哪些选项将应用于创建路线的开发人员想要显示的页面。我只想使这些选项可用。
另外,开发者也不希望使用mypage/large/tiled/system-only这样难看的路径来创建URL,最终用户也不需要知道作为参数传递给函数的所有选项。
相反,路由应该仅为/a、/b和/c,并且通过将选项作为参数传递给控制器函数,这些路由中的每一个在引擎盖下表示0到5个可定制选项。
编辑:
我尝试了defaults()方法,它运行得很好。请注意,为了使它工作,必须为每个函数参数进行单独的default()调用。例如:

Route::get('/login/main', [WAYFController::class, 'wayf'] )
    ->defaults('tiledUI', false)
    ->defaults('showAffiliateLogin', true)
    ->defaults('type', 'full');
z0qdvdin

z0qdvdin1#

你可以使用Routedefaults方法来传递一个参数的默认值:

Route::get('testit', function ($display_mode) {
    dump($display_mode);
})->defaults('display_mode', 'large');

您可以使用它将任意数据传递给“action”。
另一个用例是,如果您有类似PageController的东西来显示单个页面,但不希望路由是动态的,而是显式定义您将拥有的路由:

Route::get('about-us', [PageController::class, 'show'])
    ->defaults('page', 'about-us');

Route::get('history', [PageController::class, 'show'])
    ->defaults('page', 'our-history');

Route类是Macroable类,因此您甚至可以创建一个宏来定义路线上的这些默认值:

Route::get('about-us', [PageController::class, 'show'])
    ->page('about-us');

Router本身也是Macroable,因此您可以定义一个宏,将所有这些定义到单个方法调用中:

Route::page('about-us', 'about-us');

相关问题