2015-07-13 29 views
1

对于我的应用程序,我写了一个将字符串转换为SEO证明slug/url的函数。我在不同的模块中使用这个函数,但现在我在控制器或数据库模型中反复定义函数。ZF2为整个应用程序设置全局函数

我想知道如何才能设置这个函数一次,并在整个应用程序中使用它(以正确的方式)。

谢谢你! :)

回答

0

Zend Plugins可以帮助你。

有关于如何创造出一个有自定义插件的一些好文章,here是一个开始:)

基本上你需要采取以下3个步骤:

  1. 创建插件类延长Zend\Mvc\Controller\Plugin\AbstractPlugin
  2. 包括你的插件安装到“invokables”控制器的插件列表
  3. 电话和你的控制器中使用你的插件像任何其他内建ZF2控制器
+0

如何在模型中使用控制器插件? –

+0

控制器插件只适用于控制器,因此命名:)我不赞成在数据模型中放置太多的逻辑,但如果必须的话,一种方法是将这些功能嵌入到抽象的一部分中。 – Ali

+0

所以我认为最好的方法是使用特质。 –

0

没有正确的方法来做到这一点,因为你应该使用内置在插件和DI系统中的ZF。

但是,您可以通过在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(...); 

好运。

相关问题