Laravel到处都是必需的命名空间吗?

时间:2014-09-15 13:44:15

标签: php laravel namespaces

我是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 /文件夹中并且如果控制器需要覆盖标准系统的模型,那么使用命名空间会是完全疯狂吗?

2 个答案:

答案 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控制器在每个文件顶部需要的每个存储库,或者每次引用时都指定完全限定的类名。