Laravel 5中的控制器命名规范

5
在Laravel 5中,所有控制器的名称仍带有“Controller”后缀,例如“AuthController”和“PasswordController”。是否有任何理由在自己的控制器中遵循这种惯例,或者这些后缀只是前命名空间时代的残留物?
我大多数时候使用基于操作的URL生成,因此我避免像“url('home')”这样的链接,而更喜欢类似“action('HomeController@index)”这样的链接。这样我就可以轻松更改URL模式。
但是,“action('Home@index')”更加优雅。背后有什么陷阱吗?

“这样我就可以轻松地更改URL模式,不必再头疼了。”现在你不能轻松地更改控制器类名,而且我倾向于对控制器进行更多的重构,而不是我的URL。 - Martin Bean
@MartinBean 我不明白你的意思。我没有重构任何东西,我只是在谈论在开发过程中随时能够更改URL的能力,所以如果我决定 - 比如说 - 将“/login”更改为“/sign-in”。当我使用actions作为基础时,这非常容易。如果使用命名路由,它将更加灵活,但我不喜欢使用命名路由。 - Robo Robok
你的URL不应该改变。为什么要破坏缓存、搜索结果和用户的书签呢?但是你的代码可能会发生变化,有时候包括重命名类。因此,如果你正在使用基于动作的链接,并且更改了控制器的名称,那么你将不得不更新指向该控制器的每个链接。 - Martin Bean
3个回答

4

不需要添加Controller后缀。如果真的需要,当你通过Artisan创建一个Controller时,它会自动添加或者报错,但实际上并没有这么做。所以,可以随意命名(但请记住,如果你想要一个名为“Dog”的控制器,而已经有一个名为“Dog”的模型,那么就会变得复杂)。


当我有狗模型和狗控制器时,这会变得复杂吗? :) 它们将位于不同的命名空间中,所以没什么大不了的。 - Robo Robok
当然,如果你愿意,你可以用相同的名称命名所有文件,只需更改目录和命名空间。我并不是说这是不可能的,但是如果你使用多个文件打开的文本编辑器,很难分辨哪一个是具有模型的文件,哪一个是具有控制器的文件。或者服务。或CSS。你甚至不需要将样式文件命名为.css,你知道吗?只需将其称为Password.php。嘿,这可能很有趣! - Amarnasan
我使用Sublime Text,只需按下 cmd+p ,然后键入 controllerdog(或更短),我就会知道它是控制器,因为它们位于 Http/Controller 文件夹中。在您的工作流程中,我认为这并不会产生太大影响。 - Robo Robok
3
我认为它变得复杂的主要原因是Dog控制器通常需要Dog模型,因此如果你使用use导入Dog模型,你将不得不给它起一个别名:namespace Controllers; use Models\Dog as DogModel; class Dog extends Controller {}这样的东西。但是是的,你可以做任何想做的事情。 - alexrussell
也许将“Controller”作为后缀而不是前缀是个好主意:当你写下“dog”时,你会得到dogController.php和Dog.php两个文件。无论如何,并没有什么诡计,但要记住惯例的有用之处。 - Amarnasan
但我没有添加任何前缀。控制器文件是Dog.php,类是App\Http\Controllers\Dog。这就是Sublime Text搜索文件的方式 - 您只需键入完整路径的一部分即可。我甚至可以只输入“condog”,很有可能它将匹配到这个唯一的Dog控制器文件。 - Robo Robok

1

在每个控制器类名的结尾加上Controller确实感觉像是一种匈牙利命名法。然而,一个类的名称应该能够快速、明确地告诉程序员它的作用。一个DogController并不是一个Dog。事实上,我想不出比DogController更好的名称了。

是的,它被命名空间为App\Http\Controllers\DogController,看起来像是重复处理,但你有多经常考虑或引用一个类的完全限定名称呢?大多数情况下,一个类只是通过它的类名来引用,并且PHP甚至允许你在代码中使用use App\Http\Controllers\DogController;来使DogController成为你代码中有效的类名。

话虽如此,Laravel不会强制你使用这个约定。如果你与其他程序员一起工作,你需要有一个约定好的命名规范,而使用Laravel的命名规范既是最简单的,也是大多数Laravel程序员已经熟悉的命名规范。


0

不需要添加控制器后缀。这只是用户识别。这样我们就可以轻松地知道它是一个控制器。您可以正常创建Home而不是HomeController。并且action('Home@index')将完美地工作。但是,在Laravel中,模型是不同的。如果您的模型名称是单数,则表名将是复数形式。这也不是强制性的事情。但是,如果我们在后缀中添加控制器,最好使用控制器和模型。因为我们将在控制器中添加use homeuse app\home。这会让我们感到困惑。


我仍然认为,模型和控制器具有相同的名称并不是保留后缀的理由。这不是命名空间哲学所追求的。在这些情况下,我会使用类似于 use App\Http\Controllers\Dog as DogController 的方式 - 这样你只会在导入部分中添加后缀,而不是整个类。 - Robo Robok
我也说过了。如果我们的控制器和模型名称相同,那会让人感到困惑,这一点我也提到过。 - Praveen Srinivasan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接