Блог Андрея

 
 

FAQ по установке Symfony 3 и Symfony 4 на localhost xubuntu 18.04

13.10.2019 15:12 Версия Symfony CLI новее чем версия Symfony при запуске php bin/console server:run

Установил последнюю версию Symfony пользуясь официальной документацией. После запуска

php bin/console server:run

оказалось, что версия Symfony 3.4.x.

Решение:

Обновил версию php на localhost с 7.0.8 до 7.2.19, после чего снова выполнил

symfony new hellos4 --full
cd hellos4
php bin/console server:run

Версия Symfony в открывшемся окне оказалась 4.2.x.

13.10.2019 15:12 При попытке php bin/console server:run ошибка There are no commands defined in the «server» namespace

Решение:

Надо создавать проект используя опцию --full, например

symfony new hellos4 --full

13.10.2019 15:12 Я скачал последнюю версию Symfony с официального сайта, но мне нужно Symfony 3.

Решение:

Надо указать версию при создании проекта:

symfony new hellos34 --full --version=3.4

13.10.2019 21:09 Я хочу перенести проект с самодельного движка на Symfony, у меня есть база данных, как мне сгенерировать файлы моделей для готовых таблиц?

Решение:

При использовании современной (на 13.10.2019) Symfony CLI

symfony --V
Symfony CLI version v4.7.3 (Fri Oct 11 10:22:00 MSK 2019)

php bin/console --version
Symfony 3.4.32 (kernel: src, env: dev, debug: true)

достаточно сконфигурировать .env файл:


DATABASE_URL=mysql://andrey:123456@127.0.0.1:3306/databasename

и выполнить

 php bin/console doctrine:mapping:import "AppEntity" annotation --path=src/Entity
 php bin/console make:entity --regenerate App

Источник в документации

16.10.2019 15:35 У меня есть своя php библиотека, которую я хочу использовать. Как мне добавить её в проект?

Решение:

Посмотрите в папку vendor - там лежат сторонние библиотеки.

Если вы уверены, что ваш код в этой библиотеке качественный и не зависит от других ваших, никому не известных php файлов, возможно вам стоит опубликовать ваш код как пакет для composer на packagist.org. Для этого нужен репозиторий на гитхаб и аккаунт на packagist.org. Детали публикации описаны в документации packagist.org. После чего ставим вашу библиотеку через композер и ваш класс становится доступным в контроллере через автозагрузку.

Если вы пока не хотите делиться своей библиотекой с миром (иногда мир от этого может только выиграть), делаем так:

  1. Помещаем код вашего класса в vendor, например создаем каталог vendor/andrey/superlibrary/src.
  2. Открываем `vendor/composer/autoload_classmap.php`
  3. Добавляем строку 'AndreySuperlib' => $vendorDir . '/andrey/superlibrary/src/andreysuperlib.php',
  4. Открываем `vendor/composer/autoload_static.php`
  5. Добавляем строку в переменную public static $classMap 'AndreySuperlib' => __DIR__ . '/..' . '/andrey/superlibrary/src/andreysuperlib.php',

После чего ваш класс опять же становится доступным в контроллере через автозагрузку.

Можно ещё импортировать из локального источника, как описано тут, но мне показалось излишним.

18.10.2019 13:42 Как получить значение из файла конфигурации yaml в TwigExtension (приложение Symfony 3.4 сгенерировано из консоли Symfony cli 4.3)?

Дано:

Файл `config/services.yaml`. В нём в секции parameters сконфигурировано значение, сколько записей показывать на странице. Надо получить это значение в вашем TwigExtension.

parameters:
  #Adverts per page
  app.records_per_page: 20

Решение 1 (простое при прямых руках):

В файле `src/Twig/GazelmeExtension.php` надо указать, что мы используем ContainerInterface и добавить конструктор.

namespace AppTwig;
use SymfonyComponentDependencyInjectionContainerInterface;
class GazelmeExtension extends Twig_Extension
{
    public function __construct(ContainerInterface $container)
    {
	    $this->container = $container;
    	$this->translator = $container->get('translator');
    }
//...
}

Далее, надо сделать параметр видимым. Файл `config/services.yaml`, но мог бы быть `config/packages/twig.yaml`.

