我刚刚下载了Laravel 5并开始迁移。然而,我发现必须使用名称空间真的很烦人。
我觉得除了让我的代码变得混乱之外,没有从中获得什么好处。
我该如何禁用名称空间要求?
我认为你不应该禁用或删除命名空间。命名空间的主要目的是避免与具有相同名称的类发生冲突。一旦应用程序变得更大,就会有具有相同名称的类。来自Framework源代码的示例:
Illuminate\Console\Application
和 Illuminate\Foundation\Application
两者都被称为相同的名称。只有通过使用命名空间,您才能导入正确的类。当然,您也可以将它们命名为:
ConsoleApplication
和 FoundationApplication
但是,通常只在文件顶部导入类时才使用命名空间:
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
来自动加载您的文件。
您可以通过在composer.json文件中定义全局命名空间来避免为自己的类使用命名空间。像这样:
"autoload": {
"psr-0": {
"": ["app/Http/Controllers/",
"app/models/",
"app/helpers"
]
},
protected $namespace = '';
ServiceA
有一个Client
,ServiceB
也有一个Client
。如果没有命名空间,你不能给它们起别的名字,只能叫做ServiceAClient
和ServiceBClient
。这样会让你的代码难以阅读和理解。简而言之,命名空间是很好的东西。 - Stan