Symlink cannot create symlink error code 1314

symlink(): Cannot create symlink, error code(1314) #23 Comments The text was updated successfully, but these errors were encountered: Странно у меня нету такой ошибки. Какой у вас веб сервер? Там ошибка в блоге Calling unknown method: yiiwebUser::checkAccess() ну это понятно. В README писал об этом: Примечание: В случае использования «OpenServer» в качестве локального сервера […]

Содержание

  1. symlink(): Cannot create symlink, error code(1314) #23
  2. Comments
  3. Может это из за того, что я пропустил шаг:
  4. symlink(): Cannot create symlink, error code(1314) #81
  5. Comments
  6. Footer
  7. symlink(): Cannot create symlink, error code(1314) about yii2-start HOT 16 CLOSED
  8. Comments (16)
  9. Может это из за того, что я пропустил шаг:
  10. Related Issues (20)
  11. Recommend Projects
  12. React
  13. Vue.js
  14. Typescript
  15. TensorFlow
  16. Django
  17. Laravel
  18. Recommend Topics
  19. javascript
  20. server
  21. Machine learning
  22. Visualization
  23. Recommend Org
  24. Facebook
  25. Microsoft
  26. Сервис на Yii2: Настройки IDE и модули
  27. Предварительная настройка IDE
  28. Переход к модульной структуре

symlink(): Cannot create symlink, error code(1314) #23

The text was updated successfully, but these errors were encountered:

Странно у меня нету такой ошибки. Какой у вас веб сервер?

Там ошибка в блоге Calling unknown method: yiiwebUser::checkAccess() ну это понятно.

В README писал об этом:

Примечание: В случае использования «OpenServer» в качестве локального сервера на «Windows» системе, при ошибках связаных с созданием symlink-ок нужно запустить сервер от имени администратора.

В случае с Denwer , исходя из того что я не спец по нему, ибо работал с ним уже очень давно, могу только посоветовать вручную создавать симлинки. Вроде как-то так mklink /J «c:/path/имя_ссылки» «d:/path/имя_папки_на_которую_нужно_ссылаться» могу ошибатся, погуглите на тему симлинков в Windows . Или если для вас сервер не принципиален, и вы легко его можете поменять, советую перейти на OpenServer .

Если переходить не хочется, то можно просто отключить в настройках менеджера ресурсов использование symlink -ов, и проблема решится.

Поставил OpenServer — сделал установку снова, такая же ошибка.
http://clip2net.com/s/7e24pu

Может это из за того, что я пропустил шаг:

Как это сделать и определить для адресов?

Автор, после продолжительного копания, выяснилось, что для винды симлинк, вроде как не канает.
https://bugs.php.net/bug.php?id=54141&edit=1

Чтобы определить корневые папки приложения в OpenServer вам нужно:

  1. Запустить сервер.
  2. Зайти в раздел Настройки .
  3. Открыть вкладку Домены .
  4. Назначить тип определения доменов Ручная+Автоматическая . Или что-то подобное там есть.
  5. Добавить нужные домены через поля что вверху:
  • Заполняем левое поле нужным доменом например my-site.loc , а в правой назначаем рут папку.
  • Нажимаем кнопку добавить что справа от этих полей.
  1. Сохранить изменения, c подтверждением перезагрузки сервера.
  2. В браузере должны быть доступны указанные домены.

Всё сделал, спасибо! Но теперь при заходе на главной странице по ссылкам, везде вылазиет 404 nginx. Если стоит веб-сервер nginx.
http://clip2net.com/s/7e5NCX

Включил через апач, вроде завёлся.

Руководство моего приложения и в правду заточено под apache но оно работает и под nginx правда вам нужно для этого настройти правильно сервер. Подсмотреть пример можно в офф. документации.

Источник

symlink(): Cannot create symlink, error code(1314) #81

hello im using windows and xampp to install yii2-start

why i have error code 1314 ?

The text was updated successfully, but these errors were encountered:

I’m not sure how to fix this problem for Windows XAMPP , but in OpenServer this problem can be fixed by running the server as administrator , however if this is not possible you simple can disable symlink here by writing linkAssets => false .

thanks vova it’s work for me by disable symlink 🙂 solved !

how can we use gii on the backend ?

You are welcome!

The same like on frontend. /backend/gii/default/index/

On IIS (Internet Information Services), you need to set permissions to allow the creation of symbolic links.

Go to Local Security Policy -> Local Policies -> User Rights Assignment and right click on Create symbolic links -> Properties -> Add User or Group and add the «IUSR» user, which should be the user associated with IIS.
A restart may be required.

If this doesn’t work, go to IIS Manager -> Authentication -> select Anonymous Authentication -> Edit and enter your current logged in user, which should be an administrator.
Hit OK and now the symlink() function in php should work fine.

