對於我的應用程序,我寫了一個將字符串轉換爲SEO證明slug/url的函數。我在不同的模塊中使用這個函數,但現在我在控制器或數據庫模型中反覆定義函數。ZF2爲整個應用程序設置全局函數
我想知道如何才能設置這個函數一次,並在整個應用程序中使用它(以正確的方式)。
謝謝你! :)
對於我的應用程序,我寫了一個將字符串轉換爲SEO證明slug/url的函數。我在不同的模塊中使用這個函數,但現在我在控制器或數據庫模型中反覆定義函數。ZF2爲整個應用程序設置全局函數
我想知道如何才能設置這個函數一次,並在整個應用程序中使用它(以正確的方式)。
謝謝你! :)
Zend Plugins可以幫助你。
有關於如何創造出一個有自定義插件的一些好文章,here是一個開始:)
基本上你需要採取以下3個步驟:
Zend\Mvc\Controller\Plugin\AbstractPlugin
沒有正確的方法來做到這一點,因爲你應該使用內置在插件和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');
我看到這麼多有效的方法。
你可以定義類類似Tools
並在這個類定義功能的靜態方法。將來你可以在這個類中定義更多類似的功能。並打電話給任何你想要的地方Tools::makeSlug();
另一種方法是定義特徵與此功能,並擴展你想使用功能從這個特質的每個類,其中之一可能是你的makeSlug()
函數。
是的,使用靜態方法是另一種可能的方法。這對於轉換字符串等小任務來說可能是一個很好的選擇(如你所需)。但對於更復雜的任務,我會推薦使用插件:) – Ali
創建服務,但不使用閉包。閉包不會緩存。
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(...);
好運。
如何在模型中使用控制器插件? –
控制器插件只適用於控制器,因此命名:)我不贊成在數據模型中放置太多的邏輯,但如果必須的話,一種方法是將這些功能嵌入到抽象的一部分中。 – Ali
所以我認爲最好的方法是使用特質。 –