Для моего приложения я написал функцию, которая преобразует строки в SEO-доказательство /URL-адреса. Я использую функцию в разных модулях, но теперь я определяю функцию снова и снова в контроллере или в модели базы данных.
Мне интересно, как можно установить эту функцию только один раз и использовать ее во всем приложении (правильно).
Спасибо вам! :)
Создайте сервис, но не используйте закрытие. Закрытие не кэшируется.
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( ... );
Удачи.
Плагины Zend могут помочь вам в этом.
Есть несколько хороших статей о том, как создать пользовательский плагин, вот один из них:
В основном вам необходимо выполнить следующие три шага:
Zend\Mvc\Controller\Plugin\AbstractPlugin
Для этого я вижу много действительных подходов.
Вы можете определить класс как " Tools
и в этом классе определить свою функцию как статический метод. В будущем вы можете определить более похожие функции в этом классе. И звоните куда угодно: Tools::makeSlug();
Другим подходом является определение признака с помощью этой функции и расширение каждого класса, в котором вы хотите использовать функцию из этой черты, одна из которых может быть вашей makeSlug()
.
Для этого нет правильного способа, потому что вы должны использовать 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');