Страницы

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

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

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

Переход на PostgreSQL

#php #postgresql #symfony2


В общем есть сайт на symfony меняю драйвер на pdo_pgsql, фэйлится фиксура которая
создает юзера default. 


  INSERT INTO user (Usr_Username, Usr_Email,
  
  ERROR:  syntax error at or near "user"


В общем система хочет чтобы user был в кавычках так как есть такая же переменная 

Так написана фикстура

 $entity = new User();
            $entity->setUsername("root");
            $manager->persist($entity);
 $entity
            ->setPassword("bla")
            ->setEmail("bla@gmail.com")
            ->setFirst("root")
            ->setLast("root")
            ->setOfficePhone("1")
            ->setMobilePhone("1")
            ->setTimeZone("11")
            ->setEnabled(true);
 $manager->flush();


В общем как бы это можно было исправить?
    


Ответы

Ответ 1



В общем оставлю для себя заметку, в User Entity нужно название таблицы написать в 3х кавычках /** * @ORM\Table(name="""user""") */ Дальше по аналогии в общем, если есть проблемы, у меня была только в этом месте.

Ответ 2



user - ключевое слово в Postgresql, на мой взгляд, лучше было бы использовать иное название таблицы или префикс. /** * @ORM\Table(name="users") */

воскресенье, 2 февраля 2020 г.

Правильный подход к организации хранения routes в Symfony

#php #symfony2


Здравствуйте!

В данный момент я изучаю Symfony 2 и предо мной встала такая дилема:

Как лучше хранить routes для контроллеров?

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

Приведу свои размышления:

Насколько мне известно, Symfony имеет 2 основных варианта хранения routes


В конфигах (routing.yml, routing.xml и тд), возможно также подключать routing из бандлов.
В аннотациях


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

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

Третий вариант - это хранить все роуты в app/config/routing.yml. Но это усложнит
повторное использование бандлов. И, почему-то, мне этот вариант интуитивно не нравится.

Со стороны может показаться что я задал вопрос и сам же на него ответил. Это не так.
Я вижу эти варианты, но не знаю какой и когда лучше использовать, так как нет опыта
сколько-нибудь серьезной разработки на Symfony.

Буду рад и благодарен любому мнений, и в двойне - мнению аргументированному.
    


Ответы

Ответ 1



Использую Symfony два года, на 4 проектах. В первых двух использовал конфигурирование маршрутов в yaml-файле, на третьем решил попробовать аннотации. Понял, что использование аннотаций гораздо удобнее, хотя поначалу думал "как хорошо когда все маршруты в одном файле". Совсем наоборот. Как минимум, при создании нового контроллера приходится что-то делать в двух файлах, а с аннотациями - ctrl+c - ctrl+v в одном файле, чуть переименовал и готово. Если строго следовать именованию файлов и маршрутов - никаких проблем с нахождением нужного контроллера не возникает. Тем более в IDE, где просто по имени роута в шаблоне тыкнул и ты уже в контроллере. С точки зрения производительности: на первом проекте активно курил доки и рекомендации с аналогичным вашему вопросом. Вычитал где-то, что yaml-файлы производительнее. Но на деле никакой заметной разницы нет, все в любом случае хорошо кешируется и готово к употреблению движком "в лучшем виде". Добавлю еще, что проекты достаточно крупные, чтобы различия в использовании подходов были заметны. Так вот с yaml-файлом неприятнее: огромная портянка на 1.5к строк, в которой и нужное и ненужное и хочется еще соблюдать какой-то порядок и разделять комментами на разделы, чтобы приличнее было... А с аннотациями все на своем месте, всегда под рукой, никакой каши.

Ответ 2



Сами разработчики в своих Best Practice предлагают использовать конфигурирование маршрутов, кэширования и безопасности через аннотации: Make your controller extend the FrameworkBundle base controller and use annotations to configure routing, caching and security whenever possible. и я с ними полностью согласен. Очень удобно, когда конфигурация находится в одном месте с кодом, а по быстродействию - нет никакой разницы. In addition, using annotations for routing, caching and security simplifies configuration. You don't need to browse tens of files created with different formats (YAML, XML, PHP): all the configuration is just where you need it and it only uses one format.

пятница, 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' вроде такого.

понедельник, 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

вторник, 16 июля 2019 г.

Ошибка Access denied for user 'myuser'@'localhost' (using password: YES)

SQLSTATE[28000] [1045] Access denied for user 'myuser'@'localhost' (using password: YES) (тоже самое и с root).
Симфони выдает эту ошибку после попытки создать базу php app/console doctrine:database:create
Переустанавливал как здесь — не помогло. Переустанавливал Lamp — тоже не помогло. Давал user'ам все привилегии, в том числе и создавать базы.
Вот они сами:
---------------+ | localhost | root | * | | harmonica | root | * | | 127.0.0.1 | root | * | | ::1 | root | * | | localhost | debian-sys-maint | * | | localhost | myuser | * | | locdalhost | root
Когда пытался поставить phpmyadmin, после ввода всех паролей, установщик выдавал ошибку:
Access denied for user 'root'@'localhost' (using password: YES)
Долго вожусь с этой ошибкой. Просмотрел темы и на обычном stock'е, рецепты не помогли.
Мог что-то упустить?


Ответ

про apache, php и mysql-server
во-первых, я бы рекомендовал не ставить какие-то сторонние сборки (lamp и т.п.) вместо отлично поддерживаемых и хорошо взаимно-интегрированных дистрибутивных пакетов mysql-server, apache, php
для установки этих (и всех зависимых) пакетов (и для связки php с apache и mysql) можно выполнить такую, например, команду:
$ sudo apt-get install apache2 libapache2-mod-php5 php5-mysql
пароль пользователя mysql-базы данных root (если не был запрошен при установке пакетов) меняется абсолютно штатными средствами
после создания базы данных (командой типа create database имя-базы-данных default charset utf8; в «оболочке» mysql) можно создать (в той же «оболочке») и пользователя для доступа к этой базе. примерно так:
> grant all privileges on имя-базы-данных.* to пользователь@localhost identified by 'пароль';
про «оболочку» mysql
эта программа входит в пакет mysql-client (устанавливается автоматически по зависимостям от, например, вышеприведённой команды apt-get install ...).
вызывается с указанием пользователя, запросом пароля и опциональным указанием базы данных, например, так:
$ mysql -u root -p [имя-базы-данных] Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. ... mysql>
после удачного запуска можно вводить sql-команды (типа create database ... и т.п.).
про phpmyadmin
устанавливается пакет, как и обычно:
$ sudo apt-get install phpmyadmin
при установке будет предложено добавить нужные настройки в конфигурацию http-сервера. подробнее смотрите здесь

пятница, 5 апреля 2019 г.

Правильный подход к организации хранения routes в Symfony

Здравствуйте!
В данный момент я изучаю Symfony 2 и предо мной встала такая дилема:
Как лучше хранить routes для контроллеров?
Да, я понимаю что этот вопрос с немного холиварным подтекстом, ибо на вкус и цвет... Но все же меня интересует этот вопрос с точки зрения огранизации средних/больших приложений.
Приведу свои размышления:
Насколько мне известно, Symfony имеет 2 основных варианта хранения routes
В конфигах (routing.yml, routing.xml и тд), возможно также подключать routing из бандлов. В аннотациях
Наиболее удобным мне кажется вариант с аннотациями, но когда контроллеров и методов станет много, скажем 50+, возникнет сложность определения что и где находится, и как следствие усложнение разработки и дебага.
Также приемлемым мне кажется складывать routes в routing файлы каждого бандла. В этом случае будет удобно повторно использовать бандлы в других проектах, и зная за какой функционал отвечает определенный бандл, искать нужные роуты. Но все же при большом количестве бандлов это может стать проблемой.
Третий вариант - это хранить все роуты в app/config/routing.yml. Но это усложнит повторное использование бандлов. И, почему-то, мне этот вариант интуитивно не нравится.
Со стороны может показаться что я задал вопрос и сам же на него ответил. Это не так. Я вижу эти варианты, но не знаю какой и когда лучше использовать, так как нет опыта сколько-нибудь серьезной разработки на Symfony.
Буду рад и благодарен любому мнений, и в двойне - мнению аргументированному.


Ответ

Использую Symfony два года, на 4 проектах. В первых двух использовал конфигурирование маршрутов в yaml-файле, на третьем решил попробовать аннотации. Понял, что использование аннотаций гораздо удобнее, хотя поначалу думал "как хорошо когда все маршруты в одном файле". Совсем наоборот. Как минимум, при создании нового контроллера приходится что-то делать в двух файлах, а с аннотациями - ctrl+c - ctrl+v в одном файле, чуть переименовал и готово. Если строго следовать именованию файлов и маршрутов - никаких проблем с нахождением нужного контроллера не возникает. Тем более в IDE, где просто по имени роута в шаблоне тыкнул и ты уже в контроллере.
С точки зрения производительности: на первом проекте активно курил доки и рекомендации с аналогичным вашему вопросом. Вычитал где-то, что yaml-файлы производительнее. Но на деле никакой заметной разницы нет, все в любом случае хорошо кешируется и готово к употреблению движком "в лучшем виде".
Добавлю еще, что проекты достаточно крупные, чтобы различия в использовании подходов были заметны. Так вот с yaml-файлом неприятнее: огромная портянка на 1.5к строк, в которой и нужное и ненужное и хочется еще соблюдать какой-то порядок и разделять комментами на разделы, чтобы приличнее было... А с аннотациями все на своем месте, всегда под рукой, никакой каши.

вторник, 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