Страницы

Поиск по вопросам

Показаны сообщения с ярлыком symfony3. Показать все сообщения
Показаны сообщения с ярлыком symfony3. Показать все сообщения

пятница, 24 января 2020 г.

Проблемы при настройке symfony 2.7 и 3.0 (проблема одна и та же)

#php #framework #symfony2 #symfony #symfony3


Проблемы при настройке symfony 2.7 и 3.0 (проблема одна и та же)


  Major problems have been detected and must be fixed before continuing:
  Change the permissions of either "app/cache/" or "var/cache/"
  directory so that the web server can write into it. Change the
  permissions of either "app/logs/" or "var/logs/" directory so that the
  web server can write into it.


Стандартные решения, естественно, попробовал из документации Symfony, глава Checking
Symfony Application Configuration and Setup.

Setting up Permissions:

Yuri@localhost /v/w/symfony.loc> sudo rm -rf var/cache/*
Yuri@localhost /v/w/symfony.loc> sudo rm -rf var/logs/*
Yuri@localhost /v/w/symfony.loc> sudo setfacl -R -m u:apache:rwX -m u:Yuri:rwX var/cache
var/logs
Yuri@localhost /v/w/symfony.loc> sudo setfacl -dR -m u:apache:rwX -m u:Yuri:rwX var/cache
var/logs
Yuri@localhost /v/w/symfony.loc> sudo service httpd restart
Redirecting to /bin/systemctl restart  httpd.service


Группа у web-server точно apache. Пруф

Yuri@localhost /v/w/symfony.loc> 
ps axo user,comm | grep -E '[a]pache|[h]ttpd|[_]www|[w]ww-data|[n]ginx' | grep -v
root | head -1 | cut -d\  -f1
apache
Yuri@localhost /v/w/symfony.loc>


Так же использовал крайние решение из главы Setting up Permissions:
подставил в начало файлов: (bin/console, web/app.php и web/app_dev.php) -> umask(0000)
в начало;

Yuri@localhost /v/w/symfony.loc> sudo service httpd restart
Redirecting to /bin/systemctl restart  httpd.service
Yuri@localhost /v/w/symfony.loc> service httpd status
Redirecting to /bin/systemctl status  httpd.service
● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset:
disabled)
   Active: active (running) since Чт 2015-12-24 23:17:13 MSK; 11min ago
 Main PID: 9196 (httpd)
   Status: "Total requests: 8; Idle/Busy workers 100/0;Requests/sec: 0.0121; Bytes
served/sec:  51 B/sec"
   CGroup: /system.slice/httpd.service
           ├─9196 /usr/sbin/httpd -DFOREGROUND
           ├─9197 /usr/sbin/httpd -DFOREGROUND
           ├─9198 /usr/sbin/httpd -DFOREGROUND
           ├─9199 /usr/sbin/httpd -DFOREGROUND
           ├─9201 /usr/sbin/httpd -DFOREGROUND
           ├─9205 /usr/sbin/httpd -DFOREGROUND
           ├─9207 /usr/sbin/httpd -DFOREGROUND
           └─9354 /usr/sbin/httpd -DFOREGROUND

дек 24 23:17:13 localhost.localdomain systemd[1]: Starting The Apache HTTP...
дек 24 23:17:13 localhost.localdomain httpd[9196]: AH00548: NameVirtualHos...
дек 24 23:17:13 localhost.localdomain systemd[1]: Started The Apache HTTP ...
Hint: Some lines were ellipsized, use -l to show in full.
Yuri@localhost /v/w/symfony.loc> 


Nginx и php-fpm точно не включен 

Yuri@localhost /v/w/symfony.loc> sudo service php-fpm status
[sudo] пароль для Yuri: 
Redirecting to /bin/systemctl status  php-fpm.service
● php-fpm.service - The PHP FastCGI Process Manager
   Loaded: loaded (/usr/lib/systemd/system/php-fpm.service; disabled; vendor preset:
disabled)
   Active: inactive (dead)
Yuri@localhost /v/w/symfony.loc> sudo service nginx status
Redirecting to /bin/systemctl status  nginx.service
● nginx.service
   Loaded: not-found (Reason: No such file or directory)
   Active: inactive (dead)
Yuri@localhost /v/w/symfony.loc>


На просторах Ru&En-нета не нашел больше решений:(
Повторюсь, проблема на symfony 2.7 и 3.0 идентична. Пробовал на fedora 22 php5.6.15
и php7. Пробовал уже различные комбинации владельцев apache:Yuri, в том числе и на
создание новых файлов тоже выставлять - ничего не помогло.:(
Есть еще возможные варианты?
    


Ответы

Ответ 1



Если кому интересно, то проблема была в SELinux. vi /etc/selinux/config или nano /etc/selinux/config И перезагрузить комп sudo reboot

Ответ 2



я не парился и добавил алиас на composer который выполняется от www-data sudo www-data -c 'composer app/console' вроде такого.

Symfony 3, удалить записи из двух таблиц

#php #symfony #symfony3 #doctrine2


Здравствуйте, мне нужно удалить записи из двух таблиц. Есть таблица orders которая
связана по типу один ко многим с таблицей order_item.
Нужно по некоторой выборке записей из orders удалить соответствующие запитси в order_item.

public function deleteOrders()
{
    $dayClear = new DateTime('-2 days');

    return
        $this->createQueryBuilder('o')
            ->delete('AdminBundle:Order', 'o')
            ->delete('AdminBundle:OrderItem', 'oi')
            ->leftJoin('AdminBundle:OrderItem', 'oi', 'WITH', 'oi.order_id = o.id')

            ->where('o.total IS NULL')
            ->andWhere('o.updated <= :dayClear')
            ->setParameter('dayClear', $dayClear)
            ->getQuery()
            ->getResult();

}


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

->delete('AdminBundle:OrderItem', 'oi')


то данные из первой таблице удаляются.
В чем может быть проблема и как решить задачу? Заранее спасибо!
    


Ответы

Ответ 1



Если реализовывать через DQL, думаю проще будет в первую очередь нужно найти ids. И потом можно сделать приблизительно так: $this->createQueryBuilder('o') ->delete() ->from('AdminBundle:Order o, AdminBundle:OrderItem oi') ->whereIn('o.id', '?', $ids) ->whereIn('o.order_id', '?', $ids) ->getQuery() ->getResult();

Как убрать _local из url для дефолтного языка

#symfony #symfony3


подскажите пожалуйста.
Реализовал мультиязычность для сайта, но нужно убрать в урле приставку /en для дефолтного
языка. Как это сделать?
Например есть урлы: 

site.com/en/login -> site.com/login(убераеться _locale), 
site.com/fr/login -> site.com/fr/login(остаеться _locale)

    


Ответы

Ответ 1



Я нашел решение которое мне подходит.Нужно установить бандл JMSI18nRoutingBundle Вот урок как настраивать сконфигурировать бандл. (Сыылка на видео) с 6-й минуты jms_i18n_routing: default_locale: "%locale%" locales: [ru, ua] strategy: prefix_except_default (тут важно поставить именно такой параметр)

понедельник, 6 января 2020 г.

Динамическое изменение requirements для route-а. Symfony 3.3

#php #url #symfony2 #symfony #symfony3


Возможно ли динамически изменять параметр requirements для @Route ?

Что я имею ввиду:


В базе имеется список услуг, у который есть свой url (service1, service2 и т.д)
Имеется шаблон, который будет использоваться в данном случае.


Имею подобный Action:

/**
 * @Route(
 *     "/{service_url}/",
 *     requirements = {
 *         "service_url": "service1|service2|service3|service4"
 *     }
 * )
 */
