Вопрос по symfony – Как я могу переопределить основные классы Symfony2?

1

Я хочу переопределить основной класс Symfony2.

В частности, я хочу переопределить vendor / symfony / symfony / src / Symfony / Bundle / FrameworkBundle / Templating / TemplateReference.php, TemplateReference, чтобы я мог изменять местоположения, где он находит шаблоны. Возможно ли это, и если да, то как?

Какой вариант использования? Elnur Abdurrakhimov
Например, я хочу автоматически обнаруживать мобильные устройства, и если пользователь приходит с мобильного устройства, я хотел бы посмотреть, находится ли эквивалентный файл шаблона в views / mobile / вместо / views / .. Точный файл I Упомянутый содержит класс, который находит путь к шаблонам веток. Ceagle

Ваш Ответ

2   ответа
7

если вы точно не знаете, что делаете, и вы на 100% уверены, что что-то не сломаете ...

Если вы используете компонент Symfony 2.0 ClassLoader:

$loader->registerNamespaces(array(
    'Symfony' => array(
        __DIR__.'/../src/vendor/symfony/src',
        __DIR__.'/../vendor/symfony/src',
        __DIR__.'/../vendor/bundles',
    ),
    ...
));

Чтобы сделать это с композитором, это должно работать, отредактируйтеcomposer.json файл:

"autoload": {
    "psr-0": {
         "": "src/",
         "Symfony": "src/vendor/symfony/src/"
    }
},

Это говорит автозагрузчику, что когда он пытается загрузить класс изSymfony пространство имен, чтобы сначала заглянуть в вашsrc/vendor/symfony/src, затем вvendor/symfony/src затем вvendor/bundles ...

А затем продублируйте файл, который вы хотите отредактировать:

src/vendor/symfony/src/Symfony/Bundle/FrameworkBundle/Templating/TemplateReference.php
Да, но его вопрос помечен как 2.0, а не 2.1 :)
эм ... Начал комментарий с "Но 2.0 тоже использует композитор", но я был достаточно мудр, чтобы сначала взглянуть на него. Вы совершенно правы.
Тем временем Symfony использует механизм автозагрузки композиторов.
Он говорит, что вы все должны делать это по-разному, используя композитор на 2.1, но это может быть легко достижимо.
Мне нравится этот метод. Но вы говорите, что он не работает с 2.1? Ceagle
0

определенные как сервис (вы можете проверить в app / cache / dev / appDevDebugProejctContainer.xml), и переопределить имя сервиса в вашем файле parameter.ini.

НО, если класс не определен подобным образом, вы можете создать собственный & quot; патч & quot; Вы применяете после обновления композитора.

Многие люди скажут, что редактировать основные классы - это грязно, но если вам нужна хорошая производительность, зачастую это единственное решение для достижения этого ;-), это просто, быстро и легко. легко.

Другие решения приветствуются.

этот ответ немного скрыт, более подробную информацию можно найти здесь:stackoverflow.com/questions/23225839/… Кстати, трогать основные классы плохо, никогда не делай этого

Похожие вопросы