【问题标题】:Bind multiple models to one View Controller in laravel在 laravel 中将多个模型绑定到一个 View Controller
【发布时间】:2018-08-12 19:46:50
【问题描述】:

我开始放弃 laravel,因为无法遵循我一直认为理所当然的某种模式!!

假设我有此链接中的示例 https://laravel.com/docs/5.4/container#introduction

public function show($id)
{
    $user = $this->users->find($id);

    return view('user.profile', ['user' => $user]);
}

这个 user 模型绑定到该控制器以显示在视图中。 如果我需要注入另一个模型怎么办,我们称它为 plane,它独立于用户模型(没有数据库关系)。 所以我将它们都列在同一个视图中。

例如,在 Angular 中,我可以在同一页面上创建多个组件,每个组件都有自己独立的控制器和模型。

【问题讨论】:

  • 你的例子并没有真正使用任何类型的绑定

标签: php laravel web laravel-5.4


【解决方案1】:

Laravel 支持上下文绑定。

它还有绑定数据库模型的快捷方式:

模型绑定

在您的RouteServiceProvider 中,您可以拥有:

Route::model("user", App\User::class);

然后你的路线声明为:

Route::get("/users/{user}","UserController@show");

还有你的控制器:

public function show(User $user) {
   //$user->id is based on the {user} route parameter
}

其他上下文绑定

Route::bind("plane", function ($id, RouteInfo $routeInfo) {
      // Get the plane object based on the given $id and optionally the extra route info parameters
     return $planeObject;
});

您的路线可以声明为:

 Route::get("/planes/{plane}", function (Plane $plane) {
      //$plane will depend on passed parameter
 });

Laravel 也支持普通绑定:

在您的AppServiceProvider 中,您可以拥有:

 $this->app->bind(Plane::class, function ($app) {
      //Make a plane class object
     return $planeObject;
 });

然后在你的控制器方法中(或任何 Laravel 允许依赖注入发生的地方)你可以这样做:

public function show(Plane $plane) {
   //Plane is the globally declared binding
} 

您也可以将两者结合起来,例如:

Route::model("user", App\User::class);
$this->app->bind(Plane::class, function ($app) {
      //Make a plane class object
     return $planeObject;
 });

 Route::get("/users/{user}","UserController@show");

 public function show(User $user, Plane $plane) {
   //$user->id is based on the {user} route parameter and $plane is resolved using the service container
}

【讨论】:

  • in this one : $this->app->bind(Plane::class, function ($app) { //使平面类对象返回 $planeObject; });如何从 artisan make:model 创建的 mysql 数据库中检索对象以返回它
  • @mahmoudfathy return Plane::find(/* some id you need */) 因为该代码中没有上下文,所以只有在您总是想获得相同的 Plane 对象时才应该使用它。如果您需要添加上下文信息但不是来自路线检查the binding basics
  • 我想我可能会使用 Plane::findall() ,嗯? ,无论如何我都需要所有条目
  • @mahmoudfathy 你不能那样做。 all() 返回一个数组。数组是 PHP 中的原语,因此它们不能被绑定(当你需要使用数组来做任何事情时,总是得到相同的数组是很愚蠢的)。
  • 其实我需要整个数组,我不需要一个元素。我从模型数据库中提取数组,它通过数据库更改。
【解决方案2】:

是的,你可以像这样使用 laravel 绑定多个模型:

public function show(User $user, Plane $plane)
{
    return view('user.plane', compact('user', 'plane')]);
}

正如@apokryfos 所说,您的示例在控制器中没有任何绑定,

这是相应路线的示例:

Route::get('/fakeRoute/{user}/{plane}', 'FakeController@show');

链接示例:

yourSite.com/fakeRoute/1/25

【讨论】:

  • 或者如果你不想使用紧凑型:['user' => $user, 'plane' => $plane]
  • 是的,我知道,我没有显示可重现的代码。我还在学习 laravel,我正在研究它的功能,我找不到类似的例子。我在那里写的同一个链接中有很多绑定示例,这也让我不知所措,不知道如果我需要多个模型,我应该使用哪一个。但现在我知道你可以从我这里得到我现在需要的东西,我猜。
【解决方案3】:

简单地说,一个控制器可以向多个模型发送请求以更新单个视图,所以是的,您可以在一个控制器中使用多个模型

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-10
    • 1970-01-01
    • 1970-01-01
    • 2015-07-12
    • 1970-01-01
    • 2013-08-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多