public function blablaAction($service_url)
{
    ...code...
}


Могу ли я данный параметр изменять динамически? 

Т.е. добавил новую услугу в базе, получаю url новой услуги и добавляю его в параметр
requirements.
Можно, конечно, каждый раз "руками" добавлять новую услугу, но это будет довольно
неудобно, т.к. хочется, чтобы подобное действие в дальнейшем происходило без участия
программиста.
    


Ответы

Ответ 1



Естественно это возможно. Вернее так, я думаю это естественно возможно, но сам этого не делал. Давайте по порядку. В одном из ответов ссылались на Symfony CMF и их динамический роутер. Если открыть эту страницу документации вы увидите что там пишут в общем то о том, о чем я вам напишу ниже. Вот что пишут там https://symfony.com/doc/3.3/routing/routing_from_database.html Это не магия, это попросту кастомный лоадер. Это вообще говоря не проблема и никогда проблемой не было. Сейчас я Вам все объясню. Смотрите. Symfony - крайне гибкая система. По сути своей Symfony - это набор независимых компонентов. Вам нужно внимательнее изучить компонент Routing. Если внимательно прочитать документацию, то можно заметить что вы, например, можете создать свой, "кастомный", загрузчик роутов (обзову их по-русски именно так). И вот понимая что вы можете создать свой загрузчик, вы понимаете что можете загружать роуты из любого места и они у вас могут быть любой конфигурации. Будь то файл, будь то база данных, будь то что то пришедшее из космоса и естественно ваши роуты могут реагировать на состояние вашей системы, хоть температуру окружающей среды. Так же вам нужно понять что аннотации - это одно из описаний роутов которые подгружаются загрузчиком роутов... правильно! который загружает роуты описанные в аннотациях. Давайте теперь ближе к делу. Вам нужно сделать роуты, которые зависят от моделей. Нет ничего проще! Открываете документацию вот тут . Смотрите как создается кастомный Loader, создаете сервис с тэгом routing.loader и добавляете в описание своих роутов в (routing.yml). Все! В этот сервис вы можете добавить все что угодно и описывать роуты как угодно. Слева, справа, сверху и снизу! Не забудьте просто убрать существующие аннотации в контроллере и управляйте своими роутами в вашем собственном Loader-е Имеем в сухом остатке. Создаете свой лоадер согласно документации. (В его конструктор вы можете добавить EntityManager) Описываете роуты взависимости от ваших пожеланий (забирая данные из того же EntityManager) Добавляете его в routing.yml Радуетесь. Еще раз ссылка на документацию, она живет здесь https://symfony.com/doc/3.3/routing/custom_route_loader.html p.s. Последнее. согласно документации The routes defined using custom route loaders will be automatically cached by the framework. So whenever you change something in the loader class itself, don't forget to clear the cache. Это не должно сбивать вас с толку. Естественно что вся логика внутри сервиса остается динамической, но кэш надо будет чистить после изменений (я так понимаю что в dev режиме тоже)

