我是CakePHP新手。这个网站的菜单是否合理和传统?

我是CakePHP新手。这个网站的菜单是否合理和传统?,php,cakephp,cakephp-2.0,cakephp-model,Php,Cakephp,Cakephp 2.0,Cakephp Model,我需要一些反馈来确保我没有完全忽略CakePHP/MVC的要点 我正在用CakePHP设计一个迷你cms,基本上是一个相册。我希望有一个标准的,锅炉板下拉菜单上的每一页。当然,当用户删除和添加相册时,菜单需要是动态的 我的目标是:构建与View::actionRequest相反的东西,即在视图呈现之前,让控制器将一个设置变量推送到视图类,而不是视图回调控制器。我的理解是View::requestAction不是很优雅,而且相当缓慢 这是包含菜单关键字的表的模型。app/Model/modeleI

我需要一些反馈来确保我没有完全忽略CakePHP/MVC的要点

我正在用CakePHP设计一个迷你cms,基本上是一个相册。我希望有一个标准的,锅炉板下拉菜单上的每一页。当然,当用户删除和添加相册时,菜单需要是动态的

我的目标是:构建与View::actionRequest相反的东西,即在视图呈现之前,让控制器将一个设置变量推送到视图类,而不是视图回调控制器。我的理解是View::requestAction不是很优雅,而且相当缓慢

这是包含菜单关键字的表的模型。app/Model/modeleItem.php

因为我希望它无处不在,所以我将调用放在AppController中

这是一个元素,它被转储到CSS默认布局的顶部 -元素文件:app/View/Element/navigation.ctp -布局:app/View/Element/Layout/default.ctp


最后,我得到了一个可爱的列表,上面列出了表中的所有项目。我把事情搞砸了吗?我全错了吗?我不知道。

我看你的方法没有任何问题。以下是一些注释,完全可选:

我会将获取代码的菜单从beforeFilter移动到。没有理由这么早就这么做,您可能会在需要菜单之前抛出异常,或者您可能会将用户重定向到另一个页面。此外,您还有关于请求的更多信息,因此可以在菜单中突出显示当前页面/项目/用户。 将元素渲染代码移动到某种菜单帮助器中,这将使布局更干净,例如$this->Menu->render在布局中。您还可以使用HtmlHelper通过cake呈现项目,并让cake负责标记的正确性。 如果将渲染移动到辅助对象中,则可以为整个过程实现某种缓存方案,以加快速度(如果必要的话)。缓存是否可行,或者您是否应该在控制器或助手中进行缓存,完全取决于您和您的应用程序:
我猜总体建议是尝试将部分功能与应用程序的其余部分隔离开来;它更易于阅读、维护和修改。

我看不出你的方法有任何错误。以下是一些注释,完全可选:

我会将获取代码的菜单从beforeFilter移动到。没有理由这么早就这么做,您可能会在需要菜单之前抛出异常,或者您可能会将用户重定向到另一个页面。此外,您还有关于请求的更多信息,因此可以在菜单中突出显示当前页面/项目/用户。 将元素渲染代码移动到某种菜单帮助器中,这将使布局更干净,例如$this->Menu->render在布局中。您还可以使用HtmlHelper通过cake呈现项目,并让cake负责标记的正确性。 如果将渲染移动到辅助对象中,则可以为整个过程实现某种缓存方案,以加快速度(如果必要的话)。缓存是否可行,或者您是否应该在控制器或助手中进行缓存,完全取决于您和您的应用程序:
我猜总体建议是尝试将部分功能与应用程序的其余部分隔离开来;它更易于阅读、维护和修改。

当您在布局/视图中输出菜单时,我会将其打包到一个元素中,并使用请求操作获取数据:

/app/View/Elements/main_menu.ctp:

$mainMenuItems = $this->requestAction('/menu_items/buildMainMenu');

<ul id="navigation">
    <?php
    foreach($mainMenuItems as $item) {
        echo "<li>".$item['MenuItem']['name']."</li>";
    }
    ?>
</ul>

这样,如果您的视图/布局(例如Ajax)不需要菜单,则不会浪费数据库查询。

我会将其打包到元素中,并在您在布局/视图中输出菜单时使用请求操作获取数据:

/app/View/Elements/main_menu.ctp:

$mainMenuItems = $this->requestAction('/menu_items/buildMainMenu');

<ul id="navigation">
    <?php
    foreach($mainMenuItems as $item) {
        echo "<li>".$item['MenuItem']['name']."</li>";
    }
    ?>
</ul>

这样,如果您的视图/布局(例如Ajax)不需要菜单,您就不会浪费数据库查询。

+1对于beforeRender移动,将内容传递到视图不应在beforeFilter中完成+1对于beforeRender移动,将内容传递到视图不应在beforeFilter中完成
<ul id="navigation">
    <?php
    foreach($mainMenuItems as $item) {
        echo "<li>".$item['MenuItem']['name']."</li>";
    }
    ?>
</ul>
$mainMenuItems = $this->requestAction('/menu_items/buildMainMenu');

<ul id="navigation">
    <?php
    foreach($mainMenuItems as $item) {
        echo "<li>".$item['MenuItem']['name']."</li>";
    }
    ?>
</ul>
echo $this->Element('main_menu');