php Laravel 9将变量从路由传递到控制器

v7pvogib  于 2023-02-11  发布在  PHP
关注(0)|答案(3)|浏览(141)
    • 我的问题:**我目前正在尝试重构我的一些控制器。这样做时,我发现了以下两条路径:
Route::get('/events', [EventsController::class, 'eventsList'])->name('event-list');
Route::get('/courses', [EventsController::class, 'allCoursesList'])->name('all-events');

它们在前端显示不同的过滤器选项。

    • 我想做的事:**

示例代码:

Route::get('/courses', [
    'all' => 1,
    EventsController::class, 'courseList'
])->name('all-events');

因此,能够传递变量,在本例中为all到我的控制器。EventsController因此,我可以在控制器中检查if,并且仅使用一个函数(而不是两个函数)以不同的方式处理这些路由。
使用StackOverflow上的当前解决方案,用户可以使用:

'uses'=>'myController@index'

如果我这样做

Route::get('/courses', [
    'all' => 1,
    'uses' => 'EventsController@CourseList'
])->name('all-events');

出现以下错误:

Target class [EventsController] does not exist.
    • 问题:**

在Laravel 9和10中,什么是当前正确的方式,从一个路由传递一个变量到一个控制器。

wfauudbj

wfauudbj1#

可以使用Routedefaults方法将任意数据作为参数传递给路由:

Route::get('courses', [EventsController::class, 'list'])
    ->name('all-events')
    ->defaults('all', 1);

Route::get('events', [EventsController::class, 'list'])
    ->name('event-list');

public function list(Request $request, $all = 0)
{
    ...
}

还有其他使用Route传递数据的方法。

7vux5j2d

7vux5j2d2#

Laravel版本8和更高版本不会自动应用名称空间前缀,这意味着当类名作为字符串传递时,需要使用完全限定类名(FQCN)。
例如:

Route::get('/courses', [
    'all' => 1,
    'uses' => '\App\Http\Controllers\EventsController@CourseList'
])->name('all-events');

如果对您的用例有意义,您还可以使用URL参数。例如,如果您的Course模型属于Category模型,您可以执行以下操作:

Route::get('/courses/{category}', [EventsController::class, 'allCourseList');

然后在控制器中,定义allCoursesList函数,如下所示:

public function allCoursesList(Category $category)
{
    // ... do something with $category which is an instance of the Category model.
}
b4wnujal

b4wnujal3#

您可以使用路径参数将变量从路径传递到控制器。

// web.php
Route::get('/events/{all}', [EventsController::class, 'eventsList'])->name('event-list');

然后在你的控制器里你可以访问变量

public function eventsList(Request $request,$all){

         if($all==1){
        //your logic for handling the condition when $all =1
      }

        // the remaining condition
    }

如果你有多个参数,你可以像这样传递它们,你可以使用?作为可选参数。

// web.php
Route::get('/courses/{param_one}/{param_two?}', [EventsController::class, 'allCoursesList'])->name('all-events');

然后在你的控制器里你可以访问变量

public function allCoursesList(Request $request,$paramOne,$paramTwo){

        return $paramOne.' '.$paramTwo;
    }

访问查询参数

// web.php
Route::get('/evets', [EventsController::class, 'allCoursesList'])->name('all-events');

如果路由是/events?timeframe=0&category=1,您可以按如下方式访问查询参数

public function allCoursesList(Request $request,$paramOne,$paramTwo){
$timeframe= $request->query('timeframe');
// do this for all the query parameters
       
    }

相关问题