Ответ 2



Такое возможно. Но только нужно что б@Route может состоять из имени урла (имя не изменяется) и его динамической части /services/{service_url}/. Как показано в примере по ссылке выше, правило будет выглядеть так: // src/AppBundle/Controller/ArticleController.php // ... class ArticleController extends Controller { /** * @Route( * "/articles/{_locale}/{year}/{slug}.{_format}", * defaults={"_format": "html"}, * requirements={ * "_locale": "en|fr", * "_format": "html|rss", * "year": "\d+" * } * ) */ public function showAction($_locale, $year, $slug) { } } В Вашем же случае должно быть как то так: /** * @Route( * "/services/{_service_url}/", * defaults={"_service_url": "sevice1"}, * requirements={ * "_service_url": "service1|service2|service3|service4" * } * ) */ public function blablaAction($_service_url){...} То есть необходимо наличие имени урла перед динамической частью.

Ответ 3



Динамически менять requirements не получится, так как этот параметр компилируется в кэш-файл и должен быть независим от внешних источников типа базы данных, так как скомпилируется единожды, затем будет использоваться скомпилированный файл. В проекте Symfony CMF решили немного исправить эту проблему и создали свой вариант роутера, который не кэшируется и всегда проверяет все условия в ран-тайме. Таким образом, они создали динамический роутер, который по данным из базы данных отдает нужную страницу. Подробнее про этот роутер можно прочитать здесь. Кроме того, если нужно просто отсеить все url-ы, которых нет в базе, то можно в самом контроллере запросить в БД нужный url и в случае, если он не найден, выдать ответ 404: /** * @Route( * "/{serviceUrl}/", * requirements = { * "serviceUrl": ".+" * } * ) */ public function blablaAction($serviceUrl) { $servicePage = $this->getRepository(ServicePage::class)->findBy(['url' => $serviceUrl]); if (!$servicePage) { return $this->createNotFoundException('Service url /' . $serviceUrl . ' was not found'); } ...code... }