With EasyPHP, I started the server as «execute as administrator». It worked.

open the xampp control with administrator priviligies and start the apache server, this solved the symlink problem with xampp and windows

@jcfiorenzano thanks man! simple and clean. it worked!

Thank you very much! I started my xampp by administrator.

thanks! Launching as administrator works just fine!

© 2023 GitHub, Inc.

You can’t perform that action at this time.

You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.

Источник

symlink(): Cannot create symlink, error code(1314) about yii2-start HOT 16 CLOSED

@vova07 Спасибо вам огромное, помог запуска от имени администратора! У меня виртуальный сервер xampp, выходила ошибка «symlink(): Cannot create symlink, error code(1314)» на хостинге работало, а на виртуальном сервере — нет. Причем, если создавать новое базовое приложение yii2, то оно работает без проблем.

Asetss commented on January 16, 2023

Странно у меня нету такой ошибки. Какой у вас веб сервер?

Там ошибка в блоге Calling unknown method: yiiwebUser::checkAccess() ну это понятно.

seobot commented on January 16, 2023

vova07 commented on January 16, 2023

В README писал об этом:

Примечание: В случае использования «OpenServer» в качестве локального сервера на «Windows» системе, при ошибках связаных с созданием symlink-ок нужно запустить сервер от имени администратора.

В случае с Denwer , исходя из того что я не спец по нему, ибо работал с ним уже очень давно, могу только посоветовать вручную создавать симлинки. Вроде как-то так mklink /J «c:/path/имя_ссылки» «d:/path/имя_папки_на_которую_нужно_ссылаться» могу ошибатся, погуглите на тему симлинков в Windows . Или если для вас сервер не принципиален, и вы легко его можете поменять, советую перейти на OpenServer .

Если переходить не хочется, то можно просто отключить в настройках менеджера ресурсов использование symlink -ов, и проблема решится.

seobot commented on January 16, 2023

Поставил OpenServer — сделал установку снова, такая же ошибка.
http://clip2net.com/s/7e24pu

Может это из за того, что я пропустил шаг:

Как это сделать и определить для адресов?

seobot commented on January 16, 2023

Автор, после продолжительного копания, выяснилось, что для винды симлинк, вроде как не канает.
https://bugs.php.net/bug.php?id=54141&edit=1

vova07 commented on January 16, 2023

Чтобы определить корневые папки приложения в OpenServer вам нужно:

  1. Запустить сервер.
  2. Зайти в раздел Настройки .
  3. Открыть вкладку Домены .
  4. Назначить тип определения доменов Ручная+Автоматическая . Или что-то подобное там есть.
  5. Добавить нужные домены через поля что вверху:
  • Заполняем левое поле нужным доменом например my-site.loc , а в правой назначаем рут папку.
  • Нажимаем кнопку добавить что справа от этих полей.
  1. Сохранить изменения, c подтверждением перезагрузки сервера.
  2. В браузере должны быть доступны указанные домены.

seobot commented on January 16, 2023

Всё сделал, спасибо! Но теперь при заходе на главной странице по ссылкам, везде вылазиет 404 nginx. Если стоит веб-сервер nginx.
http://clip2net.com/s/7e5NCX

Включил через апач, вроде завёлся.

vova07 commented on January 16, 2023

Руководство моего приложения и в правду заточено под apache но оно работает и под nginx правда вам нужно для этого настройти правильно сервер. Подсмотреть пример можно в офф. документации.

vova07 commented on January 16, 2023

Убрал symlink -и по умолчанию, теперь проблемы не должны возникнуть при первом запуске. Если кому надо будет, то включить самостоятельно не проблема.

seobot commented on January 16, 2023

Просто, чтобы работали симлинки под виндой, надо запускать от Администратора OpenServer.

vova07 commented on January 16, 2023

Этот момент указан в примечаниях.

lysyi-alex commented on January 16, 2023

Использую XAMPP (php 5.5), запускаю под админом, та же фигня «symlink(): Cannot create symlink, error code(1314) » вот скрин http://prntscr.com/7kadtq

vova07 commented on January 16, 2023

@lysyi-alex Проблема не должна всплывать так как по умолчанию симлинки отключены. Если вы их включили вручную, то возможно найдете решение тут: #81 Сам я что-то посоветовать не смогу, так как работаю не на OS Windows . Если решение по ссылке не поможет, возможно стоит отключить на время разработке на локалке симлинки. А уже на продакшене на сервере их включить.

lysyi-alex commented on January 16, 2023

по умолчанию симлинки были включены, проект качал вчера (22.06.2015) по ссылке https://github.com/trntv/yii2-starter-kit.git. После того как отключил, всё заработало. Круто то, что Вы быстро ответили.

