【问题标题】:Controllers naming convention in Laravel 5Laravel 5 中的控制器命名约定
【发布时间】:2015-09-03 10:09:41
【问题描述】:

Laravel 5 中的所有控制器仍然以Controller 后缀命名,例如AuthControllerPasswordController。是否有任何理由使用自己的控制器遵循此约定,或者这些后缀只是前命名空间时代的遗留物?

我大部分时间都使用基于操作的 URL 生成,所以我避免像 url('home') 这样的链接,而是更喜欢像 action('HomeController@index) 这样的链接。这样我就可以轻松更改 URL 模式。

但是action('Home@index') 优雅得多。背后有什么陷阱?

【问题讨论】:

  • “这样我就可以轻松更改 URL 模式。”你现在不能不头疼地更改控制器类名称,而且我倾向于重构控制器而不是我的 URL。
  • @MartinBean 我不明白你的意思。我没有重构任何东西,我说的是在开发过程中可以随时更改 URL,所以如果我决定 - 比如说 - 将 /login 更改为 /sign-in。当我以动作为基础时,这非常容易。命名路由会更加灵活,但我不喜欢命名路由。
  • 您的网址不应更改。为什么要破坏缓存、搜索结果和用户书签?不过,您的代码可能会更改,并且有时代码更改包括重命名类。因此,如果您使用基于操作的链接并更改了控制器的名称,您将不得不更新指向该控制器的每个链接。

标签: php laravel model-view-controller laravel-5


【解决方案1】:

无需添加 Controller 后缀。如果真的需要的话,当你通过artisan创建Controller的时候,它会自动添加,或者报错,其实不是。所以,请随意(但请记住,如果您想要一个控制器“Dog”并且有一个模型“Dog”......嗯,这会很复杂)。

【讨论】:

  • 当我有 Dog 模型和 Dog 控制器时,它有多复杂? :) 它们会位于不同的命名空间中,所以没什么大不了的。
  • 当然,如果您愿意,您可以将所有文件命名为相同的名称,只需更改目录和命名空间即可。我并不是说这是不可能的,但是您正在使用您喜欢的文本编辑器打开多个文件,很难分辨哪个是带有模型的文件,而哪个是带有控制器的文件。或者服务。或者css。你甚至不需要用 .css 命名你的样式文件,你知道的。只需将其命名为 Password.php。嘿,这很有趣!
  • 我使用 Sublime Text,我只需点击 cmd+p 并输入 controllerdog(或更短),我就会知道它是一个控制器,因为它们位于 Http/Controller 文件夹中。我认为这对您的工作流程没有太大影响。
  • 我认为它复杂的主要原因是Dog控制器通常需要Dog模型,所以如果你用use导入Dog模型,你将不得不别名它:namespace Controllers; use Models\Dog as DogModel; class Dog extends Controller {} 有点东西。但是,是的,你可以做任何你想做的事情。
  • 那么添加“Controller”作为后缀而不是前缀可能是个好主意:当你写“dog”时,你会得到 dogController.php 和 Dog.php。无论如何,没有任何技巧,但请记住为什么约定是有用的。
【解决方案2】:

无需添加控制器后缀。这只是用户认可。这样我们就可以很容易地得到它是一个控制器。您通常可以创建 Home 而不是 HomeController。 action('Home@index') 将完美运行。但是 Laravel 中的模型是不同的。如果您的模型名称是单数,则您的表名将是复数。这也不是强制性的。但是如果我们在后缀中添加Controller,最好使用控制器和模型。因为我们将在控制器中添加use homeuse app\home。这会让我们感到困惑。

【讨论】:

  • 我仍然认为模型和控制器同名并不是保留后缀的理由。这不是命名空间哲学。在这些情况下,我会使用 use App\Http\Controllers\Dog as DogController 之类的东西——这样你只会污染带有后缀的导入部分,而不是整个类。
  • 我也说过。我说过,如果我们的控制器和模型名称相同,那会造成混淆。
【解决方案3】:

在每个控制器类名的末尾加上Controller 确实感觉像是Hungarian notation 的一种类型。然而,一个类的名称应该快速而明确地告诉程序员它做了什么。 DogController 不是 Dog。事实上,我想不出比DogController 更好的名字了。

是的,它被命名为App\Http\Controllers\DogController,这似乎是双重处理,但是您多久考虑一次或通过其完全限定名称引用一个类?大多数情况下,类仅通过其类名来引用,PHP 甚至允许您在代码中使用 use App\Http\Controllers\DogController; 执行此操作,这将使 DogController 在您的代码中成为有效的类名。

话虽如此,Laravel 不会强迫你使用这个约定。如果您正在与其他程序员一起工作,您需要有一个约定的命名约定,并且使用 Laravel 是最简单的,也是大多数 Laravel 程序员已经熟悉的。

【讨论】:

    猜你喜欢
    • 2017-05-30
    • 1970-01-01
    • 1970-01-01
    • 2020-11-14
    • 2016-02-04
    • 2012-04-24
    • 2012-11-12
    • 2015-07-20
    • 1970-01-01
    相关资源
    最近更新 更多