【问题标题】:ASP.NET MVC to PHP Laravel Migration: Html.RenderAction AlternativeASP.NET MVC 到 PHP Laravel 迁移:Html.RenderAction 替代方案
【发布时间】:2017-03-26 16:52:54
【问题描述】:

我目前正在使用 PHP Laravel (5.4) 基于我过去制作的现有 ASP.NET MVC 版本开发 CMS。由于大部分 ASP.NET 版本都是用 JS 编写的,因此我试图在我正在开发的较新的 Laravel 版本中尽可能多地重用。由于 Laravel 与 ASP.NET MVC 架构的相似性,我已经将大部分 C# 代码翻译成 PHP,这有点简单。

目前,我在尝试从视图中调用控制器操作时遇到问题,该操作将依次呈现部分视图。在 ASP.NET MVC 版本中,我使用 Html.RenderAction 助手完成了此操作。

ASP.NET MVC 示例:

<div>
    @{Html.RenderAction("Controller", "Action");}
</div>

我想知道是否有任何替代 Html.RenderAction 助手可以用来完成此任务。

我搜索了互联网和 Laravel 的文档,从我能找到的内容来看,View Composers 似乎是最接近的替代方案。不幸的是,我没有找到任何可以解决我的问题的示例。

@Farrukh 建议使用 View Composers,它确实按预期工作。问题是我需要为我想要渲染的每个局部视图添加一个 View Composer 到 AppServiceProvider。

我找到了另一个解决方案,它允许我从视图中调用操作并呈现部分视图:

<?php echo \App\Http\Controllers\PageController::listAll(); ?>

但是这个解决方案似乎不是很干净。

【问题讨论】:

    标签: asp.net-mvc laravel laravel-5 renderaction


    【解决方案1】:

    ViewComposer 的行为类似于一个全局组件,您所要做的就是将您的业务逻辑放入您的模型中的一个方法中。

    例如

    class Post extends Model {
        public static function archives() {
            return static::selectRaw('your query here')
            ->get()
            ->toArray();
        }
    }
    

    然后转到 providers/AppServiceProvider.php

    将您的 viewcomposer 代码添加到引导方法中(任何视图加载之前的挂钩)。

    例如

    @include('layouts.sidebar')
    

    在AppServiceProvier中,启动方式:

    public function boot() {
        view()->composer('layouts.sidebar', function($view) {
            $view->with('archives', \App\Post::archives());
        });
    }
    

    【讨论】:

    • 这解决了我的主要问题,但我知道我有一个问题,需要在 AppServiceProvider 中为我想要使用的每个局部视图创建一个视图编辑器。难道没有更简单的方法可以从视图中调用操作吗?
    • 例如,我可以从这样的视图调用一个动作: 但它似乎不是很“干净”...更新了我的问题。
    • 您可以创建自己的提供商。 php artisan make:provider YourProviderName 为每个实体/对象/操作
    • 去看看 Laravel 的服务提供商。我会尽快回复你:)
    【解决方案2】:

    您可以使用Service Injection

    <div>
        @{Html.RenderAction("Controller", "Action");}
    </div>
    

    在 Laravel 中是:

    @inject('Controller', 'App\Http\Controllers\HomeOrOtherController')
    {!! $Controller->action() !!}.
    

    这样,您将在视图中呈现控制器中操作的视图内容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-30
      • 1970-01-01
      • 2011-06-05
      相关资源
      最近更新 更多