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

时间:2015-02-17 19:41:37

标签: php laravel laravel-5

在过去,我使用了一种专有框架,它遵循Objective-C之类的View Controller方案。

基本上我能够在一个控制器实例化另一个控制器并传递一些值,如产品数组,然后将控制器的引用注入到我的视图中,并在我想要的时候通过发出:$controllerReference->render();

这在许多情况下都很有用,例如。如果我有一个负责渲染目录的控制器,我只需要传递一个数组,其中包含我希望看到的所有项目,并且需要分页并自行显示项目......

示例:

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

// Instantiate a ProductDisplay Controller
$controllRef = new \UI\ProductDisplay\Controller();
$controllRef->setProducts( ... ); // Inject the product array

// Load the current view for this controller and pass it a reference for the ProductDisplay controller
$this->loadSelfView(["controllRef" => $controllRef]);

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

// some html of the view
$controllRef->render(); // Render the ProductDisplay view here!
// some other html

如何在Laravel中完成此功能?从我读过的内容来看,Laravel试图避免这种行为,为什么?有哪些解决方法?

谢谢。

2 个答案:

答案 0 :(得分:3)

以下是我将如何执行此操作,仅当被调用的控制器方法返回像return view('home');这样的View对象时才有效:

// 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(); 

您可以使用Controller.php类,该类由所有其他控制器扩展,以使其中的泛型方法:

  1. 获取控制器实例
  2. 使用x参数调用正确的方法
  3. 如果呈现的内容是视图类,则返回呈现的内容或抛出异常(例如)

答案 1 :(得分:1)

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

以下是您需要做的代码摘要:

@inject('productController', 'App\Http\Controllers\ProductController')
{!! $productController->index() !!}

请记住:由于您直接调用控制器方法,而不是通过路由器,因此您必须传递所有必需的参数。如果该操作需要请求实例,您可以这样调用它:

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

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