我正在开发基于CakePHP 2.2的webapp。我创建了一些适合主应用程序的插件。在主应用程序中,我有一个动态菜单。现在我希望插件在此菜单中显示操作。
我认为,最好的方法是让插件在主应用程序中注册其菜单项。然后主应用程序构建菜单(使用帮助程序)。但我不知道该怎么做。是否有可能让插件与主应用程序交互,即使它的AppController没有被触及?我想要显示所有插件,而不仅仅是当前的插件操作。
答案 0 :(得分:1)
这取决于您的实施细节。一般来说,您应该将插件视为一个插件。所以你的应用程序可以使用它。所以概念代码例如:
if(pluginAvailable('PagesPlugin')) {
$this->set('menu', $this->PagesPluginComponent->getMenuItems());
}
您的应用程序可以依赖它但它也不能在这里。这是插件的通用概念。在现实世界中,它更难,因为没有菜单就无法显示您的网页,从而产生真正的依赖。
插件应该可以重复使用。
一些选项:
您创建一个包含表格页面的插件。该插件有一个加载菜单项的组件和一个支持显示它们的帮助器。
所以在appcontroller中加载组件,在这里设置依赖关系。在before_filer中,您可以加载菜单数据并将其发送到视图。
在default.ctp(或其他布局文件)中,使用数据调用插件助手。
在插件控制器中创建一个方法并调用requestAction:http://book.cakephp.org/2.0/en/controllers.html#Controller::requestAction
所以你可以调用:yourplugin / menus / index并返回一个完整的MVC进程。因此,插件中的控制器从模型中获取菜单项,将数据发送到其视图,并在index.ctp中呈现菜单。您可以在应用程序中找到完整的HTML结果。
如果你想要你的模型中的数据一个插件无法帮助但仍然如此:如果你有一个复杂的函数可以生成一个样式很好的菜单,你可以将它放在一个插件帮助器中。
在您的应用程序中,您可以在应用程序中自行加载,因此您可以在那里获得所有灵活性。您将其发送到视图,但您使用该插件来呈现您的菜单。这样你就可以毫无问题地重复使用你的菜单助手。
不喜欢它但有可能:你可以在你的插件中创建一个新的AppController来处理设置菜单和所有其他事情。您的应用程序appController然后可以扩展该版本而不是普通的AppController扩展Controller。所以你得到:AppController扩展yourPluginAppController。我一般不喜欢这种模式,因为调用和依赖性不再可见,但实际上是自动添加和执行的。
可选:为了更灵活的工作方式,CakePHP添加了新的:事件http://book.cakephp.org/2.0/en/core-libraries/events.html这非常有趣。您可以将有趣的事件放在例如appcontroller中,并在插件中附加侦听器。这样可以避免硬编码调用这些方法。所以这可能会有用,但它很新,而且有一些小问题,因为它是全新的。文档尚未完成,已证明其使用尚未发布。