Php Laravel 5:控制器间通信和实例化

Php Laravel 5:控制器间通信和实例化,php,laravel,laravel-5,Php,Laravel,Laravel 5,在过去,我使用了一个专有的框架,它遵循了类似于Objective-C的视图控制器方案 基本上,我能够在一个控制器中实例化另一个控制器,并将一些值传递给它,就像一个产品数组一样,然后将对控制器的引用注入到我的视图中,并在需要时通过发出以下命令来呈现它:$controllerReference->render() 这在许多情况下都很有用,例如,如果我有一个负责呈现目录的控制器,我只需向它传递一个包含我希望看到的所有项目的数组,它将需要分页并自行显示这些项目 例如: 位于\UI\Homepage\Co

在过去,我使用了一个专有的框架,它遵循了类似于Objective-C的视图控制器方案

基本上,我能够在一个控制器中实例化另一个控制器,并将一些值传递给它,就像一个产品数组一样,然后将对控制器的引用注入到我的视图中,并在需要时通过发出以下命令来呈现它:
$controllerReference->render()

这在许多情况下都很有用,例如,如果我有一个负责呈现目录的控制器,我只需向它传递一个包含我希望看到的所有项目的数组,它将需要分页并自行显示这些项目

例如:

位于\UI\Homepage\Controller.php(负责主页的控制器):

At\UI\Homepage\View.php(之前加载的视图):

如何在Laravel中实现此功能?从我所读到的,拉威尔试图避免这种行为,为什么?解决办法是什么


谢谢。

我将这样做,只有当被调用的控制器方法返回一个视图对象,如
返回视图(“home”)):

您可以使用由所有其他控制器扩展的Controller.php类在其中生成一个通用方法,以:

  • 获取控制器实例
  • 使用x参数调用正确的方法
  • 如果呈现的内容是视图类,则返回该内容或引发异常(例如)

  • 在最新版本的Laravel中,可以使用Blade的
    @inject
    指令。它的主要目的似乎是注入服务,但我成功地注入了控制器操作

    下面是一个关于您必须做什么的片段:

    @inject('productController', 'App\Http\Controllers\ProductController')
    {!! $productController->index() !!}
    
    请记住:由于您直接调用控制器方法,而不是通过路由器,因此必须传递所有必需的参数。如果该操作需要一个请求实例,您可以这样调用它:

    {!! $productController->index(request()) !!}
    

    被调用的操作返回的视图可能包含HTML代码。将方法调用包装在
    {!!
    !!}
    中非常重要。使用常规的
    {{}
    标记将导致模板引擎转义HTML代码。

    。。。我想没有一个干净的方法来处理这件事。。。感谢您的回复。旁注:这也将在CakePHP和视图单元格中完成。在拉雷维尔有类似的事情吗?
    // Get the controller class from the IOC container
    $myController= \App::make(MyController::class); 
    
    // Execute the controller method (which return a View object)
    $view = $myController->myControllerMethod($someParams); 
    
    // Return the View html content
    $html = $view->render(); 
    
    @inject('productController', 'App\Http\Controllers\ProductController')
    {!! $productController->index() !!}
    
    {!! $productController->index(request()) !!}