vova07 commented on January 16, 2023

@lysyi-alex если вы скачивали приложение именно по приведенному УРЛ, то вы юзаете не мое приложение. Мое приложение по другому пути: [email protected]:vova07/yii2-start.git и называется Yii2-Start .

  • possible an extention HOT 1
  • Error adding comment to blog entry HOT 4
  • url to backend HOT 3
  • Не корректное отображение HOT 1
  • Подключение своего модуля HOT 5
  • Использование ваших модулей в basic приложении HOT 1
  • Как изменить тему? HOT 1
  • Не могу обратиться к контролеру HOT 2
  • Composer error
  • Using Gii with yii2-start HOT 3
  • Не входит в админку HOT 2
  • Не работает под windows, OpenServer. Выдает ошбку Cannot create symlink, error code(1314) HOT 1
  • Может стоит в руководство по установке для Windows-Apache добавить (wampp, xampp)
  • Восстановление пароля HOT 1
  • Please, ignore it
  • How do I upload an image?
  • .
  • Backend completely without any styling HOT 2
  • Could not access blogs index HOT 1
  • Не работает DEMO режим

Recommend Projects

React

A declarative, efficient, and flexible JavaScript library for building user interfaces.

Vue.js

🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

Typescript

TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

TensorFlow

An Open Source Machine Learning Framework for Everyone

Django

The Web framework for perfectionists with deadlines.

Laravel

A PHP framework for web artisans

Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

javascript

JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

Some thing interesting about web. New door for the world.

server

A server is a program made to process requests and deliver data to clients.

Machine learning

Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

Visualization

Some thing interesting about visualization, use data art

Some thing interesting about game, make everyone happy.

Recommend Org

Facebook

We are working to build community through open source technology. NB: members must have two-factor auth.

Microsoft

Open source projects and samples from Microsoft.

Источник

Сервис на Yii2: Настройки IDE и модули

Продолжаем разработку нашего чудо-сервиса на Yii2. На прошлом уроке мы создали через Composer новый проект и дополнили его раздельной системой конфигурационных файлов. Сегодня мы внедрим в проект модульную структуру и немного лучше познакомимся с базовыми настройками и некоторыми возможностями авторефакторинга в PhpStorm IDE. Другими IDE я не пользуюсь, поэтому с ними не могу вам помочь.

Предварительная настройка IDE

При работе с использованием IDE нужно учитывать и её нюансы.

Во-первых, у нас в проекте есть временные мусорные папки runtime и web/assets . Их желательно исключить из зоны видимости любой IDE, чтобы они попусту не захламляли её внутреннюю историю изменений, не участвовали в поиске, и чтобы список файлов внутри них не занимал оперативную память.

Во-вторых, у нас есть внушительных размеров папка vendor . Включение её в проект полезно, так как это позволит работать автоподстановке, сканирующей все константы, классы и методы.

Но в IDE кроме сканера автоподстановки имеется множество других инструментов для обхода файлов проекта. Это может быть банальный поиск по содержимому, рефакторинг, поиск ошибок с помощью инспектора Code → Inspect Code или вывод списка TODO из всех файлов. Этим инструментам нежелательно сканировать папку vendor , чтобы, например, не выводить сотни найденных TODO и стилистических ошибок из тех же встроенных минимизированных сркриптов.

Соответственно, в PhpStorm IDE войдем в настройки нашего проекта File → Settings , выделим каждую «лишнюю» папку и исключим её, пометив как Excluded :

Также нам нужно пометить корневую папку как Source Root и папку tests как Tests. При этом щёлкнув на значок P этим папкам укажем неймспейсы app и tests , чтобы PhpStorm проставлял правильный namespace при создании классов.

Мы исключили и папку vendor из проекта, поэтому все классы фреймворка потеряются. Нам нужно вернуть её, но при этом не добавлять как папку проекта, а подключить как одну из системных библиотек в Settings — Lnaguages and Frameworks — PHP — Include Path. Это можно сделать вручную, нажав там + и выбрав папку vendor , а можно и воспользоваться умением IDE парсить зависимости:

При открытии проекта PhpStorm спросит нас, хотим ли мы испортировать пути автозагрузки из composer.json . Если не спросил, то мы можем настроить импорт путей вручную:

При этом нужно настроить PHP-интерпретатор и путь до глобального файла composer. Если всё прошло успешно, то после сохранения настроек в список Include Path секции PHP будут автоматически импортированы пути всех библиотек из vendor :

Теперь сканер автоподстановки благополучно найдёт все файлы фреймворка, классы будут также находиться через Ctrl+N , но поиск по содержимому будет проводиться только по вашим файлам. Если же нужно будет произвести поиск внутри папки vendor , то просто специально станьте на неё мышкой и нажмите Ctrl+Shift+F для поиска конкретно в ней.

