Laravel 5 命名空间

10

我刚刚下载了Laravel 5并开始迁移。然而,我发现必须使用名称空间真的很烦人。

我觉得除了让我的代码变得混乱之外,没有从中获得什么好处。

我该如何禁用名称空间要求?


2
ServiceA 有一个 ClientServiceB 也有一个 Client。如果没有命名空间,你不能给它们起别的名字,只能叫做 ServiceAClientServiceBClient。这样会让你的代码难以阅读和理解。简而言之,命名空间是很好的东西。 - Stan
1
使用命名空间是保持代码组织良好的一个非常好的实践。 - manix
3
我知道这一点,但在我正在处理的项目中并不需要它。 它只会让代码变得更加复杂而已... 而且作为Sublime Text用户,它没有自动导入功能,这真的很痛苦。 - Maeh
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Parziphal
包应该要求使用命名空间,但核心模型可以选择性地不使用。无论你持何种观点,问题并不是是否需要,而是如何禁用它。 - Sabrina Leggett
2个回答

20

我认为你不应该禁用或删除命名空间。命名空间的主要目的是避免与具有相同名称的类发生冲突。一旦应用程序变得更大,就会有具有相同名称的类。来自Framework源代码的示例:

Illuminate\Console\ApplicationIlluminate\Foundation\Application

两者都被称为相同的名称。只有通过使用命名空间,您才能导入正确的类。当然,您也可以将它们命名为:

ConsoleApplicationFoundationApplication

但是,通常只在文件顶部导入类时才使用命名空间:

use `Illuminate\Console\Application`

这个名字在代码中无处不在。这真的会让你的代码混乱不堪,类名太长了。

除了命名问题以外,命名空间还可以鼓励更好的结构,并帮助确定文件所在位置。这是因为 Laravel 的默认结构符合 PSR-4 标准。这意味着如果你有一个控制器 App\Http\Controllers\HomeController,那么你可以肯定地找到 app/Http/Controllers 下的 HomeController.php 文件。

我知道这点,但在我正在开发的项目中并没有必要。

也许对于当前的项目来说没有意义,但习惯使用命名空间会帮助你应对将来更大的项目。

而且作为 Sublime Text 用户,它没有自动导入功能,这真的很痛苦。

我不太了解 Sublime Text,但 CodeIntel 或许有自动导入功能。否则考虑换一个编辑器/IDE。我强烈推荐 JetBrains PhpStorm。


最终,如果你仍然不想使用命名空间,请继续使用 Laravel 4,或者寻找另一个遵循更少好的实践的框架…


从应用程序类中移除命名空间

虽然我不建议这样做,但是至少可以在应用程序中删除一些命名空间。

例如,默认控制器命名空间App\Http\Controllers 可以在 RouteServiceProvider 中更改为没有命名空间:

protected $namespace = '';

对于您的模型,您只需从文件中删除命名空间,就可以了。但请记住,如果没有命名空间,则 PSR-4 自动加载将不再起作用。您必须在 composer.json 中使用 classmap 来自动加载您的文件。


6
命名空间很好,但在新项目上强制实施庞大的Symfony-ish结构则不是。简单和无杂乱是L2-3-4令人感到温馨的特点,但现在已经更新到5了,无法回到过去了。 - pandasauce
@pandasauce,很遗憾你有这样的感觉。我在如何删除Laravel 5中的一些命名空间方面添加了一点内容。请查看更新后的答案。 - lukasgeiter
@Maeh 也祝你一切顺利,我已经更新了答案,并提供了一些有关如何删除命名空间的信息。 - lukasgeiter
5
或者寻找另一个遵循较少好的实践的框架。+1 - Guilherme Nascimento
命名空间在开发包和库时非常有用,但对于核心应用程序代码并不是必需的。人们需要更加区分包的编码风格。我看到一些初级开发人员过于专注于使用“命名空间”等功能,以至于其余的代码质量很差,无法正常运行或维护。 - Sabrina Leggett

2
您可以通过在composer.json文件中定义全局命名空间来避免为自己的类使用命名空间。像这样:

您可以通过在composer.json文件中定义全局命名空间来避免为自己的类使用命名空间。像这样:

"autoload": {
    "psr-0": {
    "": ["app/Http/Controllers/",
        "app/models/",
        "app/helpers"
        ]
},

您还需要修改您的app/Providers/RouteServiceProvider.php文件,如下所示:
protected $namespace = '';

为了使路由工作,需要进行以下操作。

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