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 在刀片视图中调用模型函数的主要内容,如果未能解决你的问题,请参考以下文章