Теперь не будет проблем с заменой какой-либо строки посредством Ctrl+Shift+R , так как автозамена больше не затронет файлы фреймворка.

Продолжим работу с нашим проектом.

Переход к модульной структуре

Хранить все контроллеры и другие классы в одних и тех же папках может быть удобно, но приятнее разделять функциональность на модули.

Сейчас у нас имеется всего один контроллер и три модели:

Один контроллер и выводит страницы, и авторизует пользователя, и обеспечивает обратную связь. Исходя из принципа единой ответственности (обязанности) такое смешение не очень оправдано и удобно.

Первым делом откроем web/index.php и проверяем, что там установлено окружение dev :

Вспомним, что в config/web.php у нас находится фрагмент:

Он определяет, что в окружении разработки (development) к приложению подключаются модули debug (выводящий панель отладки и её внутренние страницы) и gii (генератор моделей, модулей и прочего), Вот именно Gii нам и пригодится.

В корневой папке проекта создаём директорию modules . Теперь открываем генератор по адресу http://localhost/gii , переходим в «Module Generator» и вводим данные для нового модуля:

После нажатия Preview и Generate мы получим соответствующую папку:

Также генератор нам подскажет, что в конфигурационный файл (в нашем случае в config/web.php ) нужно подключить наш сгенерированный класс:

Аналогично нам нужно сгенерировать и подключить заготовку модуля user . В итоге у нас будет добавлена секция modules с двумя модулями:

Gii помог нам сгенерировать заготовки. А теперь аккуратная ручная работа. Нужно раскидать действия из SiteController.php , существующие классы и представления по этим модулям.

Сначала переносим модели. Создаём папки modules/main/models и modules/user/models . Если у вас тоже есть хорошая IDE, то самое время задействовать её возможности по автоматическому рефакторингу.

Открываем класс LoginForm.php и щелчком по имени класса правой кнопкой мыши (или горячей клавишей ) выбираем Refactor → Move . В появившемся окне изменяем пространство имён на appmodulesusermodels :

и жмём Refactor и после сканирования Do Refactor . Автоматически файл перекинется в новую папку, у класса изменится namespace и во всех местах использования автоматически поменяется строка use .

Если ваш редактор так не умеет, то нужно будет переместить классы вручную.

Аналогичным образом переносим модель формы ContactForm в модуль main и User в модуль user .

Теперь дело за контроллером SiteController . Его содержимое необходимо разнести по контроллерам всех модулей.

Контроллер обратной связи сделаем отдельным в модуле main :

Мы перенесли в него действия captcha и actionContact .

Обратите внимание, что actionContact мы переименовали в actionIndex и соответственно заменили имя файла представления. Теперь файл views/site/contact.php поместим как modules/main/views/contact/index.php .

Если теперь удалить SiteController и перейти по адресу http://localhost/main/contact/index , то возникнет проблема с кодом подтверждения (captcha) контактной формы. Это происходит из-за того, что адрес по умолчанию /site/captcha теперь недоступен. Нужно указать новый адрес.

В модели ContactForm находим строку подключения CaptchaValidator :

и указываем новый маршрут:

Аналогично в файле представления modules/main/views/contact/index.php находим конструкцию вывода виджета:

и добавляем такой же параметр:

Теперь контактная форма должна нормально работать.

Контроллер по умолчанию в модуле main будет выводить страницы и ошибки:

К нему нужно перенести все его представления index.php и error.php из папки views/site в папку modules/main/views/default .

Мы пропустили только действие actionAbout и представление about.php , так как статические страницы нам не нужны. Если потребуется организовать раздел помощи, то его можно сделать потом.

И последний модуль user . В его контроллер мы перенесём авторизацию и представление login.php :

Теперь пустые папки controllers , models и views/site в корне можно удалить. Вместо них будет только папка modules .

В итоге получилась новая файловая структура, состоящая из двух модулей:

И немного доработаем представления. Если зайдём в любое представление вроде modules/user/views/default/login.php , то увидим там вспомогательный класс, помогающий по HTML-коду страницы в браузере определить текущий маршрут:

Это полезная подсказка для разработчика проекта. Также этот класс может быть полезен для установки персональных стилей для каждой страницы в CSS-файле. Но теперь у нас есть модули и мы перенесли это представление. Оставлять старые значения мы не будем, поэтому теперь пробежимся по всем файлам и поменяем классы на новые. Например, у этого представления теперь новый маршрут:

Теперь необходимо немного доработать файлы конфигурации. Первым делом, укажем маршрут по умолчанию вместо site/index и действие для вывода ошибок вместо site/error в config/web.php . Помимо этого нужно добавить новый путь для свойства loginUrl :

