在过去,我使用了一种专有框架,它遵循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试图避免这种行为,为什么?有哪些解决方法?
谢谢。
答案 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 :(得分:1)
在最新版本的Laravel中,可以使用Blade的@inject
指令。它的主要目的似乎是注入服务,但我成功注入了控制器操作。
以下是您需要做的代码摘要:
@inject('productController', 'App\Http\Controllers\ProductController')
{!! $productController->index() !!}
请记住:由于您直接调用控制器方法,而不是通过路由器,因此您必须传递所有必需的参数。如果该操作需要请求实例,您可以这样调用它:
{!! $productController->index(request()) !!}
被调用操作返回的视图可能包含HTML代码。将方法调用包含在{!!
和!!}
中非常重要。使用常规{{ }}
标记会导致HTML代码被模板引擎转义。