Переопределение основного контроллера Pimcore

· 4 мин чтения

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

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

Узнав, что вы можете расширить Pimcore с помощью пакетов, я потратил часы и часы, пытаясь переопределить контроллеры, методы JavaScript и многое другое.

Итак, в этом посте я объясню, как мне удалось переопределить контроллер. Как переопределить файлы javascript, будет позже 😎.

Создание пакета

Прежде всего нам нужно создать для него пакет, это довольно просто, как описано в документации Pimcore, нам просто нужно запустить bin/console pimcore:generate:bundle --namespace=EmiDemo/EmiDemoBundle в папке проекта.

Это вызовет некоторые вопросы, но не о чем беспокоиться.

Он создаст новую папку в папке src с пространством имен, которое мы объявили ранее, и внутри у нас будут все необходимые файлы для пакета.

Кроме того, плагин будет обнаружен административным сайтом Pimcore, но будет отключен, вам необходимо включить его, чтобы начать его использовать.

Переопределение метода контроллера

Для переопределения метода в контроллере сначала, очевидно, вам нужно найти действие, которое вы хотите обновить. Это кажется простым, но я расскажу вам так, как обычно (об этом узнал от моего товарища по команде Cesar).

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

Изображение от Gyazo

Затем просто откройте консоль и зайдите во вкладку «Сеть», повторите те же действия еще раз и попробуйте найти действие.

Изображение от Gyazo

Используя эту информацию, вы можете видеть, что действие, загружающее актив, — это http://localhost/admin/asset/get-data-by-id?_dc=1607601778450&id=2&type=image. Отсюда мы видим, что действие контроллера — get-data-by-id.

Найдите действие в главном контроллере

Для меня самый простой способ сделать это — просто найти во всех файлах кода Visual Studio

Изображение от Gyazo

Вероятно, он найдет более одного, поэтому вам нужно посмотреть и решить, какой из них является именно тем. В нашем случае мы работаем с активами, поэтому ясно, что мы хотим использовать AssetController.php.

Измените основной контроллер

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

В нашем случае я просто верну сообщение в начале метода, чтобы проверить его работу.

return $this->adminJson(['success' => false, 'message' => "Overriding the getDataByIdAction in the core!!"]);

Изображение от Gyazo

Затем давайте перезагрузим наш ресурс и проверим вкладку «Сеть».

Изображение от ГьязоДавайте оставим там то, что у нас есть, чтобы позже мы знали, что используем пакетное сообщение вместо основного.

Теперь давайте просто скопируем это во временный файл, чтобы отслеживать, что мы сделали.

Переместите эти изменения в пакет

Теперь, чтобы перенести эти изменения в наш пакет, сначала нам нужно кое-что из нашего основного контроллера:

  • Пространство имен
  • Импорт
  • Имя контроллера

Изображение от Gyazo

И, очевидно, метод getDataByIdAction который мы хотим переопределить.

Разоблачение контроллера

Нам нужно выставить контроллер, для этого нужно зайти в файл /src/EmiDemo/EmiDemoBundle/Resources/config/pimcore/routing.yml и добавить

options:
        expose: true

Также нам нужно изменить prefix на тот, который мы собираемся переопределить, в нашем случае на контроллер admin.

В итоге это будет выглядеть вот так

emi_demo_emi_demo:
    resource: "@EmiDemoEmiDemoBundle/Controller/"
    type:     annotation
    prefix:   /admin
    options:
        expose: true

DefaultController.php

В нашем файле мы добавим импорт и расширим контроллер тем, который переопределим.

Изображение от Gyazo

Затем мы просто скопируем метод из основного контроллера и, в нашем случае, обновим возвращаемое сообщение.

Изображение от Gyazo

Если вы помните, у нас уже есть сообщение в основном контроллере: Overriding the getDataByIdAction in the core!! и теперь мы должны увидеть Overriding the getDataByIdAction in the bundle!!

Изображение от Gyazo

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

Изображение от Gyazo

Закомментируйте оператор возврата и перезагрузите компьютер.

Изображение от Gyazo

Вот и все

И с помощью этой небольшой демонстрации вы увидите, насколько легко можно переопределить существующий базовый контроллер Pimcore. Есть несколько шагов, которым вы должны следовать, но в этом нет ничего сложного. Просто убедитесь, что вы открываете контроллер и время от времени очищаете кеш, пока вносите изменения, иногда он кэшируется, и вы застреваете, думая, что он не работает и просто кэшируется.

Если вам интересно, как переопределить файлы JavaScript, это будет описано в другом уроке 😁.