Laravel:模型名称和内置外观之间的冲突

ewo*_*wok 5 conflict models laravel eloquent

我的 Laravel 应用程序中有一个名为Event. 正如我刚刚发现的那样,这会在我的模型和Illuminate\Support\Facades\Event内置外观之间产生冲突。这里显而易见的解决方案是更改我的模型的名称,这并不理想,因为我真的没有其他名称可以给我的模型有意义,或者将别名重命名app.php为 for Illuminate\Support\Facades\Event,我想避免这种情况因为害怕破坏将来可能依赖该别名的任何东西(恐怕我可能会忘记)。

有人建议也许我可以使用命名空间,我尝试如下:

应用程序/模型/Event.php

namespace Models; #<-- I've also tried using "\Models" here

class Event extends \Eloquent{
Run Code Online (Sandbox Code Playgroud)

应用程序/数据库/种子/DatabaseSeeder.php

Models\Event::create();  #<-- again, I've also used "\Models\Event"
Run Code Online (Sandbox Code Playgroud)

所有4个以上的组合已经产生了Class 'Models\Event' not found,当我运行错误php artisan db:seed

也许我只是没有正确理解命名空间,但更紧迫的问题是如何解决我的问题。如果它可以按照建议使用命名空间来解决,那就太好了,但我也愿意接受任何其他想法。

mik*_*ner 4

我很早就犯了这个错误,不一定理解命名空间在整个应用程序中的作用。

命名空间应该标记应用程序本身的域或职责内的业务逻辑,因此提供模型的命名空间不一定有用。相反,创建一个以应用程序、您的公司、您或您喜欢的任何名称命名的根命名空间,然后提供模型子命名空间。

例如:

namespace MyGreatApp\Models;

class Event extends \Eloquent{ }
Run Code Online (Sandbox Code Playgroud)

然后您可以在以下位置引用该模型:

use MyGreatApp\Models\Event;

$event = new Event();
Run Code Online (Sandbox Code Playgroud)

从长远来看,这是一种更干净、更有组织的方法。但这确实意味着将您的模型移动到不同的文件夹中。但这并没有什么问题。至少这样您就知道您的 MyGreatApp 命名空间中拥有所有自定义代码。:)

  • 1)是的。使用使用...; 语句只是创建一个别名,因此您不必一直将其写出来。2)两者。它将您的代码与框架分开,让您更轻松地移动它,还可以使应用程序中的代码更清晰,组织更好。3) 不,只需将您的自定义代码移至该文件夹中。起初,您可能只会从命名空间中几乎没有任何代码的小项目开始,但是当您从控制器中删除所有逻辑时,您将在命名空间中为此创建类。:) 欢迎回到 PHP,我经历了同样的旅程。 (2认同)