Ответ 4



Вам это не нужно. Такой подход в корне неверен. Вам нужно воспользоваться банальным подходом (который был предложен выше, это /services/{serviceId}/) и проверять услугу внутри контроллера, там вы сможете сделать какие угодно проверки с услугами. В требованиях к идентификатору услуги можно оставить только regexp. Если вы попытаетесь реализовать выбранную вами схему, то вы пойдёте против системы и фреймворка, и обречёте себя, и следующих программистов, на постоянную боль от исправления багов в роутах и поддержку этого гиблого решения.

пятница, 3 января 2020 г.

Ошибка подключение к БД в symfony

#php #symfony2 #symfony #symfony3


Вылил сайт на хостинг и появилась ошибка подключения к базе данных.


  You have requested a non-existent parameter "database_name". Did you mean one of
these: database


Локально всё работает нормально. В чём может быть ошибка?
    


Ответы

Ответ 1



Скорее всего неправильно задан конфиг в parameters.yml либо в config.yml. в parameters.yml добавьте: parameters: database_host: YOUR_HOST database_port: 3306 database_name: DB_NAME database_user: DB_USER database_password: DB_PASS а в config.yml добавьте подключение к доктрине doctrine: dbal: default_connection: default connections: default: driver: pdo_mysql host: '%database_host%' port: '%database_port%' dbname: '%database_name%' user: '%database_user%' password: '%database_password%' charset: UTF8

среда, 1 января 2020 г.

Symfony 3, разный редирект после авторизации для разных ролей

#php #symfony #symfony3


У меня есть две роли

role_hierarchy:
    ROLE_ADMIN:       ROLE_USER
    ROLE_SUPER_ADMIN: ROLE_ADMIN


Мне нужно чтобы для пользователейпосле после авторизации с ролью ADMIN был редирект
в /admin
А для пользователей с ролью USER был редирект на /user
Сейчас в файле security у меня так:

firewalls:
    main:
        pattern: ^/
        form_login:
            provider: fos_userbundle
            csrf_token_generator: security.csrf.token_manager
            login_path: /login
            check_path: /login_check
            always_use_default_target_path: false
            default_target_path:            /admin

        logout:       true
        anonymous:    true


Как мне нужно модифицировать security или ещё что-то добавить, чтобы решить задачу?
    


Ответы

Ответ 1



В разделе firewalls вы должны иметь 2 подраздела. Один для обычных клиентов а второй для менеджеров. И вы можете дать группу страниц которые должны быть доступны для конкретной группе клинентов с помощью pattern. Например pattern: /admin(.*) В итоге у вас должно получиться такой config firewalls: main: pattern: ^/ form_login: provider: fos_userbundle csrf_token_generator: security.csrf.token_manager login_path: /login check_path: /login_check always_use_default_target_path: false default_target_path: /user logout: true anonymous: true admin: pattern: /admin(.*) form_login: provider: fos_userbundle csrf_token_generator: security.csrf.token_manager login_path: /login check_path: /admin/login_check always_use_default_target_path: false default_target_path: /admin logout: true anonymous: true

Ответ 2



