修改 Mojolicious 中的默认 Controller/Model 路径

Modify default Controller/Model paths in Mojolicious

我希望能够从默认的 Mojolicious 路径中移动控制器、模型等:

  - App
    - Controller
      - Namespace1
        - ...
      - Namespace2
        - ...
    - Model
      - Namespace1
        - ...
      - Namespace2
        - ...

变成更易于管理的东西,例如:

  - App
    - Namespace1
      - Controller
        - ...
      - Model
        - ...
    - Namespace2
      - Controller
        - ...
      - Model
        - ...

所以不用

$r->any('/api/test')->to('Namespace1::Controller1#test');

我可以这样调用

$r->any('/api/test')->to('App::Namespace1::Controller1#test');

如何在 Mojolicious 中做到这一点?

原来可以这样指定命名空间:

    $r->any('/api/test')->to(
        namespace => 'App::Namespace1',
        controller => 'Controller::Controller1',
        action => 'test'
    );

将从控制器调用 test 方法 App::Namespace1::Controller::Controller1

详情见Mojolicious Routing

我不知道你在做什么,但看起来你的 Mojo 应用程序中可能也有模式代码。也许不是,但我已经多次看到这种模式。如果这不适用于您,请忽略它。它当然适用于可能阅读您问题答案的其他人。

首先,我和你一样做了:在to()中指定前缀命名空间。我更喜欢它,因为它可以帮助我(和其他人)在有很多控制器命名空间(以及消除命名空间冲突)的项目中找到 class。

您还可以推送命名空间前缀:

push @{$app->routes->namespaces}, 'MyApp::MyController';

人们倾向于将几个不同的服务推到一个单一的 Mojo 应用程序中,最终导致某种冲突。例如,考虑两组完全不同的路由,它们都希望以 /api 开头但彼此无关。

控制器在那里接收和控制交易,如果他们只关心这一点就更好了。更好通常意味着“我必须减少输入才能获得我想要的文件”。但是,这也意味着模型不应绑定到任何特定的控制器。一个好的模型应该是独立的和可重用的。这就是他们关注点分离的重点。

- App
    - Controller
      - MajorPartOfApp
        - ...
      - UnrelatedPartOfApp
        - ...
    - Model
      - NotTiedToAnyController
      - StillNotTiedToAnyController

当模型不是独立的,并且专门为特定控制器(或一组控制器)服务时,重用会变得混乱。我宁愿拥有通用模型。假设您为应用程序添加了另一个主要部分,但是来自现有控制器的模型可以处理它。现在命名约定被打破了,因为你正在跨越与你的任务无关的命名空间。或者,我看到人们创建了使用相同来源但具有不同界面的其他模型。重复代码。

as an aside: forget about syntax and statements when you talk about code readability. I'd trade some hard-to-grok code for better project structure so I don't have to look in weird places for code I should use. For instance, why would I look in CatStuff.pm when I need to do things with dogs? Poor architecture and organization is more painful to me.

我倾向于喜欢命令行程序,所以我喜欢从终端执行网络应用程序启用的相同任务。而且,这是代码分离的真正测试。我可以使用相同的组件来制作终端工具吗?如果控制器和模型是轻量级包装器,这意味着我可以轻松地将它们包装的东西用于完全不同的非 Mojo 项目。如果我不能轻易做到这一点,我可能把控制器或模型弄得太复杂了。

制作新工具应该更容易,而不是更难。这就是“选项三角形”。如果我的选择范围越窄(因此,接近三角形的尖端部分),我越深入这个项目,我可能做错了。如果我的选择范围扩大,我可能会做得更好。

通常的反对意见是这些东西永远不会相互作用。那么,那就是代码管理和部署的问题了。如果它们真的是两个独立的东西,我宁愿它们实际上是分开的。虽然我并不总是如愿以偿(也许甚至不经常 ;)也许你也不如愿以偿。