【问题标题】:Controller inside a folder inside a folder not working (Codeigniter)文件夹内的文件夹内的控制器不起作用(Codeigniter)
【发布时间】:2016-07-06 15:34:08
【问题描述】:

我一直在使用 codeigniter 做得很好,但现在我遇到了一些障碍。我不想将所有内容都放在一个控制器文件中,而是想将其重新分配到子文件夹中的许多文件中。例如:

localhost/folderA/folderB/controllerFile

这样,文件夹 B 替换了控制器的主文件,所有文件都可以分散在这个新文件夹中,因为单个文件中不需要有 10 个不同的控制器功能(让它变得很大)。

在路线中我添加了一条新线

$route['folderA/folderB/(:any)/'] = 'folderA/folderB';

我什至认为没有必要添加路由,但它不起作用,无论如何总是得到一个 404 页面。现在,如果我通过文件夹将其带回,控制器的相同代码可以很好地工作。这意味着 /folderA/folderB/controllerFile 可以在 /folderA/controllerFile 中无忧无虑地工作。

我的目标不是将这些文件移到一个目录中,而是保持结构与以前相同。有没有人因为这样的事情而生气?我想是这样的......大声笑

感谢阅读!

编辑:为了澄清,这是发生了什么:

  /application/controllers/file.php (OK)
  /application/controllers/folderA/file.php (OK)
  /application/controllers/folderA/folderB/file.php (This does not work)

我可以做 /application/controllers/folderA/file.php 并在其中包含所有功能,因此它的工作方式如下:

localhost/folderA/file
localhost/folderA/file/functionb
localhost/folderA/file/functionc

但是当使用子子目录可以完成相同的结果时,这会使文件变得不必要地大。有意义吗?

【问题讨论】:

  • As per the documentation,只要所有控制器和包含控制器的子目录都在 controllers 目录中,您就可以拥有子目录。或者,使用 routes 配置文件,您可以构建 URL,使其看起来像您需要的任何内容。

标签: php codeigniter


【解决方案1】:

我不想将所有内容都放在一个控制器文件中,而是想将其重新分配到子文件夹中的许多文件中。 ...所有文件都可以分散在这个新文件夹中,因为单个文件中不需要有 10 个不同的控制器功能。

您已经可以将函数放入一个名为controllers 的目录下的多个控制器文件中。从来没有要求将所有功能放在一个控制器文件中。

默认所有控制器都存放在controllers目录下...

/application/controllers/

例子:

/application/controllers/Users.php
/application/controllers/Auth.php
/application/controllers/Etc.php

我什至认为没有必要添加路由,但它不起作用,无论如何总是得到一个 404 页面。

如果您想为控制器使用子目录,那么这些子目录必须包含在 controllers 目录中,并且您需要遵循文档。

/application/controllers/subfolderA/
/application/controllers/subfolderB/

As per the documentation:

如果您正在构建一个大型应用程序,您可能希望将控制器分层组织或构建到子目录中。 CodeIgniter 允许您这样做。

只需在 application/controllers/ 主目录下创建子目录,然后将控制器类放在其中。

使用此功能时,URI 的第一段必须指定文件夹。

您的每个子目录都可能包含一个默认控制器,如果 URL 仅包含子目录,则会调用该控制器。只需在其中放置一个与您的 default_controller 名称匹配的控制器,该名称在您的 application/config/routes.php 文件中指定。

CodeIgniter 还允许您使用其URI Routing 功能重新映射您的 URI。


编辑

我可以使用/application/controllers/folderA/file.php 并在其中包含所有功能,因此它的工作方式如下:

localhost/folderA/file
localhost/folderA/file/functionb
localhost/folderA/file/functionc

但是这会使文件变得不必要地大,而使用子子目录可以完成相同的结果。有意义吗?

您为什么一直在谈论“单个大文件”?您可以将您的函数分解为任意数量的控制器文件,而无需任何子目录...

/application/controllers/Users.php
/application/controllers/Auth.php
/application/controllers/Etc.php