Если нужно использовать один firewall (например, чтобы авторизованный админ на фронте тоже был авторизован), то можно использовать success_handler в firewall SecurityBundle Configuration security.yml main: pattern: ^/ form_login: provider: fos_userbundle csrf_token_generator: security.csrf.token_manager login_path: /login check_path: fos_user_security_check failure_handler: user.authentication.failure_handler success_handler: user.authentication.success_handler services.yml services: user.authentication.success_handler: class: UserBundle\Security\AuthenticationSuccessHandler arguments: ["@router"] AuthenticationSuccessHandler.php class AuthenticationSuccessHandler implements AuthenticationSuccessHandlerInterface { /** @var I18nRouter */ protected $router; public function __construct(I18nRouter $router) { $this->router = $router; } /** * {@inheritdoc} */ public function onAuthenticationSuccess(Request $request, TokenInterface $token) { /** @var User $user */ $user = $token->getUser(); // Проверяем роль пользователя, генерим url через router, возвращаем ответ с редиректом return $response; } }

пятница, 27 декабря 2019 г.

Правильно ли добавлять в сущность посторонние методы в symfony

#php #ооп #symfony #symfony3 #best_practice


Изучаю symfony, использую версию 3.4
Возник такой вопрос. У меня есть таблица domains со списком доменов и соответственно
сущность для этой таблицы с полями таблицы и геттерами-сеттерами для них.
Появилась необходимость выяснить в коде, есть ли у домена кириллические символы (русские
буквы). И возник вопрос, корректно ли будет с точки зрения best practices добавить
в сущность AppBundle\Entity\Domains метод вроде:

public function isCyrillic(){
    return preg_match('/[\p{Cyrillic}]/u', $this->name) === 1 ? true : false;
}


А потом добавлять в эту сущность ещё и ещё подобных методов? Или в сущности должны
храниться только описания полей таблицы и геттеры-сеттеры для них? А другие методы
нужно выносить в сервисы или ещё куда-то?
Интересует ответ именно best practices, т.к. хочется писать код корректно и не лепить
велосипеды. Нужно мнение профессионала)
    


Ответы

Ответ 1



Приведенный вами метод вполне укладывается в представление Enitiy. Туда подходит всё что может содержать префикс is|get|set|has и прочие. Сервисы могут иметь подобные методы, но сами они stateless, поэтому придётся на вход подавать эту самую сущность, что не очень практично. Репозитории так же сам по себе являются stateless, и служат для работы уже с самими сущностями, так что туда тоже не стоит относит подобные методы.

Ответ 2



Это нарушит принцип SRP. Класс не должен иметь несколько обязанностей. Обязанность данного класс - хранить и получать данные. Метод isCyrillic добавляет классу новую обязанность. А это может привести к дублированию кода и увеличению сложности класса. Вы не сможете воспользоваться этим методом в других местах или вообще в других проектах. Поэтому я бы вынес этот метод в отдельный сервис.

воскресенье, 22 декабря 2019 г.

Как правильно организовать мультиязычность Symfony4

#php #symfony #symfony3 #symfony4


Сталкнулся c непониманием, как можно организовать мультиязычность в symfony4. Идея
такая, есть адрес, например site.com. Если он без префикса локали, брать дефолтную
локаль, если он например site.com/en/, брать английскую локаль. Как правильно сделать
так, что бы локаль сетилась из префикса, а соответсвтенно подтягивались все переводы
и т.д. Ну и, если есть возможность, все урлы были с префиксом.
    


Ответы

Ответ 1



Как указывал @u_mulder выше в документации. В symfony есть бандл Translations. И весь механизм сводится к таким пунктам. настройка translations; включение локали в URL; Базовый перевод; Создать файлы перевода для каждой поддерживаемой локали; перевод в шаблоне. Настройка translations. Установка composer require symfony/translation Настройка translations. Конфигурация В документации предлагают создать некий config/packages/translation.yaml, а потом его подключить в config.yaml. Я предлагаю прямо сразу в конфиге в секции framework добавить framework: default_locale: 'ru' translator: fallbacks: ['ru'] Где default_locale локаль по умолчанию, а fallbacks - это резервная локаль. То есть локаль на которую будет переведен ключ в случае, если нигде не нашлось перевода. Включение локали в URL Механизм поддерживается системой маршрутизации с использованием специального параметра _locale. Добавляем в рутовый конфиг роутинга следующее: # config/routes.yaml main: path: /{_locale} controller: App\Controller\MainController::index requirements: _locale: ru|en Теперь роутинг будет формироваться example.com/ru. А так как ru по умолчанию, то example.com должен сделать редирект на example.com/ru. Соответсвенно, обращение к какому-нибудь example.com/ru/home нужно добавить : # config/routes.yaml main: .... home: path: /{_locale}/home controller: App\Controller\HomeController::index requirements: _locale: ru|en Но если нам, допустим, понадобится, к примеру, example.com/ru/home/room. Опять писать правило только для другого метода HomeController? Нет, в symfony можно настроить это глобально: # config/routes.yaml main: resource: "@AppBundle/Resources/config/routing.yml" prefix: /{_locale} requirements: _locale: ru|en defaults: { _locale: ru} Базовый перевод; этот пункт для случаев если нужно переводить прямо в коде. //MainController use Symfony\Contracts\Translation\TranslatorInterface; public function index(TranslatorInterface $translator) { $translated = $translator->trans('Some text'); // ... } Создать файлы перевода для каждой поддерживаемой локали По умолчанию Symfony ищет переводы в: translations/ в корне проекта; src/Resources/BUNDLE_NAME/translations/ в конкретном бандле depricated; Resources/translations/ в папке ресурсов. Также важно указать имя файла перевода. По умолчанию создайте файлы в папке translations/ messages.ru.yaml и messages.en.yaml. Ну и заполняем словари: # translations/messages.ru.yaml Some text: какой-то текст Hello world: привет мир ///////////////// # translations/messages.en.yaml Some text: кSome text Hello world: Hello world Как формируется правила создания файла перевода, настройка пути - все это можно почитать тут. Перевод в шаблоне Ну и в шаблоне (twig файле) переводим так: {{ message|trans }} Полезная информация: - управлять локалью для сессий пользователя; - переводы в шаблонах; - Как работать с локалью пользователя; - материалы на русском (не уверен что будет работать, но существенно упростит понимание некоторых моментов)

суббота, 14 декабря 2019 г.

Symfony 3 деплой и развертывание проекта на сервере

#symfony3


Какой способ лучше всего подходит для деплоя symfony3 проекта? Как это сделать по
чистому ftp?
Прогуглив, наткнулся на Capifony, но по идеи он не работает с третьей версией symfony.
    


Ответы

Ответ 1



1.Вариант Symfony Deployment Basics Типичные шаги при развертывании приложения Symfony включают в себя: Вы можете добавить свой код на сервер используя какой нибудь FTP клиент.Например FileZilla Установите ваши зависимости для vendor (как правило, делается с помощью Composer и может быть сделано перед загрузкой). Запуск миграции базы данных или аналогичные задачи по обновлению структуры изменения данных. Очистка кэша. Развертывание может также включать в себя другие задачи, такие как: Пометка определенную версию вашего кода в качестве выхода в репозитории управления исходными кодами Создание временного плацдарма для построения настроек обновлений "в автономном режиме - offline" Выполнение каких-либо тестов, доступных для обеспечения кода и / или стабильность работы сервера Удаление любых ненужных файлов из web/directory, чтобы сохранить производственную среду,то бишь environment в чистоте. Очистка внешних систем кэш-памяти (как Memcached или Redis). 2.Вариант Все это сделать локально а потом с помощью Source Control (Git,Tortoise) залить на сервер. 3.Вариант Есть также инструменты, чтобы помочь облегчить "боль" развертывания. Некоторые из них были специально адаптированы к требованиям Symfony. http://symfony.com/doc/current/cookbook/deployment/tools.html#using-build-scripts-and-other-tools

среда, 10 июля 2019 г.

Отображение в режиме production для Symfony 3

Здравствуйте!
Делаю тест на Symfony 3 (до этого работал с Laravel).
Никак не могу понять, как настроить отображение контента в prod-окружении. Маршруты через app_dev.php отображаются нормально, а без него возвращается 500 ошибка.
Подскажите, пожалуйста, где копать? Информации по этому вопросу на официальном сайте пока найти не удалось, а сроки поджимают.
В логе следующее:
[2016-04-18 09:13:08] request.ERROR: Uncaught PHP Exception Symfony\Component\HttpKernel\Exception\NotFoundHttpException: "No route found for "GET /address"" at D:\webdev\symfony\site.lc\vendor\symfony\symfony\src\Symfony\Component\HttpKernel\EventListener\RouterListener.php line 123 {"exception":"[object] (Symfony\\Component\\HttpKernel\\Exception\\NotFoundHttpException(code: 0): No route found for \"GET /address\" at D:\\webdev\\symfony\\site.lc\\vendor\\symfony\\symfony\\src\\Symfony\\Component\\HttpKernel\\EventListener\\RouterListener.php:123, Symfony\\Component\\Routing\\Exception\\ResourceNotFoundException(code: 0): at D:\\webdev\\symfony\\site.lc\\var\\cache\\prod\\appProdUrlMatcher.php:46)"} []


Ответ

Итак, всё дело в кэше.
Поскольку prod среда оптимизирована для скоростной работы, то конфигурация, маршрутизация и Twig-шаблоны компилируются в голые PHP-классы и кэшируются. Если вы изменили что-либо в dev среде и хотите посмотреть как это выглядит в prod среде, то вам нужно очистить кэш этой среды (prod); если этого не сделать, то вы увидите то, что откомпилировалось и закэшировалось ранее.
Очистить кэш в Symfony можно с помощью консоли:
php bin/console cache:clear
Команда выше очистит кэш dev среды, так как по умолчанию консольные команды выполняются в ней (dev среде)
Чтобы очистить кэш для prod или другой среды, нужно добавить соответствующую опцию:
php bin/console cache:clear --env=prod
Альтернативный вариант:
php bin/console cache:clear -e prod
Источники:
The Symfony Book → Configuring Symfony (and Environments) → #Environments The Symfony Cookbook → Recipes about Console → How to Use the Console

Не авторизирует Symfony

Есть action регистрации
public function SignUpAction(Request $request) { $user = new User(); $em = $this->getDoctrine()->getManager(); $form = $this->createForm(SignUpType::class, $user);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$newUser = $form->getData(); $password = $this->get('security.password_encoder') ->encodePassword($user, $newUser->getPassword()); $user->setSalt(md5(time())); $user->setPassword($password); $user->setIsActive(true); $user->setEmail($newUser->getEmail()); $user->setUsername($newUser->getUsername()); $user->setStatus(true);
$role = $em->getRepository('AppBundle:Role') ->findByName('ROLE_ADMIN'); $user->getUserRoles()->add($role); $em->persist($user); $em->flush();
return $this->redirectToRoute('AppBundle_homepage');
}
return $this->render('AppBundle:Security:signup.html.twig', array( 'form' => $form->createView() )); }
Регистрация проходит успешно в базе все есть. Но если я потом сразу хочу войти в систему, выдает в лог такие ошибки . Подскажите в чем дело?
[2016-09-08 18:30:49] security.INFO: Authentication request failed. {"exception":"[object] (Symfony\\Component\\Security\\Core\\Exception\\BadCredentialsException(code: 0): Bad credentials. at /var/www/symfony.first/vendor/symfony/symfony/src/Symfony/Component/Security/Core/Authentication/Provider/UserAuthenticationProvider.php:90, Symfony\\Component\\Security\\Core\\Exception\\BadCredentialsException(code: 0): The presented password is invalid. at /var/www/symfony.first/vendor/symfony/symfony/src/Symfony/Component/Security/Core/Authentication/Provider/DaoAuthenticationProvider.php:67)"} []
Здесь я читал, что нужно добавить такой код.
$token = new UsernamePasswordToken($user, $user->getPassword(), "main", $user->getRoles()); $this->get("security.token_storage")->setToken($token);
$event = new InteractiveLoginEvent($request, $token); $this->get("event_dispatcher")->dispatch("security.interactive_login", $event);
И тогда оно авторизирует и вроде все ок, но если я выхожу и хочу опять зайти, то выдает ошибку, которую я описал выше.
security: encoders: App\AppBundle\Entity\User: algorithm: sha512 encode-as-base64: true iterations: 10
providers: main: entity: { class: AppBundle:User, property: username }
firewalls: main: pattern: /.* form_login: check_path: /login_check login_path: /login/ logout: true security: true anonymous: true remember_me: secret: '%secret%' lifetime: 604800 # 1 week in seconds path: / # by default, the feature is enabled by checking a # checkbox in the login form (see below), uncomment the # following line to always enable it. #always_remember_me: true
access_control: - { path: /admin/.*, role: ROLE_ADMIN } - { path: ^/login/, roles: IS_AUTHENTICATED_ANONYMOUSLY } - { path: /.*, role: IS_AUTHENTICATED_ANONYMOUSLY }


