修改 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
我不知道你在做什么,但看起来你的 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 项目。如果我不能轻易做到这一点,我可能把控制器或模型弄得太复杂了。
制作新工具应该更容易,而不是更难。这就是“选项三角形”。如果我的选择范围越窄(因此,接近三角形的尖端部分),我越深入这个项目,我可能做错了。如果我的选择范围扩大,我可能会做得更好。
通常的反对意见是这些东西永远不会相互作用。那么,那就是代码管理和部署的问题了。如果它们真的是两个独立的东西,我宁愿它们实际上是分开的。虽然我并不总是如愿以偿(也许甚至不经常 ;)也许你也不如愿以偿。
我希望能够从默认的 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
我不知道你在做什么,但看起来你的 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 项目。如果我不能轻易做到这一点,我可能把控制器或模型弄得太复杂了。
制作新工具应该更容易,而不是更难。这就是“选项三角形”。如果我的选择范围越窄(因此,接近三角形的尖端部分),我越深入这个项目,我可能做错了。如果我的选择范围扩大,我可能会做得更好。
通常的反对意见是这些东西永远不会相互作用。那么,那就是代码管理和部署的问题了。如果它们真的是两个独立的东西,我宁愿它们实际上是分开的。虽然我并不总是如愿以偿(也许甚至不经常 ;)也许你也不如愿以偿。