我正在开发一个基于CakePHP 2.2的2.2应用程序。我创建了一些适合主应用程序的插件。在主应用程序中,我有一个动态菜单。现在我想让插件在这个菜单中显示op。
我认为,最好的方法是让插件在主应用程序中注册它的菜单项。然后主应用程序构建菜单(使用帮助器)。但我不确定该怎么做。有没有可能让一个插件与主应用程序交互,即使它的AppController没有被触及?我想要显示所有的插件,而不仅仅是当前的插件操作。
发布于 2012-10-20 18:15:22
这取决于您的实现细节。一般来说,你应该把一个插件看作是一个插件。这样你的应用程序就可以使用它了。以概念代码为例:
if(pluginAvailable('PagesPlugin')) {
$this->set('menu', $this->PagesPluginComponent->getMenuItems());
}您的应用程序可以依赖它,但也可以不在这里。这是插件的通用概念。在现实世界中,这要困难得多,因为你不能在没有菜单的情况下显示你的网页,这就产生了一个真正的依赖性。
插件应该是可重用的。
一些选项:
完全基于插件的页面结构
您创建了一个插件,该插件本身就包含表页面。该插件有一个加载菜单项的组件和一个支持显示菜单项的帮助器。
因此,在appcontroller中加载组件,在这里设置依赖项。在before_filer中,您加载菜单数据并将其发送到视图。
在您的default.ctp (或其他布局文件)中,您可以使用数据调用插件助手。
做一个requestAction
在插件控制器中创建一个方法并调用requestAction:http://book.cakephp.org/2.0/en/controllers.html#Controller::requestAction
所以你可以调用: yourplugin/menus/index,它会返回一个完整的MVC进程。因此,插件中的控制器从模型中获取菜单项,将数据发送到它的视图,然后在index.ctp中呈现菜单。您将在应用程序中返回HTML结果,这是完全完成的。
创建一个只有帮助器的插件
如果你想要模型中的数据,插件帮不了多少忙:如果你有一个复杂的函数,可以生成一个样式良好的菜单,你可以把它放在一个插件助手中。
在你的应用程序中,你自己在你的应用程序中加载,所以你在那里有所有的灵活性。您将其发送到视图,但您使用插件来呈现您的菜单。这样你就可以重新使用你的菜单助手,也不会有问题。
让appController扩展您的插件appController
我不喜欢它,但它是可能的:你可以在你的插件中创建一个新的AppController,它处理设置菜单和所有其他事情。然后,您的应用程序appController可以扩展该版本,而不是普通的AppController扩展控制器。所以你会得到: AppController扩展了yourPluginAppController。不过,我通常不喜欢这种模式,因为调用和依赖关系不再可见,而是真正自动添加和执行。
可选:为了获得更灵活的工作方式,CakePHP添加了新的: Events http://book.cakephp.org/2.0/en/core-libraries/events.html,这非常有趣。例如,您可以将有趣的事件放在appcontroller中,并在插件中附加侦听器。这将使您从调用这些方法的硬编码中解脱出来。因此,这可能会起作用,但它是相当新的,有一些小故障,因为它是全新的。文档还不完整,对它的验证用法也没有发布太多。
https://stackoverflow.com/questions/12987298
复制相似问题