我目前正在使用PHP Laravel(5.4)开发一个CMS,基于我过去制作的现有 ASP.NET MVC版本。由于大多数 ASP.NET 版本都是用JS编写的,因此我正在尝试在我正在开发的较新的Laravel版本中重用尽可能多的内容。我已经将大部分 C# 代码翻译成 PHP,这要归功于 Laravel 与 MVC 架构 ASP.NET 相似之处,这有点简单。
目前,我尝试从视图中调用控制器操作时遇到问题,该操作将反过来呈现部分视图。在 ASP.NET MVC 版本中,我使用Html.RenderAction
助手完成了此操作。
ASP.NET MVC 示例:
<div>
@{Html.RenderAction("Controller", "Action");}
</div>
我想知道是否有任何可用于完成此任务的Html.RenderAction
帮助程序的替代方法。
我搜索了互联网和Laravel的文档,从我能够找到的内容来看,View Composers似乎是最接近的选择。不幸的是,我没有找到任何可以解决我的问题的示例。
@Farrukh建议使用View Composers,它确实按预期工作。问题是我需要为要呈现的每个部分视图向 AppServiceProvider 添加一个视图编辑器。
我找到了另一种解决方案,它允许我从视图中调用操作并呈现分部视图:
<?php echo AppHttpControllersPageController::listAll(); ?>
但是这个解决方案似乎不是很干净。
ViewComposer 的行为类似于全局组件,您所要做的就是将业务逻辑放入模型中的方法中。
例如
class Post extends Model {
public static function archives() {
return static::selectRaw('your query here')
->get()
->toArray();
}
}
然后转到提供程序/应用服务提供商.php
将视图编辑器代码添加到引导方法(任何视图加载之前的挂钩)中。
例如
@include('layouts.sidebar')
在 AppServiceProvier 中,引导方法:
public function boot() {
view()->composer('layouts.sidebar', function($view) {
$view->with('archives', AppPost::archives());
});
}
您可以使用服务注入:
<div>
@{Html.RenderAction("Controller", "Action");}
</div>
在拉拉维尔将是:
@inject('Controller', 'AppHttpControllersHomeOrOtherController')
{!! $Controller->action() !!}.
这样,您将在视图中呈现控制器中操作的视图的内容。