# Это один из вариантов сделать видимым в twig шаблоне значение из конфига (app.records_per_page) определено выше
# Это можно перенести в config/packages/twig.yaml
twig:
  globals:
    records_per_page: "%app.records_per_page%"

И наконец, получаем значение в фильтре:

namespace AppTwig;
use SymfonyComponentDependencyInjectionContainerInterface;
class GazelmeExtension extends Twig_Extension
{
        public function someFilter(int $nId, string $sCityCodename, string $sRegionCodename, string $sAdvCodename, int $nCityId) : string
        {
		    //...
   		    $nRecordsPerPage = $this->container->get('twig')->getGlobals()['records_per_page'];
		   //...
        }
}

Решение 2 (не рекомендованное, но в принципе может быть познавательным. Появилось потому, что инструкцию use я написал выше namespace, а в сети полно примеров для более ранних версий Symfony):

Файл `config/services.yaml`. В нем уже есть секция services. В неё надо добавить


app.twig_extension:
            class: AppTwigGazelmeExtension #мой класс
            arguments: ["@service_container"] #тут нужны кавычки! Я на этом очень сильно споткнулся, несмотря на вывод об ошибках Symfony.
            tags:
                - { name: twig.extension, priority: 255 }

Это только начало.

Выше в этом же файле есть _defaults->autoconfigure: true. Его надо переустановить в false.

В файле `src/Twig/GazelmeExtension.php` надо добавить конструктор.

use SymfonyComponentDependencyInjectionContainerInterface; //вот тут и была моя главная ошибка - это должно быть под namespace!
namespace AppTwig;

class GazelmeExtension extends Twig_Extension
{
    //и тут я ещё удивился, а почему указание типа как ContainerInterface не сработало????
    public function __construct(SymfonyComponentDependencyInjectionContainerInterface $container)
    {
	    $this->container = $container;
    	$this->translator = $container->get('translator');
    }
//...
}

Далее, надо сделать параметр видимым. Снова файл `config/services.yaml`, но мог бы быть `config/packages/twig.yaml`.

# Это один из вариантов сделать видимым в twig шаблоне значение из конфига (app.records_per_page) определено выше
# Это можно перенести в config/packages/twig.yaml
twig:
  globals:
    records_per_page: "%app.X%"

И наконец, получаем значение в фильтре:

namespace AppTwig;
class GazelmeExtension extends Twig_Extension
{
        public function someFilter(int $nId, string $sCityCodename, string $sRegionCodename, string $sAdvCodename, int $nCityId) : string
        {
		    //...
   		    $nRecordsPerPage = $this->container->get('twig')->getGlobals()['records_per_page'];
		   //...
        }
}

18.10.2019 13:42 Как получить локализованую строку в TwigExtension (приложение Symfony 3.4 сгенерировано из консоли Symfony cli 4.3)?

Решение:

Сначала передайте сервис - контейнер (ServiceContainer) в ваше TwigExtension. Как это сделать написано тут.

Затем получите объект транслятора в конструкторе:

namespace AppTwig;
use SymfonyComponentDependencyInjectionContainerInterface;
class GazelmeExtension extends Twig_Extension
{
        public function __construct(ContainerInterface $container)
        {
		    //...
   		    $this->translator = $container->get('translator');
		   //...
        }
}

Затем локализуйте нужное значение в фильтре:

namespace AppTwig;
use SymfonyComponentDependencyInjectionContainerInterface;
class GazelmeExtension extends Twig_Extension
{
    /**
	 * @param float $v
	 * @return string
	*/
	public function roubleFilter(float $v) : string
    {
		$sUnit = $this->translator->trans('Roubles');
            //...
    }
}

23.10.2019 14:25 Как в Symfony 3.4 сделать редирект на предыдущую страницу, если имя маршрута не известно? (приложение Symfony 3.4 сгенерировано из консоли Symfony cli 4.3)?

Решение:

use SymfonyComponentHttpFoundationRedirectResponse;
//...
return new RedirectResponse( $oRequest->server->get('HTTP_REFERER', '/') );

23.10.2019 14:25 Как в twig шаблоне проверить, определена ли переменная varname? (приложение Symfony 3.4 сгенерировано из консоли Symfony cli 4.3)?

Решение:

{% if (varname is defined) %}varname is defined and equal   "[[ varname ]] "{% endif %}

Заметил, что тут уже много вопросов не по установке, а по использованию, перебираюсь сюда