laravel 使用可选参数路由到控制器

w3nuxt5m  于 2022-12-24  发布在  其他
关注(0)|答案(7)|浏览(180)

我想创建一个路线,它需要一个必需的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?
});
wgeznvg7

wgeznvg71#

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

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
}
ubof19bj

ubof19bj2#

这帮助我简化了可选路线参数(来自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路由参数-可选参数

bwntbbo3

bwntbbo33#

我会用三条途径来处理:

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

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

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

注意顺序-您希望首先检查完整路径。

t1qtbnec

t1qtbnec4#

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

在此了解更多详情(Laravel 7):https://laravel.com/docs/7.x/routing#parameters-optional-parameters

chhqkbe1

chhqkbe15#

您可以从路由闭合调用控制器操作,如下所示:

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;

});
jvidinwx

jvidinwx6#

我所做的是将可选参数设置为query参数,如下所示:
示例URL:第一个月
路线:Route::get('/getStuff/{date}','Stuff\StuffController@getStuff');
控制器:

public function getStuff($date)
{
        // Optional parameters
        $type = Input::get("type");
        $color = Input::get("color");
}
flvlnr44

flvlnr447#

无需太多更改即可解决您的问题

Route::get('/path/{id}/{start?}/{end?}', function($id, $start=null, $end=null)
{
    if(empty($start))
    {
        $start = Carbon::now()->subDays(30)->format('Y-m-d');
    }
    if(empty($end))
    {
        $end = Carbon::now()->subDays(30)->format('Y-m-d');
    }
    return App\Http\Controllers\HomeController::Path($id,$start,$end);
});

然后

class HomeController extends Controller
{
public static function Path($id, $start, $end)
    {
        return view('view');
    }
}

现在最佳方法是

use App\Http\Controllers\HomeController;
Route::get('/path/{id}/{start?}/{end?}', [HomeController::class, 'Path']);

那么

class HomeController extends Controller
{
    public function Path(Request $request)
    {
        if(empty($start))
        {
            $start = Carbon::now()->subDays(30)->format('Y-m-d');
        }
        if(empty($end))
        {
            $end = Carbon::now()->subDays(30)->format('Y-m-d');
        }
        //your code
        
        return view('view');
    }
}

相关问题