2015-07-13 2 views
1

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

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

Спасибо! :)

ответ

0

Zend Plugins может помочь вам с этим.

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

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

  1. Создать класс плагина расширение Zend\Mvc\Controller\Plugin\AbstractPlugin
  2. Включите плагин в список плагинов контроллера-х invokables "
  3. вызов и использовать плагин в контроллере, как и любой другой встроенный контроллер ZF2
+0

Как насчет использования плагина контроллера в модели? –

+0

Плагины контроллера хороши только для контроллера, следовательно, именование :) Я не в пользу слишком много логики в моделях данных, но если вам нужно, один из способов будет встраивать такую ​​функциональность как часть вашей абстракции. – Ali

+0

Так что, на мой взгляд, лучший способ - использовать Черты. –

0

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

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


Предупреждение, не тестируется:

Кроме того, вы должны быть в состоянии добавить это как фабрика для 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'); 
0

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

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

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

+0

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

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(...); 

удачи.