2015-10-15 6 views
0

Я начинающий разработчик laravel, и я пытаюсь понять, как здесь работает пространство имен. Поэтому я узнал о шаблоне репозитория и решил продолжить его и реализовать в своем проекте.Как межстрочный интервал работает с использованием PSR4 в laravel 5?

Так что я создал папку с именем archive, а затем загружают его с помощью PSR4 в моем файле composer.json так:

"Archive\\": "archive/" 

Теперь я создал папку Repositories в моей archive папке, где я буду создавать все хранилища. И я именую файлы в нем так:

namespace Archive\Repositories; 

Который, кажется, работает нормально. Затем я создал папку Contracts внутри папки Repositories, которая будет содержать все интерфейсы для реализаций, которые я собираюсь использовать, например, UserRepositoryInterface. И я размещаю файлы имен в папке «Контракты» следующим образом:

namespace Archive\Repositories\Contracts; 

Это тоже нормально работает.

Теперь мое сомнение кроется в конкретных реализациях, которые я пытаюсь сделать в папке Repositories. Например, есть DbUserRepository, который реализует команду «UserRepositoryInterface» в папке «Контракты».

Теперь, так как я новичок в этом я попробовал:

class DbUserRepository implements Contacts\UserRepositoryInterface 

И это прекрасно работает, но тогда я думал, что я должен use его на верхней части файла следующим образом:

use Contacts\UserRepositoryInterface; 

И Я мог бы просто сделать это:

class DbUserRepository implements UserRepositoryInterface 

И он должен работать нормально в соответствии со мной, но он дает мне класс не для и исключение, но когда я делаю что-то вроде:

use Archive\Repositories\Contacts\UserRepositoryInterface; 

Теперь он отлично работает. Но вот где я расплывчатый. Внутри DbUserRepository Я уже нахожусь в наместничестве Archive\Repositories, так почему же он просто не заглядывает в папку Контрактов? Почему мне нужно указать полное это как use Archive\Repositories\Contacts\UserRepositoryInterface;

Почему я не могу просто сказать:

use Contacts\UserRepositoryInterface; 

Я надеюсь, что мой вопрос не слишком запутанным. Хотя мой код работает сейчас, но я расплывчатый, как работает пространство имен.

ответ

1

Правила довольно просты:

  1. Все namespace и use заявления всегда использовать полные имена (FQN), то есть они всегда начинаются с глобального пространства имен и не по отношению к чему-либо еще. use Foo\Bar всегда означает \Foo\Bar, независимо от того, в каком пространстве имен вы находитесь.

  2. Все литературные обозначения имен внутри остальной части кода разрешены относительно текущего пространства имен и/или псевдонимов, созданных с помощью операторов use. new Foo, extends Foo, и такие как __NAMESPACE__\Foo, или что-то еще Foo, вы можете иметь псевдоним в каком-то use заявлении.

Если вы хотите, чтобы сократить имена, вам нужно использовать use заявления, которые используют FQN класса, а не относительно текущего пространства имен.

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