【发布时间】:2021-07-11 12:14:32
【问题描述】:
在我的应用程序中,我有一个像这样名为“Order”的模型,遵循默认的 Laravel 行为,并带有一个名为“hash”的附加唯一字符串属性:
class Order extends Model {
// $table = 'orders';
// $primaryKey = 'id';
// $incrementing = true;
$hash = 'a1b2c3d4e5f6g7h8i9';
// many related models
}
函数 Model::find 的默认行为是查找主键,这是我绝对想要保留的功能。目前我的 routes/api.php 包含这样的功能:
public function show(Request $request, Order $order) {
// the order will be loaded via the id
// if the model is not found an exception is thrown
}
在某些情况下,我现在想注入相同的订单,但通过订单的哈希进行搜索,所以我假设我的 api.php 看起来像这样:
public function show(Request $request, OrderSearchByHash $order) {
// the order will be loaded via the id
// if the model is not found an exception is thrown
}
问题来了:这是否可以实现?如果可以,如何实现?我实际上并不需要源代码,而是提示我必须去的方向。我已经阅读了有关 ServiceProviders 和 Facades 的内容,尝试创建扩展模型(但我必须“修补”所有关系,因为数据透视表会有不同的名称)以及 Laravel 文档中的许多其他内容,但我仍然没有甚至确切地知道是否涵盖了我的具体问题?
有人给我提示吗? 提前致谢!
【问题讨论】:
-
这有点不清楚。为什么
show方法应该知道订单是通过 ID 还是哈希搜索的?会有什么不同? -
据我了解文档(在这种情况下我可能完全偏离主题),服务提供商通过类型提示识别我请求的模型并为我加载它。我想要它做的仍然是寻找一个订单模型,但不是通过 ID,而是通过哈希。我希望只更改控制器中的注入类型,检索与通过 ID 搜索时完全相同的模型,并继续使用我当前使用的相同源代码。
-
是的,但是在这两种情况下,您的控制器方法都应该收到
Order。获取它的方式不应该改变它的类型。您可能想要做的是更改到该控制器方法的路由的构造方式,例如route('show', [Order::firstWhere('hash', $hash)])。
标签: php laravel type-hinting