如何从模型或助手中获取基本路径Zend Framework 3 [英] How get basepath from model or helper en Zend Framework 3
问题描述
在使用Zend Framework 1三年后,我最近决定使用Zend Framework3.这个决定让我头疼,Zend 3并不是让事情变得更容易使事情变得更加困难.
I recently decided to use Zend Framework 3 after 3 years of using Zend Framework 1. This decision has given me headaches, Zend 3 instead of making things easier made things more difficult.
在Zend 1中,我为数据库中的所选模板自定义网址,如下所示:
In Zend 1, I customize the url for the selected template in the database as follows:
public function getUrl(string $file = '')
{
if($this->_helperBaseUrl === null) {
$this->_helperBaseUrl = new Zend_View_Helper_BaseUrl();
}
return $this->_helperBaseUrl->baseUrl($file);
}
public function getSkinUrl(string $file = '')
{
$themePath = 'themes/my-theme/'; //get from database
return $this->getUrl($themePath . ltrim($file, '/\\'));
}
然后在应用程序的任何部分(模型,助手,插件和视图)中,我都可以像下面这样访问此功能:
Then in any part of the application (models, helpers, plugins and views) I can access this function like this:
//view/scripts/index/index.phtml
$url_logo = My::app()->getSkinUrl('logo.jpg');
//this return http://example.com/themes/my-theme/logo.jpg
在Zend 3中,对我来说非常困难.有人知道在Zend 3中有任何方法吗?或如何从Zend 3中的模型获取baseUrl?
In Zend 3 it has been very difficult for me. Does anyone know of any way to do it in Zend 3? Or How to get the baseUrl from a model in Zend 3?
推荐答案
在Zend Framework 2/3中,您几乎可以将任何类注入另一个类.例如,如果您需要basePath
插件(在视图上下文中可用),则可以将此插件注入到模型/服务或控制器类中.这是推荐的方法:
In Zend Framework 2/3 you can inject almost any class into another. For example if you need basePath
plugin (which is available in view context) you can inject this plugin into your model/service or controller class. This is the recommended way:
这是您需要此插件或任何其他服务的类
This is class where you need this plugin or any other service
use Zend\View\Helper\BasePath;
class MyService
{
/**
* @var BasePath
*/
protected $plugin;
/**
* MyService constructor.
*
* @param BasePath $basePath
*/
public function __construct(BasePath $basePath)
{
$this->plugin = $basePath;
}
/**
* @return BasePath
*/
public function getPlugin()
{
return $this->plugin;
}
/**
* @param BasePath $plugin
*/
public function setPlugin($plugin)
{
$this->plugin = $plugin;
}
}
现在,您需要在工厂中将一个依赖项注入另一个依赖项
Now, you need to factory to inject one dependency into another
use Interop\Container\ContainerInterface;
use Zend\ServiceManager\FactoryInterface;
use Zend\ServiceManager\ServiceLocatorInterface;
use MyNamespace\Service\MyService;
class MyServiceFactory implements FactoryInterface
{
/**
*
* @param ContainerInterface $container
* @param string $requestedName
* @param null|array $options
* @return MyService
*/
public function __invoke(ContainerInterface $container, $requestedName, array $options = null)
{
$class = $requestedName ? $requestedName : MyService::class;
$plugin = $container->get('ViewHelperManager')->get('BasePath'); // inject this class
$myService = new $class($plugin); // into this class
return $myService;
}
/**
* Provided for backwards compatibility; proxies to __invoke().
*
* @param ContainerInterface|ServiceLocatorInterface $container
* @return MyService
*/
public function createService(ServiceLocatorInterface $container)
{
return $this($container, MyService::class);
}
}
好,现在MyService
具有basePath
插件,但是要在控制器中使用它,您必须将服务注入到控制器中.所以...
Ok, now MyService
has basePath
plugin, but to use it in controller you have to inject your service into controller. So...
IndexController
IndexController
use MyNamespace\Service\MyService;
use Zend\Mvc\Controller\AbstractActionController;
class IndexController extends AbstractActionController
{
/**
* @var MyService
*/
protected $service;
/**
* IndexController constructor.
*
* @param MyService $service
*/
public function __construct(MyService $service)
{
$this->service = $service;
}
public function indexAction()
{
$plugin = $this->service->getPlugin(); // Zend\View\Helper\BasePath object
//...
}
}
...以及我们控制器的工厂...
... and factory for our controller...
use Interop\Container\ContainerInterface;
use Zend\ServiceManager\FactoryInterface;
use Zend\ServiceManager\ServiceLocatorInterface;
use MyNamespace\Controller\IndexController;
class IndexControllerFactory implements FactoryInterface
{
/**
*
* @param ContainerInterface $container
* @param string $requestedName
* @param null|array $options
* @return IndexController
*/
public function __invoke(ContainerInterface $container, $requestedName, array $options = null)
{
$class = $requestedName ? $requestedName : IndexController::class;
$myService = $container->getServiceLocator()->get('MyNamespace\Service\MyService');
$controller = new $class($myService);
return $controller;
}
/**
* Provided for backwards compatibility; proxies to __invoke().
*
* @param ContainerInterface|ServiceLocatorInterface $container
* @return IndexController
*/
public function createService(ServiceLocatorInterface $container)
{
return $this($container, IndexController::class);
}
}
快要完成了.最后一步是在module.config.php
文件
It's almost done. Last step is to set configuration in module.config.php
file
use MyNamespace\Controller;
use MyNamespace\Factory;
return [
//...
'service_manager' => [
'factories' => [
Service\MyService::class => Factory\Service\MyServiceFactory::class
]
],
'controllers' => [
'factories' => [
Controller\IndexController::class => Factory\Controller\IndexControllerFactory::class
],
],
]
容易,不是吗?
如果您需要控制器中的插件,而不是模型/服务类中的插件,则可以跳过此教程"的MyService
部分并将插件直接注入控制器类中
Easy, isn't it?
If you need plugin in controller, but not in your model/service class, you can skip MyService
part of this "tutorial" and inject plugin directly into controller class
这篇关于如何从模型或助手中获取基本路径Zend Framework 3的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!