ZF2 установить глобальную функцию для всего приложения

1

Для моего приложения я написал функцию, которая преобразует строки в SEO-доказательство /URL-адреса. Я использую функцию в разных модулях, но теперь я определяю функцию снова и снова в контроллере или в модели базы данных.

Мне интересно, как можно установить эту функцию только один раз и использовать ее во всем приложении (правильно).

Спасибо вам! :)

Теги:
function
zend-framework
zend-framework2
global

4 ответа

1

Создайте сервис, но не используйте закрытие. Закрытие не кэшируется.

module.config.php

use Application\Service\SeoService;
use Application\Factory\Service\SeoService;

//...

    'service_manager' => [
        'factories' => [
            SeoService::class => SeoServiceFactory::class,
        ],
    ],

Затем напишите свой завод SeoService и ваш класс SeoService:

завод

namespace Application\Factory\Service;

use Zend\ServiceManager\FactoryInterface;    
use Zend\ServiceManager\ServiceLocatorInterface;
use Application\Service\SeoService;

class SeoServiceFactory implements FactoryInterface {

    public function createService(ServiceLocatorInterface $serviceLocator)
    {
        $service = new SeoService( /* dependencies */ );
        return $service;           
    }
}

Затем напишите свой сервис

обслуживание

namespace Application\Service\SeoService;

class SeoService
{

    public function __construct( /* dependencies */ ){

    }

    public function convertString( $url ){
        // do your thing here
    }
}

Итак, в ваших контроллерах вы просто:

use Application\Service\SeoService;

$seo = $this->getServiceLocator()->get( SeoService::class );
$seo->convertString( ... );

Удачи.

0

Плагины Zend могут помочь вам в этом.

Есть несколько хороших статей о том, как создать пользовательский плагин, вот один из них:

В основном вам необходимо выполнить следующие три шага:

  1. Создайте класс плагина, расширяющий Zend\Mvc\Controller\Plugin\AbstractPlugin
  2. Включите ваш плагин в список плагинов контроллера invokables.
  3. Вызовите и используйте свой плагин в своем контроллере, как и любой другой встроенный контроллер ZF2
  • 0
    Как насчет использования плагина контроллера в модели?
  • 0
    Плагины контроллеров хороши только для контроллеров, и, следовательно, для именования :) Я не одобряю слишком много логики в моделях данных, но если вам придется, одним из способов было бы внедрить такую функциональность как часть вашей абстракции.
Показать ещё 2 комментария
0

Для этого я вижу много действительных подходов.

  1. Вы можете определить класс как " Tools и в этом классе определить свою функцию как статический метод. В будущем вы можете определить более похожие функции в этом классе. И звоните куда угодно: Tools::makeSlug();

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

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

Для этого нет правильного способа, потому что вы должны использовать ZF, встроенные в систему Plugin и DI.

Но вы можете достичь того, чего хотите, добавив эту функцию в свой index.php.


Предупреждение, не проверено:

Также вы должны добавить это как Factory to ServiceManager:

// in module.config.php
'service_manager' => array(
    'factories' => array(
        'somefunction' => function(){
            return function($param){
                return $param;
            };
        }
    )
)
// from service-manager
$fn = $sm->get('somefunction');
$fn('param');

Ещё вопросы

Сообщество Overcoder
Наверх
Меню