2014-09-15 2 views
0

Im новое для 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); 
    } 

} 

Если мы предполагаем, что связанные с выше модели будут использоваться везде, было бы совершенно сумасшедшим, чтобы поставить модели в/приложении/модель/папке и если контроллеру нужна модель, которая перезаписывает стандарт системы, а затем использовать пространства имен?

+0

Они не обязательно в Laravel, но они помогут вам организовать ваш код .... и вы не нужно 'use', но может ссылаться на каждый объект по своему пространству имен непосредственно в коде или указывать пространство имен в верхней части класса –

+0

. Я верю в 4.3, они понадобятся. – user3158900

ответ

0

Нет ничего плохого в размещении ваших моделей в любом месте. Фактически, я поместил все мои модели, которые распространяются непосредственно от Eloquent в app/models. Вы можете следить за этим или не следовать ему в своем собственном проекте.

Однако это действительно оговорка. Очень немногие из моих классов фактически напрямую взаимодействуют с этими моделями (Repositories - это в значительной степени). Те, что я помещаю в отдельные пространства имен, которые затем injected в мои контроллеры. Следовательно, я должен либо use каждого репозитория, что контроллер должен быть в верхней части каждого файла, либо указывать полное имя класса каждый раз, когда я ссылаюсь на него.

1

Прежде всего: пространства имен не являются произведением 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'); 
+0

Имеет смысл. Но будет ли считаться плохой практикой частично использовать пространства имен, если класс должен быть отменен? – DalekSall

+0

Не уверен, что я понял ваш «класс отмененный» вопрос, связанный с пространствами имен, но отредактированный, чтобы говорить о практике. –

+0

Было бы приемлемо разместить «использование/сущности/....» в базовом контроллере? – DalekSall

Смежные вопросы