Ответ

Думаю, salt нужно устанавливать перед тем, как зашифровывать пароль. А то ты шифруешь пароль с одной солью, а расшифровываешь с другой.
$newUser = $form->getData(); $user->setSalt(md5(time())); $password = $this->get('security.password_encoder') ->encodePassword($user, $newUser->getPassword());

понедельник, 18 марта 2019 г.

Symfony 3, удалить записи из двух таблиц

Здравствуйте, мне нужно удалить записи из двух таблиц. Есть таблица orders которая связана по типу один ко многим с таблицей order_item. Нужно по некоторой выборке записей из orders удалить соответствующие запитси в order_item.
public function deleteOrders() { $dayClear = new DateTime('-2 days');
return $this->createQueryBuilder('o') ->delete('AdminBundle:Order', 'o') ->delete('AdminBundle:OrderItem', 'oi') ->leftJoin('AdminBundle:OrderItem', 'oi', 'WITH', 'oi.order_id = o.id')
->where('o.total IS NULL') ->andWhere('o.updated <= :dayClear') ->setParameter('dayClear', $dayClear) ->getQuery() ->getResult();
}
Я реализовал такой метод для удаления. но он не рабочий, при этом когда я комментирую строку
->delete('AdminBundle:OrderItem', 'oi')
то данные из первой таблице удаляются. В чем может быть проблема и как решить задачу? Заранее спасибо!