分别通过 URL 访问

/users/function_foo
/auth/function_bar
/etc/function_foobar

然后使用routes.php,您可以实现任何您想要的复杂 URL...

$route['foldera/testPage/testing'] = 'users/function_foo';

但是,如果您想使用controllers 目录中的子目录...

/application/controllers/subdirectory/Controller_a.php

通过 URL 访问...

/subdirectory/controller_a/some_function

可以重新路由为你想要的任何东西...

$route['foo/bar/anything/here/tester/foobar'] = 'subdirectory/controller_a/some_function';

【讨论】:

  • 谢谢你,根据你的定义,我没有问题,因为我一直在做 /application/controllers/subfolderA/ 等...我的意思是我正在尝试获取 /application/controllers /subfolderA/subofasubfolder/controllerfile.php。这有意义吗?
  • @phpvillain,我认为 CodeIgniter 不会那样工作:文档仅将 first 段描述为代表子文件夹。您的 OP 提到了 10 个不同的控制器或功能; IMO,具有多个级别是不必要的冗长。
  • 是的,我最终找到了一种“开箱即用”的方法。我发布了答案 :) 感谢您的帮助,我不明白为什么您列出了不同的文件夹,然后我才恍然大悟。
  • @phpvillain,如果您只是想获得某个 URL,那么您不必担心将控制器文件埋在子目录中。您可以使用 routes.php 文件创建复杂的 URL,并将 10 个控制器留在控制器文件夹的根目录中。
【解决方案2】:

好的,所以我想出了使用 routes 的解决方案。虽然我不明白为什么 codeigniter 不允许 3 级文件夹,但我最终做的是在 /application/controllers/test/ 和我拥有的那个文件夹中创建一个新文件夹我的 test.php 文件。

然后我回到路由配置文件并添加以下行:

$route['foldera/testPage/testing'] = 'test/test';

当您将浏览器定向到页面时,它的有效作用是

http://localhost/foldera/testPage/testing

它将将该页面视为在 /application/controllers/test/test.php 中找到的页面

它基本上是给它一个别名。但是,如果你去 localhost/test/test 它不会有任何问题,并将其视为完全相同的文件夹a/testPage/testing.php 为了解决这个小问题,只需在路由配置文件中添加另一行

$route['test/test'] = 'notfound'; // Your 404 page controller

现在访问该文件夹的唯一方法是直接从您想要的 URL。哒哒!

【讨论】:

  • 有些事情你可以做,但我强烈建议不要做。其中之一是命名文件夹和其中的文件同名。特别是对于控制器和模型。虽然我在喋喋不休,但不要将模型命名为与控制器相同的名称。相反,它可以帮助命名包含视图或视图文件的文件夹,与调用它们的控制器相同或相似。没关系,因为你只加载视图——你从不调用它们的方法。
  • 您在这里真正获得了什么?换句话说,您可以使用路由来实现 same URL,而 not 让您的实际控制器文件深埋三层。
  • 嘿,另一方面,我也这样做。我有一个应用程序,其中有几个控制器“埋”在两个文件夹下。模型相同。我认为对于更大的应用程序,最好有文件夹来分开。良好的文件夹结构有助于使事情更容易理解。
  • 现在的不同之处在于,不是将控制器文件放在具有 10 个不同网页功能的子文件夹中,而是说功能 blogroll、功能 cmets、功能最近等...(全部在一页中)它们在自己的文件中隔开,但将其放在文件夹内的子文件夹中并不能与 codeigniter 完全兼容。查看我对 OP 所做的修改以进行澄清,但它完全符合我的要求 :)
  • “我不明白为什么 codeigniter 不允许 3 级文件夹” ~ 我猜 CodeIgniter 的开发人员只是决定控制器的一个子目录级别是足以满足其受众中的大多数用户。使用routes.php 可以实现更深的 URL 结构。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-11
  • 2018-06-22
  • 1970-01-01
  • 2018-02-23
  • 2012-06-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多