Laravel 5 在刀片视图中调用模型函数

Posted

技术标签:

【中文标题】Laravel 5 在刀片视图中调用模型函数【英文标题】:Laravel 5 call a model function in a blade view 【发布时间】:2015-05-14 11:36:07 【问题描述】:

我想从 3 个表构建刀片视图:

“inputs_details” - 字段:article_type(值:'p' 代表产品,'s' 代表服务)、article_id、.... “产品” - 字段:ID、名称 “服务” - 字段:id、名称

但是,在浏览器中,我有错误:“找不到类'产品'”。

有没有办法将这个函数传递给视图(根据 article_type 和 article_id 查找产品或服务的名称)?

我也尝试使用连接查询,但我无法在单个连接查询中放置这么多条件......其中 article_type 为“p”,然后加入“产品”表......或......哪里article_type 为 "s",然后加入 "services" 表。

【问题讨论】:

您正在绕过MVC 模式中的C(控制器)部分(Laravel 是一个 MVC 框架)。你不应该那样做。而是从控制器调用模型,并在模板变量中公开您从中获取的任何数据,然后可以在 Blade 视图中使用。 你为什么要使用这个概念?这意味着你在侮辱 laravel 框架。这不是你这样做的方式。你正在吃 laravel 的 MVC 概念。棒棒糖 【参考方案1】:

我解决了这个问题。很简单。语法错误。

应用\产品 应用\服务

但我也想知道如何将带参数的函数传递给查看....

【讨论】:

您能解释一下:“...如何将带参数的函数传递给视图...”? @sleepless 我想从控制器传递一个私有函数来查看参数如下: return view('admin.inputs.create')->with(function($parameter1,@parameter2)) ;在视图中,我想使用该函数根据视图中的参数返回变量。 为什么不传递一个对象并调用它的函数呢?或者你可以创建一个静态函数集合,你可以随时调用。【参考方案2】:

与您回答中的问题有关:

您有多种更好的选择来实现这一目标:

假设你有一个模型,你传递给视图:

$model = Model::find(1);
View::make('view')->withModel($model);

现在在你的模型中你可以有一个函数:

public function someFunction() 
    // do something

在您看来,您可以直接调用该函数:

$model->someFunction()

如果您想对模型(数据集)做点什么,这很好。

如果没有,您仍然可以在模型中创建静态函数:

public static function someStaticFunction($var1, $var2) 
    // do something

然后:

App\Model::someStaticFunction($yourVar1,$yourVar2)

希望对你有帮助。

【讨论】:

非常感谢您的详细解答。 但是,如果我想将一个静态函数从 Controller 传递给 view,语法是什么? 你为什么要这样做?如前所述,您可以在模型中创建一个静态函数并在视图中调用它。那么你就不必通过任何东西了。 @Roland 当然应该。我不认为我必须这么说。 问题发起者在他的视图中直接调用了一个模型方法,所以我认为可能值得一提。【参考方案3】:

您可以将它传递给视图,但首先在控制器中查询它,然后添加:

return view('yourview', COMPACT('variabelnametobepassedtoview'));

【讨论】:

【参考方案4】:

我认为您需要的是模型上的关系,而不是在控制器上传递函数或查询它,因为这些是数据库中的相关表。

如果根据你的结构,input_details 和 products 是相关的,你应该像这样在你的模型上定义关系:

public class InputDetail()
 protected $table = "input_details";
 ....//other code

 public function product()
   return $this->hasOne('App\Product');
 

那么在你看来,你只需要说:

<p> $input_details->product->name </p>

这样更简单。控制器应该只为当前资源执行业务逻辑也是最佳实践。有关如何执行此操作的更多信息,请访问文档:https://laravel.com/docs/5.0/eloquent#relationships

【讨论】:

【参考方案5】:

我遇到了类似的问题,我想从我的视图中调用控制器中定义的函数。虽然它让我困惑了一段时间,试图弄清楚如何从视图中到达控制器,但事实证明它相当简单。

我将一个数组传递给我的视图,其中包含视图格式化并使用 jQuery DataTables 呈现给用户的数据记录(big duh)。呈现的 UI 表中的一列是一组操作按钮,需要根据每行中的数据内容为每行创建这些按钮。我想我可以将按钮定义作为发送到视图的列添加到数据行,但并非所有视图都需要按钮,为什么?相反,我想要需要他们添加它们的视图。

在控制器中,我将控制器本身的引用传递给视图,如

->with('callbackController', $this)

我称它为回调控制器,因为这就是我正在做的事情。现在,在我的视图中,我可以转义到 php 以使用 $callbackController 访问父控制器,如

<?php echo $callbackController->makeButtons($parameters); ?>

或者只使用 Blade 机制

!! $callbackController->makeButtons($parameters); ?>

它似乎在多个控制器和视图中运行良好。我没有注意到使用这种机制会降低性能,而且我有一个包含超过 50K 行的大表。

我还没有尝试传递对其他对象(例如模型等)的引用,但我看不出有什么不好的

可能不够优雅,但似乎可以完成工作。

【讨论】:

传递对当前控制器的引用似乎是不好的做法。我会建议类似存储库模式或创建一个可重用函数库。您的控制器和其他任何地方都是您的项目可以使用这些功能。【参考方案6】:

想在视图中使用模型:

 Product::find($id) 

您可以在视图中使用:

<?php
$tmp = \App\Product::find($id);
?>
 $tmp->name 

希望对你有帮助

【讨论】:

【参考方案7】:

在新版本的 Laravel 中,您可以使用“服务注入”。

https://laravel.com/docs/5.8/blade#service-injection

/resources/views/main.blade.php

@inject('project', 'App\Project')

<h1> $project->get_title() </h1>

【讨论】:

以上是关于Laravel 5 在刀片视图中调用模型函数的主要内容,如果未能解决你的问题,请参考以下文章

如何在刀片视图 laravel 5.6 中访问定义的关系

Laravel - 从刀片视图中的模型关系中检索属性

如何在 vue 组件中调用视图刀片 laravel?

在刀片视图文件中使用laravel策略授权

在刀片视图中显示路线的结果(Laravel)

Laravel:在刀片模板中调用静态函数