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