2015-07-13 55 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(...); 

好運。

相關問題