我是Laravel和名称空间的新手,但是一位同事告诉我,我必须使用命名空间并将我的所有模型放在app目录中以项目命名的文件夹中。
据我所知,这意味着在每个使用一个或多个模型的控制器中,必须设置"使用"对于我的控制器需要的每个型号例如:
<?php
use Foo\Entities\Entity;
use Foo\Entities\Inheritance;
use Foo\Entities\Type;
class EntitiesController extends BaseController {
public function index()
{
$inheritances = Inheritance::all();
$entities = Entity::all();
return View::make('settings/entities')
->with('entities', $entities)
->with('inheritances', $inheritances);
}
}
如果我们假设上面的相关模型将在任何地方使用,将模型放在/ app / model /文件夹中并且如果控制器需要覆盖标准系统的模型,那么使用命名空间会是完全疯狂吗?
答案 0 :(得分:1)
首先要做的事情是:名称空间不是Laravel,而是为了更好地组织代码而创建的PHP功能。
所以,如果你希望你的代码有条理,你应该使用名称空间来做所有事情,是的,你必须添加&#39;使用&#39;大多数PHP文件顶部的子句。但是在Laravel中你也可以完全不使用命名空间,你只需要将自动加载类目录添加到composer.json
文件中:
"autoload": {
"classmap": [
"models"
],
},
执行
composer dumpautoload
So Composer读取模型文件夹中的所有文件,创建它们的类映射,然后您可以删除所有使用子句:
class EntitiesController extends BaseController {
public function index()
{
$inheritances = Inheritance::all();
$entities = Entity::all();
return View::make('settings/entities')
->with('entities', $entities)
->with('inheritances', $inheritances);
}
}
如今,要在PHP应用程序中不使用名称空间,可能会被视为code smell。唯一的&#39;部分&#39; Laravel中人们通常不使用命名空间的是控制器,但是在Laravel 5中也会发生变化,默认情况下控制器将被命名空间,但是,您仍然可以选择不使用它们,因为这是一个Composer / PHP的东西,不是Laravel。
Taylor Otwell在创建功能和不断发展的Laravel时始终牢记三件大事:最佳实践,快速编码和漂亮的代码。
修改强>
回答您的评论,如果所有您的控制器需要访问某些服务甚至模型,为什么不将它添加到您的BaseController?
但您可能必须阅读存储库模式,因为您的控制器不应该真正了解您的模型。开发人员现在在控制器和模型之间创建一个新层(存储库),并在这些层中执行操作。您也可以使用Laravel依赖注入来帮助您处理那些您不喜欢的use
条款。
这将是这样的:
创建存储库界面:
interface EntityRepositoryInterface {
}
创建存储库:
use Foo\Entities\Entity;
class EntityRepository {
public function find($id)
{
return Entity::find($id);
}
public function all()
{
return Entity::all();
}
}
使用您的存储库创建控制器:
class EntitiesController extends BaseController {
public function __construct(EntityRepositoryInterface $entityRepository)
{
$this->entityRepository = $entityRepository;
}
public function index()
{
$entities = $this->entityRepository->all();
return View::make('settings/entities')
->with('entities', $entities);
}
}
当你需要EntityRepositoryInterface
时,你必须告诉Laravel Dependency Injection要实例化的内容:
App::bind('EntityRepositoryInterface', 'Foo\Entities\EntityRepository');
答案 1 :(得分:0)
将模型放在任何你喜欢的地方都没有错。事实上,我把所有我的模型直接从Eloquent扩展到app/models
。您可以在自己的项目中自由地遵循这一点,或者不遵循它。
但是,这确实有一个警告。我的课程中很少有人直接与这些模型进行交互(Repositories几乎就是这样)。那些我确实放入了单独的命名空间,然后injected进入我的控制器。因此,我必须use
控制器在每个文件顶部需要的每个存储库,或者每次引用时都指定完全限定的类名。