За последние 24 часа нас посетили 19605 программистов и 1648 роботов. Сейчас ищут 1213 программистов ...

Namespace или как разобраться в laravel?

Тема в разделе "Laravel", создана пользователем Alex5646, 1 янв 2016.

  1. Alex5646

    Alex5646 Новичок

    С нами с:
    29 дек 2015
    Сообщения:
    277
    Симпатии:
    4
    Адрес:
    От верлюда
    Я понимаю что такое пространство имён и как ими пользоваться, но есть одна проблема я ими не когда не пользовался (Один раз для ознакомления). Я пишу сайт на laravel и не могу разобраться в логике имён, может кто то подскажет как побыстрей их запомнить?
     
  2. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    в смысле "в логике имён"?
     
  3. Alex5646

    Alex5646 Новичок

    С нами с:
    29 дек 2015
    Сообщения:
    277
    Симпатии:
    4
    Адрес:
    От верлюда
    Пример для доступности класса Model надо писать use Illuminate\Database\Eloquent\Model;

    А как разобраться в такой записи:
    Код (PHP):
    1. use Illuminate\Auth\Access\AuthorizationException;
    2. use Illuminate\Database\Eloquent\ModelNotFoundException;
    3. use Symfony\Component\HttpKernel\Exception\HttpException;
    4. use Illuminate\Foundation\Validation\ValidationException;
    5. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
    6. use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler; 
    А если самому надо будет такое составить? Это ведь как то запомнить надо?

    Тут ведь логика какая то должна быть? Типо use Пакет\Ещё что то\Ещё что то\Класс;
     
  4. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    для доступности класса илюминэйт-дейтабейс-елокент-модэл как модэл в текущем пространстве имён.
    ну если ты про сторонние приложения то да, наверное запомнить. а если про свое - то ты как бы это сам знать должен. а вообще бояться не надо - любая уважающая себя иде умеет подстановки делать. вбил "юз модэл" а она тебе предложила все фккн-ы которые она знает для текущего проекта - походил вверх-вниз, спозиционировался на нужном классе, жмакнул энтер и получил готовую строку.

    ну логика-то должна быть, только у каждого автора и даже в пределах одного автора - логика может быть разная. я вот например несколько лет назад очень любил джава-стиль типа com\example\common\users\user - com\example четко указывали что речь идет о сайте example.com, коммн - что это некий общий код, который без особых юридических трудностей я могу использовать в другом проекте, юзерс - на то что это инструментарий работы с пользователями, юзер - собственно класс реализующий сущность пользователя. а потом я плавно перестал такой херней страдать и начал страдать другой :D
     
  5. Alex5646

    Alex5646 Новичок

    С нами с:
    29 дек 2015
    Сообщения:
    277
    Симпатии:
    4
    Адрес:
    От верлюда
    Да я уже заметил. В laravel к примеру всё просто (Почти), пространства имён делаются по названиям файлов use app\UserModel; само говорит что у меня есть файл app\UserModel.php ну или папка use app\Http\Requests;

    Только есть одно но laravel использует сторонние пакеты и use Validator; use Illuminate\Http\Request; Хрен разберёшься, надо как то вникать (Учить долго и литературы нет)

    У меня PHPStorm, тыкать долго по меню я из других файлов вырезаю, может потом запомню.
     
  6. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    какая-то надуманная проблема
    тоже надуманная. пока ты набиваешь "юз короткое-имя-класса-или-пакета" - иде уже должна предлагать тебе полное квалифицированное имя. в меню не надо лазить.
    можно просто пару раз пробежаться по списку файлов и примерно знать какие пакеты и классы есть в текущей инсталляции. а дальше по контексту их пробовать применять. в общем я сложностей особых не вижу.
     
  7. Alex5646

    Alex5646 Новичок

    С нами с:
    29 дек 2015
    Сообщения:
    277
    Симпатии:
    4
    Адрес:
    От верлюда
    Я об этих пакетах почти не чего не знаю. Я неделю назад установил composer и laravel дня 3 назад, даже поговорка на эту тему есть "Смотришь в книгу, видешь фигу." Хотя со временем разберусь.
     
  8. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    До появления PHP 5.3 разработчики были вынуждены подбирать для файлов и классов своего проекта уникальные имена, поскольку с точки зрения интерпретатора все они находились в одном глобальном контексте.
    Другими словами, если вы, например, определяли класс ShoppingBasket, он тот час же становился доступным всему вашему приложению. Это порождало две большие проблемы. Первая и самая неприятная проблема была связана с потенциальным конфликтом имен в проекте.

    Посмотрим, что произойдет, если использовать в своем проекте такую конструкцию.
    Код (PHP):
    1. //my.php
    2. require_once "useful/Outputter1.php"
    3. class Outputter{
    4.     //output data
    5. } 
    а во включаемом файле было такое?
    Код (PHP):
    1. //useful/Outputter1.php
    2. require_once "useful/Outputter1.php"
    3. class Outputter{
    4.     //
    5. } 
    Это приведет к фатальной ошибке.

    Существовал, традиционный обходный маневр. Нужно было указать имя пакета перед именем класса, чтобы в итоге получились уникальные имена классов.
    Код (PHP):
    1. //my.php
    2. require_once "useful/Outputter1.php"
    3. class my_Outputter{
    4.     //output data
    5. }
    6.  
    7. //useful/Outputter1.php
    8. require_once "useful/Outputter1.php"
    9. class useful_Outputter{
    10.     //
    11. } 
    Но, с выходом PHP 5.3 появились спасительные пространства имен.
    Пространство имен -это корзина, в которую вы можете поместить классы, функции и переменные. В пределах одного простантсва имен вы можете обращаться к ним без всякого уточнения. Чтобы обратиться к этим элементам за пределами пространства имен, вам прдется либо импортировать(см. "USE ") в код целое пространство имен, либо использовать ссылку на него.

    Пример:
    Код (PHP):
    1. namespace my;
    2. require_once "useful/Outputter1.php"
    3. class Outputter{
    4.     //output data
    5. }
    6.  
    7. namespace useful;
    8. require_once "useful/Outputter1.php"
    9. class Outputter{
    10.     //
    11. } 
    Так же можно использовать файловую систему для имитации пакетов (Пакеты — это механизм, который служит как для работы с пространством имен, так и для ограничения видимости.).

    http://php.net/manual/ru/language.namespaces.importing
    "PHP объекты, шаблоны и методики программирования" (последнее издание лучше найти).
    В этой книге подробно все расписано что касается пакетов и пространства имен. стр. 102
     
  9. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.579
    Симпатии:
    1.759
    Так есть же стандарт наименования пространств имён, которому следует и Laravel. PSR-0, PSR-1, PSR-2, PSR-3, PSR-4
     
  10. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    ну ты же понимаешь что это не стандарт а "стандарт"? это кто-то предложил. как политика рфц - рфц тоже не являются стандартами на самом деле. был бы в пхп стандарт - его бы описали на родительском сайте. а это лишь одна из вариаций стандартизации кода. хошь бери, не хошь - не бери
     
  11. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.579
    Симпатии:
    1.759
    Ganzal, понимаю. Но точно знаю, что в Laravel и Symfony ему следуют. Хоть и знаком с Laravel поверхностно, да и с Symfony только по компонентам, которые в других фреймворках используются
     
  12. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    ну я-то не о том кто его придерживается а о том что это очень громко называть именно стандартом. кстати у оригинального пхп несколько лет назад были требования к стандартизации (ну для попадания в пир и пецл) и у зенда - и они были отличны друг от друга. и пср тоже от них отличаются. будто бы назло.
     
  13. Alex5646

    Alex5646 Новичок

    С нами с:
    29 дек 2015
    Сообщения:
    277
    Симпатии:
    4
    Адрес:
    От верлюда
    О_о Стандарт? Был бы стандарт, было бы всё просто а я уже 3 час не могу понять откуда берётся "стандартный" trait ResetsPasswords, что бы узнать методы для сброса пароля ("Стандартные").

    Код (PHP):
    1. // app/Http/Controllers/Auth/PasswordController.php
    2. use Illuminate\Foundation\Auth\ResetsPasswords;
    3. class PasswordController extends Controller {
    4.     use ResetsPasswords;
    Я уже всю папку Illuminate\Auth перелазил, а трейта не вижу.

    Добавлено спустя 2 минуты 57 секунд:
    Так в чем заключается стандарт? Я логики пока не вижу что то называется по директории или файлу, а что то так от фонаря.
     
  14. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    все пиэсары регулируют только то как код должен быть оформлен в рамках этих пиэсаров. мне вот например игоряша голову проел моей привычкой ставить фигурную скобку на следующей строке. а пиэсар - это ТРЕБУЕТ. и вертеть теперь игроряшу на болте можно :D
     
  15. Alex5646

    Alex5646 Новичок

    С нами с:
    29 дек 2015
    Сообщения:
    277
    Симпатии:
    4
    Адрес:
    От верлюда
    Меня как то тоже раздражала скобка на следующей строке, меня PHPStorm отучил (Сам переносы ставит, и 2пробела вместо табуляции). Какой то сомнительный стандарт. А тема вообще изначально была про пространства имён, так вот они где нибудь стандартизированы? Возьми да и напиши вот такую фигню:
    Код (PHP):
    1. namespace Xernia\Bl\Blabla\Trah;
    Я подозреваю что строка выше соответствует стандарту, а вот потом сиди и думай что этой строкой хотел сказать автор.
     
  16. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    нет никакого стандарта. автор пакета мог придумать разложить нсы так чтоб можно было пакет юзать в других приложениях без особых трудностей - перенес кусок и радуйся. а мог и не предусмотреть - тащи всю сиэмэску. про скобку на следующей строке - ты пользуешься фолдингом?
     
  17. Alex5646

    Alex5646 Новичок

    С нами с:
    29 дек 2015
    Сообщения:
    277
    Симпатии:
    4
    Адрес:
    От верлюда
    Первый раз слышу. Гугля мне сказала это - Приведение к одному регистру. А что это даст?
     
  18. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    а что ты искал-то? регистром там даже далеко не пахнет. нагугли code folding.
     
  19. Alex5646

    Alex5646 Новичок

    С нами с:
    29 дек 2015
    Сообщения:
    277
    Симпатии:
    4
    Адрес:
    От верлюда
    Я в бил "фолдинг php". А это оказываться +\- кнопки слева)) Да я иногда этим пользуюсь, когда методов много или длинные, что бы листать потом быстрее можно было, это удобно когда у тебя класс в 500-1000 строк.
     
  20. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.579
    Симпатии:
    1.759
    Нашёл за 5 минут. Он там, где и должен быть. Просто почитайте про стандарты. https://github.com/laravel/framework/blob/5.2/src/Illuminat ... swords.php
    Это гитхаб фреймворка, при установке скорее всего развернётся в папку vendor по традиции. А дальше, Illuminate/Foundation/Auth - каждому уровню в неймспейсе соответствует папка, как описано в стандарте.

    Добавлено спустя 6 минут 44 секунды:
    Laravel следуют PSR-ам, это видно по исходнику. Иначе я бы так быстро не нашёл. Плюс ещё прочитайте про composer, в папке composer указано, откуда какие классы грузятся. Под рукой проекта на Laravel нету, но могу привести аналогичный файл из проекта на yii2, который тоже ставится composer-ом (находится в vendor/composer/autoload_psr4.php)
    Код (PHP):
    1. // autoload_psr4.php @generated by Composer
    2.  
    3. $vendorDir = dirname(dirname(__FILE__));
    4. $baseDir = dirname($vendorDir);
    5.  
    6. return array(
    7.     'yii\\swiftmailer\\' => array($vendorDir . '/yiisoft/yii2-swiftmailer'),
    8.     'yii\\jui\\' => array($vendorDir . '/yiisoft/yii2-jui'),
    9.     'yii\\imagine\\' => array($vendorDir . '/yiisoft/yii2-imagine'),
    10.     'yii\\gii\\' => array($vendorDir . '/yiisoft/yii2-gii'),
    11.     'yii\\faker\\' => array($vendorDir . '/yiisoft/yii2-faker'),
    12.     'yii\\debug\\' => array($vendorDir . '/yiisoft/yii2-debug'),
    13.     'yii\\composer\\' => array($vendorDir . '/yiisoft/yii2-composer'),
    14.     'yii\\codeception\\' => array($vendorDir . '/yiisoft/yii2-codeception'),
    15.     'yii\\bootstrap\\' => array($vendorDir . '/yiisoft/yii2-bootstrap'),
    16.     'yii\\' => array($vendorDir . '/yiisoft/yii2'),
    17.    // И так далее
    18. )
    19.  
    И вот composer.json самого laravel, который показывает, на основе каких данных composer должен генерировать код, подобный приведённому выше
    https://github.com/laravel/framework/blob/5.2/composer.json#L82

    Добавлено спустя 2 минуты 40 секунд:
    PSR-ам можно и не следовать, да. Это не стандарт от авторов php, это скорее соглашение разработчиков, как написал Ganzal. Но самые крупные фреймворки их придерживаются. И в том числе благодаря им можно совмещать разные компоненты из разных фреймворков.

    Добавлено спустя 4 минуты 10 секунд:
    http://www.php-fig.org/psr/psr-0/ru/#Обязательно
    http://www.php-fig.org/psr/psr-4/ru/

    Это раз вы сами не гуглите.
     
  21. Alex5646

    Alex5646 Новичок

    С нами с:
    29 дек 2015
    Сообщения:
    277
    Симпатии:
    4
    Адрес:
    От верлюда
    В моём composer.json раз в 5 меньше всего.
     
  22. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.579
    Симпатии:
    1.759
    Это понятно. Я вам привёл composer.json фреймворка, на основе которого потом при загрузке composer формирует пути для автозагрузчика. Но я вам и не предлагаю ваш composer.json смотреть. Я предлагаю посмотреть ваш vendor/composer/autoload_psr4.php,

    Добавлено спустя 59 секунд:
    Вы же видите, я за 3 минуты нашёл нужный вам трейт, просто зная, что фреймворк написан по PSR-4, но не зная самого фреймворка
     
  23. Alex5646

    Alex5646 Новичок

    С нами с:
    29 дек 2015
    Сообщения:
    277
    Симпатии:
    4
    Адрес:
    От верлюда
    Мой vendor/composer/autoload_psr4.php:
    Код (PHP):
    1. <?php
    2.  
    3. // autoload_psr4.php @generated by Composer
    4.  
    5. $vendorDir = dirname(dirname(__FILE__));
    6. $baseDir = dirname($vendorDir);
    7.  
    8. return array(
    9.     'XdgBaseDir\\' => array($vendorDir . '/dnoegel/php-xdg-base-dir/src'), // Что это?
    10.     'Symfony\\Polyfill\\Util\\' => array($vendorDir . '/symfony/polyfill-util'),
    11.     'Symfony\\Polyfill\\Php56\\' => array($vendorDir . '/symfony/polyfill-php56'),
    12.     'Symfony\\Polyfill\\Mbstring\\' => array($vendorDir . '/symfony/polyfill-mbstring'),
    13.     'Symfony\\Component\\Yaml\\' => array($vendorDir . '/symfony/yaml'),
    14.     'Symfony\\Component\\VarDumper\\' => array($vendorDir . '/symfony/var-dumper'),
    15.     'Symfony\\Component\\Translation\\' => array($vendorDir . '/symfony/translation'),
    16.     'Symfony\\Component\\Routing\\' => array($vendorDir . '/symfony/routing'),
    17.     'Symfony\\Component\\Process\\' => array($vendorDir . '/symfony/process'),
    18.     'Symfony\\Component\\HttpKernel\\' => array($vendorDir . '/symfony/http-kernel'),
    19.     'Symfony\\Component\\HttpFoundation\\' => array($vendorDir . '/symfony/http-foundation'),
    20.     'Symfony\\Component\\Finder\\' => array($vendorDir . '/symfony/finder'),
    21.     'Symfony\\Component\\EventDispatcher\\' => array($vendorDir . '/symfony/event-dispatcher'),
    22.     'Symfony\\Component\\DomCrawler\\' => array($vendorDir . '/symfony/dom-crawler'),
    23.     'Symfony\\Component\\Debug\\' => array($vendorDir . '/symfony/debug'),
    24.     'Symfony\\Component\\CssSelector\\' => array($vendorDir . '/symfony/css-selector'),
    25.     'Symfony\\Component\\Console\\' => array($vendorDir . '/symfony/console'),
    26.     'SuperClosure\\' => array($vendorDir . '/jeremeamia/SuperClosure/src'),
    27.     'Psy\\' => array($vendorDir . '/psy/psysh/src/Psy'),
    28.     'Psr\\Http\\Message\\' => array($vendorDir . '/psr/http-message/src'),
    29.     'PhpParser\\' => array($vendorDir . '/nikic/php-parser/lib/PhpParser'),
    30.     'Monolog\\' => array($vendorDir . '/monolog/monolog/src/Monolog'),
    31.     'Mews\\Captcha\\' => array($vendorDir . '/mews/captcha/src'),
    32.     'League\\Flysystem\\' => array($vendorDir . '/league/flysystem/src'),
    33.     'Kaishiyoku\\' => array($vendorDir . '/kaishiyoku/laravel-menu/src/Kaishiyoku'),
    34.     'Intervention\\Image\\' => array($vendorDir . '/intervention/image/src/Intervention/Image'),
    35.     'Illuminate\\' => array($vendorDir . '/laravel/framework/src/Illuminate'), // ?????????
    36.     'GuzzleHttp\\Psr7\\' => array($vendorDir . '/guzzlehttp/psr7/src'),
    37.     'Faker\\' => array($vendorDir . '/fzaninotto/faker/src/Faker'),
    38.     'Dotenv\\' => array($vendorDir . '/vlucas/phpdotenv/src'),
    39.     'Doctrine\\Instantiator\\' => array($vendorDir . '/doctrine/instantiator/src/Doctrine/Instantiator'), // ?????????
    40.     'Collective\\Html\\' => array($vendorDir . '/laravelcollective/html/src'),
    41.     'ClassPreloader\\' => array($vendorDir . '/classpreloader/classpreloader/src'),
    42.     'Carbon\\' => array($vendorDir . '/nesbot/carbon/src/Carbon'), // ?????????
    43.     'App\\' => array($baseDir . '/app'), // Тут понятно всё.
    44. );
    45.  
    Нет по сути не какого стандарта \<Имя производителя>\(<Пространство имён>\)*<Имя класса> composer требует такой записи и по другому autoload не заработает, так как имя строется из 3 файлов. Ну а в остальном я могу писать любую херню и composer вместе с laravel это захавают. А может я как то не так думаю? Там выше в коде комменты, дайте пояснения (Что то там не чисто).
     
  24. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.579
    Симпатии:
    1.759
    Ну всё же и так понятно. Стандарт - он в наименовании пространства имён. А здесь, как видите, задаётся соответствие "корневого", скажем так, пространства имён и папки на диске где это всё расположено. К примеру,
    Код (Text):
    1.  
    2. 'Illuminate\\' => array($vendorDir . '/laravel/framework/src/Illuminate')
    все классы пространства имён Illuminate и его подпространств лежат в vendor/laravel/framework/src/Illuminate. Посему, если полное имя класса Illuminate\Ochen\Vajnaya\Fignya, то, в соответствии со стандартом, этот класс нужно искать в фале vendor/laravel/framework/src/Illuminat/Ochen/Vajnaya/Fignya.php. То же самое касается трейтов и интерфейсов. Соответственно, класс
    Carbon\Ochen\Vajnaya\Fignya будет в vendor/nesbot/carbon/src/Carbon/Ochen/Vajnaya/Fignya.php, а если вы свой класс захотите создать, App\Ochen\Vajnaya\Fignya, вы его должны положить в папочку app/Ochen/Vajnaya/Fignya.php. Самостоятельно менять этот файл не следует, если вам недостаточно пространства App для ваших классов, новое вы должны задать через свой composer.json. Иначе все ваши добавления/изменения в этом файле будут перезаписываться при каждом composer update.

    Добавлено спустя 42 секунды:
    Вообще, в папке vendor ничего менять нельзя. Да, и что в названии папок я опустил пути до папки с сайтом, это, я надеюсь, и так понятно. Так же почитайте доки по composer, в частности https://getcomposer.org/doc/04-schema.md#autoload

    Добавлено спустя 5 минут 21 секунду:
    Т.е. ещё раз. Для корневого пространства имён задаётся папка через autoload_psr4.php, а дальше - по стандарту, каждое новое "подпространство" - это новая папка, а имя класса - имя файла. Остальные файлы autoload* - это файлы, необходимые для поиска классов в библиотеках, не следующих PSR
     
  25. Alex5646

    Alex5646 Новичок

    С нами с:
    29 дек 2015
    Сообщения:
    277
    Симпатии:
    4
    Адрес:
    От верлюда
    https://github.com/laravel/framework/blob/5.2/src/Illuminat ... swords.php
    Код (PHP):
    1. public function getReset(Request $request, $token = null)
    2.     {
    3.         return $this->showResetForm($request, $token);
    4.     }
    5.     /**
    6.      * Display the password reset view for the given token.
    7.      *
    8.      * If no token is present, display the link request form.
    9.      *
    10.      * @param  \Illuminate\Http\Request  $request
    11.      * @param  string|null  $token
    12.      * @return \Illuminate\Http\Response
    13.      */
    14.     public function showResetForm(Request $request, $token = null)
    15.     {
    16.         if (is_null($token)) {
    17.             return $this->getEmail();
    18.         }  
    А у меня было в этом файле:
    Код (PHP):
    1. public function getReset($token = null)
    2.     {
    3.         return $this->showResetForm($token);
    4.     }
    5.     /**
    6.      * Display the password reset view for the given token.
    7.      *
    8.      * If no token is present, display the link request form.
    9.      *
    10.      * @param  \Illuminate\Http\Request  $request
    11.      * @param  string|null  $token
    12.      * @return \Illuminate\Http\Response
    13.      */
    14.     public function showResetForm(Request $request, $token = null)
    15.     {
    16.         if (is_null($token)) {
    17.             return $this->getEmail();
    18.         }  
    И как после этого что то не поменять?