Также дополним правила маршрутизации с учётом новых модулей в config/common.php :

Теперь исправим маршруты ссылок в главном меню views/layouts/main :

Если всё сделано верно, то снаружи у приложения ничего не изменится. Все страницы будут работать как и раньше. Но теперь и вы можете испытать то волшебное чувство, когда заказчик на вас кричит: «Жулики! Хватит меня обманывать! Видимость работы создавать! Целый день просидели, ничего не сделали! Вообще! Верните мои деньги!».

А сейчас, как всегда, задавайте вопросы, излагайте эмоции и вносите предложения в комментариях.

Не пропускайте новые статьи, бонусы и мастер-классы:

Источник

Продолжаем разработку нашего чудо-сервиса на Yii2. На прошлом уроке мы создали через Composer новый проект и дополнили его раздельной системой конфигурационных файлов. Сегодня мы внедрим в проект модульную структуру и немного лучше познакомимся с базовыми настройками и некоторыми возможностями авторефакторинга в PhpStorm IDE. Другими IDE я не пользуюсь, поэтому с ними не могу вам помочь.

Репозиторий проекта на GitHub

Часть 1: Установка и настройка приложения

Предварительная настройка IDE

При работе с использованием IDE нужно учитывать и её нюансы.

Во-первых, у нас в проекте есть временные мусорные папки runtime и web/assets. Их желательно исключить из зоны видимости любой IDE, чтобы они попусту не захламляли её внутреннюю историю изменений, не участвовали в поиске, и чтобы список файлов внутри них не занимал оперативную память.

Во-вторых, у нас есть внушительных размеров папка vendor. Включение её в проект полезно, так как это позволит работать автоподстановке, сканирующей все константы, классы и методы.

Но в IDE кроме сканера автоподстановки имеется множество других инструментов для обхода файлов проекта. Это может быть банальный поиск по содержимому, рефакторинг, поиск ошибок с помощью инспектора CodeInspect Code или вывод списка TODO из всех файлов. Этим инструментам нежелательно сканировать папку vendor, чтобы, например, не выводить сотни найденных TODO и стилистических ошибок из тех же встроенных минимизированных сркриптов.

Соответственно, в PhpStorm IDE войдем в настройки нашего проекта FileSettings, выделим каждую «лишнюю» папку и исключим её, пометив как Excluded:

PhpStorm Yii2 Excludes

Также нам нужно пометить корневую папку как Source Root и папку tests как Tests. При этом щёлкнув на значок P этим папкам укажем неймспейсы app и tests, чтобы PhpStorm проставлял правильный namespace при создании классов.

Мы исключили и папку vendor из проекта, поэтому все классы фреймворка потеряются. Нам нужно вернуть её, но при этом не добавлять как папку проекта, а подключить как одну из системных библиотек в Settings — Lnaguages and Frameworks — PHP — Include Path. Это можно сделать вручную, нажав там + и выбрав папку vendor, а можно и воспользоваться умением IDE парсить зависимости:

При открытии проекта PhpStorm спросит нас, хотим ли мы испортировать пути автозагрузки из composer.json. Если не спросил, то мы можем настроить импорт путей вручную:

PhpStorm PHP Libraries

При этом нужно настроить PHP-интерпретатор и путь до глобального файла composer. Если всё прошло успешно, то после сохранения настроек в список Include Path секции PHP будут автоматически импортированы пути всех библиотек из vendor:

Теперь сканер автоподстановки благополучно найдёт все файлы фреймворка, классы будут также находиться через Ctrl+N, но поиск по содержимому будет проводиться только по вашим файлам. Если же нужно будет произвести поиск внутри папки vendor, то просто специально станьте на неё мышкой и нажмите Ctrl+Shift+F для поиска конкретно в ней.

Теперь не будет проблем с заменой какой-либо строки посредством Ctrl+Shift+R, так как автозамена больше не затронет файлы фреймворка.

Продолжим работу с нашим проектом.

Переход к модульной структуре

Хранить все контроллеры и другие классы в одних и тех же папках может быть удобно, но приятнее разделять функциональность на модули.

Сейчас у нас имеется всего один контроллер и три модели:

assets/
commands/
config/
controllers/
    SiteController.php
mail/
models/
    ContactForm.php
    LoginForm.php
    User.php
tests/
vendor/
views/
    layouts/
        main.php
    site/
        about.php
        contact.php
        error.php
        index.php
        login.php
web/

Один контроллер и выводит страницы, и авторизует пользователя, и обеспечивает обратную связь. Исходя из принципа единой ответственности (обязанности) такое смешение не очень оправдано и удобно.