Ответ

Если реализовывать через DQL, думаю проще будет в первую очередь нужно найти ids. И потом можно сделать приблизительно так:
$this->createQueryBuilder('o') ->delete() ->from('AdminBundle:Order o, AdminBundle:OrderItem oi') ->whereIn('o.id', '?', $ids) ->whereIn('o.order_id', '?', $ids) ->getQuery() ->getResult();

вторник, 22 января 2019 г.

Ошибка подключение к БД в symfony

Вылил сайт на хостинг и появилась ошибка подключения к базе данных.
You have requested a non-existent parameter "database_name". Did you mean one of these: database
Локально всё работает нормально. В чём может быть ошибка?


Ответ

Скорее всего неправильно задан конфиг в parameters.yml либо в config.yml.
в parameters.yml добавьте:
parameters: database_host: YOUR_HOST database_port: 3306 database_name: DB_NAME database_user: DB_USER database_password: DB_PASS
а в config.yml добавьте подключение к доктрине
doctrine: dbal: default_connection: default connections: default: driver: pdo_mysql host: '%database_host%' port: '%database_port%' dbname: '%database_name%' user: '%database_user%' password: '%database_password%' charset: UTF8

воскресенье, 21 октября 2018 г.

Symfony 3 деплой и развертывание проекта на сервере

