gpt4 book ai didi

php - Laravel 中是否到处都需要命名空间?

转载 作者:行者123 更新时间:2023-12-04 17:03:16 25 4
gpt4 key购买 nike

我是 Laravel 和命名空间的新手,但一位同事告诉我我必须使用命名空间并将我的所有模型放在应用程序目录中的一个文件夹中,以项目命名。

据我所知,这意味着在每个使用一个或多个模型的 Controller 中,必须为我的 Controller 需要的每个模型设置“使用”。例子:

<?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/文件夹中并且如果 Controller 需要覆盖标准系统的模型,那么使用命名空间是不是很疯狂?

最佳答案

首先要做的是:命名空间不是 Laravel 的东西,而是为了更好地组织我们的代码而创建的 PHP 特性。

因此,如果您希望代码井井有条,您应该为所有内容使用命名空间,是的,您必须在大多数 PHP 文件的顶部添加“use”子句。但是在 Laravel 中你也可以完全不使用命名空间,你只需要将你的自动加载类目录添加到你的 composer.json 中。文件:

"autoload": {
"classmap": [
"models"
],
},

执行
composer dumpautoload

因此 Composer 读取模型文件夹中的所有文件,以创建它们的类映射,然后您可以删除所有 uses 子句:
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 . Laravel 中人们通常不使用命名空间的唯一“部分”是 Controller ,但这在 Laravel 5 中也发生了变化,默认情况下 Controller 将使用命名空间,但您仍然可以选择不使用它们,因为这是 Composer/PHP 的东西,而不是 Laravel。

Taylor Otwell 在创建功能和发展 Laravel 时始终牢记 3 件大事:最佳实践、快速编码和漂亮的代码。

编辑

回答您的评论,如果 全部 您的 Controller 需要访问某些服务甚至模型,为什么不将其添加到您的 BaseController 中?

但是您可能需要阅读存储库模式,因为您的 Controller 不应该真正了解您的模型。开发人员现在正在 Controller 和模型之间创建一个新层(存储库),并在这些层中执行操作。您也可以使用 Laravel 依赖注入(inject)来帮助您解决这些问题 use你不喜欢的条款。

它会是这样的:

创建存储库接口(interface):
interface EntityRepositoryInterface {

}

创建存储库:
use Foo\Entities\Entity;

class EntityRepository {

public function find($id)
{
return Entity::find($id);
}

public function all()
{
return Entity::all();
}

}

使用您的存储库创建您的 Controller :
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);
}

}

并且您必须告诉 Laravel 依赖注入(inject)在需要 EntityRepositoryInterface 时要实例化什么:
App::bind('EntityRepositoryInterface', 'Foo\Entities\EntityRepository');

关于php - Laravel 中是否到处都需要命名空间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25849552/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com