对于我的应用程序,我写了一个将字符串转换为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
所以我认为最好的方法是使用特质。 –