Какой способ лучше всего подходит для деплоя symfony3 проекта? Как это сделать по чистому ftp? Прогуглив, наткнулся на Capifony, но по идеи он не работает с третьей версией symfony.


Ответ

1.Вариант
Symfony Deployment Basics
Типичные шаги при развертывании приложения Symfony включают в себя:
Вы можете добавить свой код на сервер используя какой нибудь FTP клиент.Например FileZilla Установите ваши зависимости для vendor (как правило, делается с помощью Composer и может быть сделано перед загрузкой). Запуск миграции базы данных или аналогичные задачи по обновлению структуры изменения данных. Очистка кэша.
Развертывание может также включать в себя другие задачи, такие как:
Пометка определенную версию вашего кода в качестве выхода в репозитории управления исходными кодами Создание временного плацдарма для построения настроек обновлений "в автономном режиме - offline" Выполнение каких-либо тестов, доступных для обеспечения кода и / или стабильность работы сервера Удаление любых ненужных файлов из web/directory, чтобы сохранить производственную среду,то бишь environment в чистоте. Очистка внешних систем кэш-памяти (как Memcached или Redis).
2.Вариант
Все это сделать локально а потом с помощью Source Control (GitTortoise) залить на сервер.
3.Вариант
Есть также инструменты, чтобы помочь облегчить "боль" развертывания. Некоторые из них были специально адаптированы к требованиям Symfony.
http://symfony.com/doc/current/cookbook/deployment/tools.html#using-build-scripts-and-other-tools