Первым делом откроем web/index.php и проверяем, что там установлено окружение dev:

defined('YII_ENV') or define('YII_ENV', 'dev');

Вспомним, что в config/web.php у нас находится фрагмент:

if (YII_ENV_DEV) {
    
    $config['bootstrap'][] = 'debug';
    $config['modules']['debug'] = 'yiidebugModule';
 
    $config['bootstrap'][] = 'gii';
    $config['modules']['gii'] = 'yiigiiModule';
}

Он определяет, что в окружении разработки (development) к приложению подключаются модули debug (выводящий панель отладки и её внутренние страницы) и gii (генератор моделей, модулей и прочего), Вот именно Gii нам и пригодится.

В корневой папке проекта создаём директорию modules. Теперь открываем генератор по адресу http://localhost/gii, переходим в «Module Generator» и вводим данные для нового модуля:

Gii Module Generator

После нажатия Preview и Generate мы получим соответствующую папку:

modules/
    main/
        controllers/
            DefaultController.php
        views/
            default/
                index.php
        Module.php

Также генератор нам подскажет, что в конфигурационный файл (в нашем случае в config/web.php) нужно подключить наш сгенерированный класс:

$config = [
    'id' => 'app',
    'modules' => [
        'main' => [
            'class' => 'appmodulesmainModule',
        ],
    ],
    ...
];

Аналогично нам нужно сгенерировать и подключить заготовку модуля user. В итоге у нас будет добавлена секция modules с двумя модулями:

$config = [
    'id' => 'app',
    'modules' => [
        'main' => [
            'class' => 'appmodulesmainModule',
        ],
        'user' => [
            'class' => 'appmodulesuserModule',
        ],
    ],
    'components' => [
        ...
    ],
];

Gii помог нам сгенерировать заготовки. А теперь аккуратная ручная работа. Нужно раскидать действия из SiteController.php, существующие классы и представления по этим модулям.

Сначала переносим модели. Создаём папки modules/main/models и modules/user/models. Если у вас тоже есть хорошая IDE, то самое время задействовать её возможности по автоматическому рефакторингу.

Открываем класс LoginForm.php и щелчком по имени класса правой кнопкой мыши (или горячей клавишей <F6>) выбираем RefactorMove. В появившемся окне изменяем пространство имён на appmodulesusermodels:

Gii Module Generator

и жмём Refactor и после сканирования Do Refactor. Автоматически файл перекинется в новую папку, у класса изменится namespace и во всех местах использования автоматически поменяется строка use.

Если ваш редактор так не умеет, то нужно будет переместить классы вручную.

Аналогичным образом переносим модель формы ContactForm в модуль main и User в модуль user.

Теперь дело за контроллером SiteController. Его содержимое необходимо разнести по контроллерам всех модулей.

Контроллер обратной связи сделаем отдельным в модуле main:

namespace appmodulesmaincontrollers;
 
use appmodulesmainmodelsContactForm;
use yiiwebController;
use Yii;
 
class ContactController extends Controller
{
    public function actions()
    {
        return [
            'captcha' => [
                'class' => 'yiicaptchaCaptchaAction',
                'fixedVerifyCode' => YII_ENV_TEST ? 'testme' : null,
            ],
        ];
    }
 
    public function actionIndex()
    {
        $model = new ContactForm();
        if ($model->load(Yii::$app->request->post()) && $model->contact(Yii::$app->params['adminEmail'])) {
            Yii::$app->session->setFlash('contactFormSubmitted');
 
            return $this->refresh();
        } else {
            return $this->render('index', [
                'model' => $model,
            ]);
        }
    }
}

Мы перенесли в него действия captcha и actionContact.

Обратите внимание, что actionContact мы переименовали в actionIndex и соответственно заменили имя файла представления. Теперь файл views/site/contact.php поместим как modules/main/views/contact/index.php.

Если теперь удалить SiteController и перейти по адресу http://localhost/main/contact/index, то возникнет проблема с кодом подтверждения (captcha) контактной формы. Это происходит из-за того, что адрес по умолчанию /site/captcha теперь недоступен. Нужно указать новый адрес.

В модели ContactForm находим строку подключения CaptchaValidator:

['verifyCode', 'captcha'],

и указываем новый маршрут:

['verifyCode', 'captcha', 'captchaAction' => '/main/contact/captcha'],

Аналогично в файле представления modules/main/views/contact/index.php находим конструкцию вывода виджета:

<?php
<?= $form->field($model, 'verifyCode')->widget(Captcha::className(), [
    'template' => '<div class="row"><div class="col-lg-3">{image}</div><div class="col-lg-6">{input}</div></div>',
]) ?>

и добавляем такой же параметр:

<?php
<?= $form->field($model, 'verifyCode')->widget(Captcha::className(), [
    'captchaAction' => '/main/contact/captcha',
    'template' => '<div class="row"><div class="col-lg-3">{image}</div><div class="col-lg-6">{input}</div></div>',
]) ?>

Теперь контактная форма должна нормально работать.

Контроллер по умолчанию в модуле main будет выводить страницы и ошибки:

namespace appmodulesmaincontrollers;
 
use yiiwebController;
 
class DefaultController extends Controller
{
    public function actions()
    {
        return [
            'error' => [
                'class' => 'yiiwebErrorAction',
            ],
        ];
    }
 
    public function actionIndex()
    {
        return $this->render('index');
    }
}

К нему нужно перенести все его представления index.php и error.php из папки views/site в папку modules/main/views/default.

Мы пропустили только действие actionAbout и представление about.php, так как статические страницы нам не нужны. Если потребуется организовать раздел помощи, то его можно сделать потом.

И последний модуль user. В его контроллер мы перенесём авторизацию и представление login.php:

namespace appmodulesusercontrollers;
 
use appmodulesusermodelsLoginForm;
use yiifiltersAccessControl;
use yiifiltersVerbFilter;
use yiiwebController;
use Yii;
 
class DefaultController extends Controller
{
    public function behaviors()
    {
        return [
            'access' => [
                'class' => AccessControl::className(),
                'only' => ['logout'],
                'rules' => [
                    [
                        'actions' => ['logout'],
                        'allow' => true,
                        'roles' => ['@'],
                    ],
                ],
            ],
            'verbs' => [
                'class' => VerbFilter::className(),
                'actions' => [
                    'logout' => ['post'],
                ],
            ],
        ];
    }
 
    public function actionLogin()
    {
        if (!Yii::$app->user->isGuest) {
            return $this->goHome();
        }
 
        $model = new LoginForm();
        if ($model->load(Yii::$app->request->post()) && $model->login()) {
            return $this->goBack();
        } else {
            return $this->render('login', [
                'model' => $model,
            ]);
        }
    }
 
    public function actionLogout()
    {
        Yii::$app->user->logout();
 
        return $this->goHome();
    }
}

Теперь пустые папки controllers, models и views/site в корне можно удалить. Вместо них будет только папка modules.

В итоге получилась новая файловая структура, состоящая из двух модулей:

assets/
commands/
config/
mail/
modules/
    main/
        controllers/
            DefaultController.php
            ContactController.php
        models/
            ContactForm.php
        views/
            default/
                error.php
                index.php
            contact/
                index.php
        Module.php
    user/
        controllers/
            DefaultController.php
        models/
            LoginForm.php
            User.php
        views/
            default/
                login.php
        Module.php
tests/
vendor/
views/
    layouts/
        main.php
web/

И немного доработаем представления. Если зайдём в любое представление вроде modules/user/views/default/login.php, то увидим там вспомогательный класс, помогающий по HTML-коду страницы в браузере определить текущий маршрут:

<?php
<div class="site-login">

Это полезная подсказка для разработчика проекта. Также этот класс может быть полезен для установки персональных стилей для каждой страницы в CSS-файле. Но теперь у нас есть модули и мы перенесли это представление. Оставлять старые значения мы не будем, поэтому теперь пробежимся по всем файлам и поменяем классы на новые. Например, у этого представления теперь новый маршрут:

<?php
<div class="user-default-login">

Теперь необходимо немного доработать файлы конфигурации. Первым делом, укажем маршрут по умолчанию вместо site/index и действие для вывода ошибок вместо site/error в config/web.php. Помимо этого нужно добавить новый путь для свойства loginUrl:

$config = [
    'id' => 'app',
    'defaultRoute' => 'main/default/index',
    'components' => [
        'user' => [
            'identityClass' => 'appmodulesusermodelsUser',
            'enableAutoLogin' => true,
            'loginUrl' => ['user/default/login'],
        ],
        'errorHandler' => [
            'errorAction' => 'main/default/error',
        ],
        'request' => [
            'cookieValidationKey' => '',
        ],
        'log' => [
            'traceLevel' => YII_DEBUG ? 3 : 0,
        ],
    ],
];

Также дополним правила маршрутизации с учётом новых модулей в config/common.php:

return [
    'basePath' => dirname(__DIR__),
    'bootstrap' => ['log'],
    'aliases' => [
        '@bower' => '@vendor/bower-asset',
        '@npm'   => '@vendor/npm-asset',
    ],
    'components' => [
        'db' => [
            'class' => 'yiidbConnection',
            'charset' => 'utf8',
        ],
        'urlManager' => [
            'class' => 'yiiwebUrlManager',
            'enablePrettyUrl' => true,
            'showScriptName' => false,
            'rules' => [
                '' => 'main/default/index',
                'contact' => 'main/contact/index',
                '<_a:(about|error)>' => 'main/default/<_a>',
                '<_a:(login|logout)>' => 'user/default/<_a>',
 
                '<_m:[w-]+>' => '<_m>/default/index',
                '<_m:[w-]+>/<id:d+>' => '<_m>/default/view',
                '<_m:[w-]+>/<id:d+>/<_a:[w-]+>' => '<_m>/default/<_a>',
                '<_m:[w-]+>/<_c:[w-]+>' => '<_m>/<_c>/index',
                '<_m:[w-]+>/<_c:[w-]+>/<id:d+>' => '<_m>/<_c>/view',
                '<_m:[w-]+>/<_c:[w-]+>/<id:d+>/<_a:[w-]+>' => '<_m>/<_c>/<_a>',
                '<_m:[w-]+>/<_c:[w-]+>/<_a:[w-]+>' => '<_m>/<_c>/<_a>',
            ],
        ],
        'mailer' => [
            'class' => 'yiiswiftmailerMailer',
        ],
        'cache' => [
            'class' => 'yiicachingDummyCache',
        ],
        'log' => [
            'class' => 'yiilogDispatcher',
        ],
    ],
    'params' => $params,
];

Теперь исправим маршруты ссылок в главном меню views/layouts/main:

echo Nav::widget([
    'options' => ['class' => 'navbar-nav navbar-right'],
    'items' => [
        ['label' => 'Home', 'url' => ['/main/default/index']],
        ['label' => 'Contact', 'url' => ['/main/contact/index']],
        Yii::$app->user->isGuest ?
            ['label' => 'Login', 'url' => ['/user/default/login']] :
            ['label' => 'Logout (' . Yii::$app->user->identity->username . ')',
                'url' => ['/user/default/logout'],
                'linkOptions' => ['data-method' => 'post']],
    ],
]);

Если всё сделано верно, то снаружи у приложения ничего не изменится. Все страницы будут работать как и раньше. Но теперь и вы можете испытать то волшебное чувство, когда заказчик на вас кричит: «Жулики! Хватит меня обманывать! Видимость работы создавать! Целый день просидели, ничего не сделали! Вообще! Верните мои деньги!».

А сейчас, как всегда, задавайте вопросы, излагайте эмоции и вносите предложения в комментариях.

Часть 3: Перенос пользователей в базу данных

Bug #54141 Function symlink not working under windows server 2008
Submitted: 2011-03-02 21:46 UTC Modified: 2011-03-02 23:34 UTC
From: shibby_crinquer at hotmail dot com Assigned:
Status: Not a bug Package: IIS related
PHP Version: 5.3.5 OS: Windows server 2008
Private report: No CVE-ID: None

 [2011-03-02 21:46 UTC] shibby_crinquer at hotmail dot com

Description:
------------
---
From manual page: http://www.php.net/function.symlink
---

I am under Windows server 2008
PHP 3.5.3 installed with FastCGI

I get this error when I can the function symlink.

Warning: symlink(): Cannot create symlink, error code(1314) in 
C:inetpubwwwrootindex.php on line 42

Test script:
---------------
symlink("C:Tempphp.log","C:Tempsymlink.log");

Expected result:
----------------
The symlink

Actual result:
--------------
No symlink.

Warning: symlink(): Cannot create symlink, error code(1314) in 
C:inetpubwwwrootindex.php on line 42

Patches

Add a Patch

Pull Requests

Add a Pull Request

History

AllCommentsChangesGit/SVN commitsRelated reports

 [2011-03-02 22:05 UTC] shibby_crinquer at hotmail dot com

When I go in the command prompt and enter C:php> php index.php that contain the 
symlink command, it work. But outside the command prompt (in a web page) it don't 
work. I've looked about changing the local policies for the "Create symbolic 
links" I've changed Administrators for everyone and this is not working.

 [2011-03-02 23:34 UTC] pajoye@php.net

Permissions issue, fix them and you will be able to create symbolic links.

 [2011-03-03 14:35 UTC] shibby_crinquer at hotmail dot com

Do you know what permissions to change? I've disable the UAC and I've gaven the 
permission to everyone to create symbolic links (in the local policies). Thank 
you.

 [2011-03-04 15:24 UTC] shibby_crinquer at hotmail dot com

I've changed the default IUSR user for anonymous authentication to a local user 
account. By the way, I've added the same user in the local policies for creating 
symbolic links. I don't think this is the good way (for security reason), but it 
work.

Понравилась статья? Поделить с друзьями:
  • Symfony twig form error
  • Symfony prod error 500
  • Symfony oops an error occurred
  • Symfony form error template
  • Symfony form add error