Laravel (5) - 使用可选参数路由到控制器

Posted

技术标签:

【中文标题】Laravel (5) - 使用可选参数路由到控制器【英文标题】:Laravel (5) - Routing to controller with optional parameters 【发布时间】:2015-07-06 16:17:51 【问题描述】:

我想创建一个采用所需 ID 和可选开始和结束日期 ('Ymd') 的路线。如果省略日期,则它们会退回到默认值。 (说过去 30 天)并调用控制器....让我们说 'path@index'

Route::get('/path/id/start?/end?', function($id, $start=null, $end=null)

    if(!$start)
    
        //set start
    
    if(!$end)
    
        //set end
    

    // What is the syntax that goes here to call 'path@index' with $id, $start, and $end?
);

任何帮助将不胜感激。我确信有一个简单的答案,但我在任何地方都找不到任何东西。

提前感谢您的帮助!

【问题讨论】:

【参考方案1】:

无法从 Route:::get 闭包中调用控制器。

用途:

Route::get('/path/id/start?/end?', 'Controller@index');

并在控制器函数中处理参数:

public function index($id, $start = null, $end = null)

    if (!$start) 
        // set start
    
        
    if (!$end) 
        // set end
    
        
    // do other stuff

【讨论】:

如果发送了两个参数之一,是否会设置为 $start,因为这是路由中定义的第一个参数?【参考方案2】:

我会用 三个 路径来处理它:

Route::get('/path/id/start/end, ...);

Route::get('/path/id/start, ...);

Route::get('/path/id, ...);

注意顺序 - 你要先检查完整路径。

【讨论】:

这里唯一的问题是这种情况:Route::get('/path/id/end, ...);由于您已经定义了这条路线:Route::get('/path/id/start, ...); 有趣,但从功能上讲,如果只提供一个日期,代码将无法知道该日期是结束日期还是开始日期。程序员必须做出决定。 你是绝对正确的。 :) 我对此进行了更多阅读并了解当它们是多个可选参数时,您始终需要设置前面的参数以考虑以下参数。这有效地使您的三个路线正确。【参考方案3】:

您可以像这样从路由闭包中调用控制器操作:

Route::get('slug', function ($slug, Request $request) 

    $app = app();
    $locale = $app->getLocale();

    // search for an offer with the given slug
    $offer = \App\Offer::whereTranslation('slug', $slug, $locale)->first();
    if($offer) 
        $controller = $app->make(\App\Http\Controllers\OfferController::class);
        return $controller->callAction('show', [$offer, $campaign = NULL]);
     else 
        // if no offer is found, search for a campaign with the given slug
        $campaign = \App\Campaign::whereTranslation('slug', $slug, $locale)->first();
        if($campaign) 
            $controller = $app->make(\App\Http\Controllers\CampaignController::class);
            return $controller->callAction('show', [$campaign]);
        
    

    throw new \Symfony\Component\HttpKernel\Exception\NotFoundHttpException;

);

【讨论】:

【参考方案4】:

我所做的是将可选参数设置为 query 参数,如下所示:

示例网址: /getStuff/2019-08-27?type=0&color=red

路线: Route::get('/getStuff/date','Stuff\StuffController@getStuff');

控制器:

public function getStuff($date)

        // Optional parameters
        $type = Input::get("type");
        $color = Input::get("color");

【讨论】:

@Michael Pittino 的回答是做到这一点的最佳实践方式【参考方案5】:

这帮助我简化了可选的路由参数(来自 Laravel 文档):

有时您可能需要指定一个路由参数,但该路由参数的存在是可选的。您可以通过放置一个 ?在参数名称后标记。确保给路由对应的变量一个默认值:

Route::get('user/name?', function ($name = null) 
    return $name;
);

Route::get('user/name?', function ($name = 'John') 
    return $name;
);

或者,如果您的路线中有控制器调用操作,那么您可以这样做:

web.php

Route::get('user/name?', 'UsersController@index')->name('user.index');


userscontroller.php

public function index($name = 'John') 

  // Do something here


我希望这有助于有人像我一样简化可选参数!

Laravel 5.6 Routing Parameters - Optional parameters

【讨论】:

赞成,这可能是一个解决方案,但不是一个完美的解决方案。【参考方案6】:
Route::get('user/name?', function ($name = null) 
    return $name;
);

在此处查找更多详细信息 (Laravel 7):https://laravel.com/docs/7.x/routing#parameters-optional-parameters

【讨论】:

以上是关于Laravel (5) - 使用可选参数路由到控制器的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 5,子域路由,带可选参数

php中laravel框架的控制器如何获取路由传过来的可选参数?

Laravel 4:如何传递多个可选参数

带有可选参数和 ajax 调用的 Laravel 路由

如何在Laravel 5.2中将表单数据作为路由参数传递

原来 laravel 路由 参数可以为可选。。。 很灵活