如何将参数传递给 Laravel 包中的控制器操作?

Posted

技术标签:

【中文标题】如何将参数传递给 Laravel 包中的控制器操作?【英文标题】:How do I pass a parameter to a controller action within a Laravel Package? 【发布时间】:2016-05-06 09:53:35 【问题描述】:

在我制作的 Laravel 包中,我想将用户重定向到需要参数的控制器操作(在同一个包中)。

控制器:

public function postMatchItem(Request $request, $id)

    $this->validate($request, [
        'item_match' => 'required|numeric|exists:item,id',
    ]);

    $spot_buy_item = SpotBuyItem::find($id);

    $item = Item::find($request->input('item_match'));

    $price = $item->getPrice();

    $spot_buy_item_response = new SpotBuyItemResponse();
    $spot_buy_item_response->spot_buy_item_id = $id;
    $spot_buy_item_response->spot_buy_id = $spot_buy_item->spot_buy_id;
    $spot_buy_item_response->item_id = $item->id;
    $spot_buy_item_response->user_id = $spot_buy_item->user_id;
    $spot_buy_item_response->spot_buy_price = $price;
    $spot_buy_item_response->created_ts = Carbon::now();
    $spot_buy_item_response->save();

    return redirect()->action('Ariel\SpotBuy\Http\Controllers\Admin\SpotBuyController@getPart', [$id]);

重定向中的操作与我在routes.php 文件中用于将用户引导到此控制器操作的路径相同

路线:

Route::get('/part/id', 'Ariel\SpotBuy\Http\Controllers\Admin\SpotBuyController@getPart')->where('id', '[0-9]+');

我已经尝试过这条路径的变体但没有成功,包括 SpotBuyController@getPart 就像文档建议的那样 (https://laravel.com/docs/5.1/responses#redirects)

注意:我通过在routes.php 中命名我的路线并使用return redirect()->route('route_name', [$id]); 来实现这一点,但我仍然想知道如何将包控制器操作传递给->action() 函数.

【问题讨论】:

试试:return redirect()->action('Ariel\SpotBuy\Http\Controllers\Admin\SpotBuyController@getPart', ['id' => $id]); 不走运。我收到相同的错误消息:production.ERROR: exception 'InvalidArgumentException' with message 'Action App\Http\Controllers\Ariel\SpotBuy\Http\Controllers\Admin\SpotBuyController@getPart not defined. 【参考方案1】:

它试图从App\Http\Controllers 命名空间中访问您的控制器。可以看到他们已在您的错误中将其添加到您的控制器名称中:

App\Http\Controllers\Ariel\SpotBuy\Http\Controllers\Admin\SpotBuyController@getP‌​art

您需要在开头使用\ 转义Ariel 命名空间:

return redirect()->action('\Ariel\SpotBuy\Http\Controllers\Admin\SpotBuyController@getPart', [$id]);

【讨论】:

这就是问题所在。谢谢杰夫。 不错的答案!有时候,大问题在小细节!! +1

以上是关于如何将参数传递给 Laravel 包中的控制器操作?的主要内容,如果未能解决你的问题,请参考以下文章

如何将两种形式作为参数传递给 laravel 控制器?

如何将 vue.js 值作为参数传递给刀片中的路由

在 Laravel 5.2 中将页面 URL 参数传递给控制器

如何使用 FluidTypo3 将参数传递给控制器​​操作?

将参数传递给 Laravel 中的中间件

如何使用 Laravel 任务调度将参数传递给命令