Прежде всего: пространства имен не являются произведением Laravel, но функция PHP создана для лучшей организации нашего кода.
Итак, если вы хотите, чтобы ваш код организовывался, вы должны использовать пространства имен для всего и, да, вам придется добавлять предложения «use» в верхней части большинства ваших файлов PHP. Но в Laravel вы также можете быть свободными, чтобы не использовать пространство имен на всех, вы просто должны добавить свои классы автозагрузки каталоги в свой composer.json
файл:
"autoload": {
"classmap": [
"models"
],
},
Execute
composer dumpautoload
Так композитор прочитал все файлы папка модели, чтобы создать карту класса из них, а затем вы можете просто бросить все используют пункты:
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, где люди обычно не используют пространства имен, являются контроллеры, но это также меняется в Laravel 5, где контроллеры будут помещаться по умолчанию по умолчанию, но все же у вас будет возможность не использовать их, потому что это это композитор/PHP, а не Laravel.
У Тейлора Отуэлла есть 3 большие вещи, которые всегда нужно учитывать при создании функций и развитии Laravel: лучшие практики, быстрое кодирование и красивый код.
EDIT
Отвечая на Ваш комментарий, если все контроллеры необходимо иметь доступ к некоторой службе или даже модели, почему бы не добавить его в BaseController?
Но вам, возможно, придется прочитать в шаблоне репозитория, потому что ваши контроллеры не должны действительно знать ваши модели. Разработчики теперь создают новый слой (репозиторий) между контроллерами и моделями и выполняют операции в этих слоях.Вы также можете использовать Laravel Dependency Injection, чтобы помочь вам с теми предложениями 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);
}
}
И вы должны сказать Laravel Dependency Injection, что экземпляр, когда он нуждается в EntityRepositoryInterface
:
App::bind('EntityRepositoryInterface', 'Foo\Entities\EntityRepository');
Они не обязательно в Laravel, но они помогут вам организовать ваш код .... и вы не нужно 'use', но может ссылаться на каждый объект по своему пространству имен непосредственно в коде или указывать пространство имен в верхней части класса –
. Я верю в 4.3, они понадобятся. – user3158900