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