在CakePHP3中,如何在Shell中使用UrlHelper生成URL?
使用电子邮件,我只是在CakePHP3中,如何在Shell中使用UrlHelper生成URL?,shell,cakephp,Shell,Cakephp,使用电子邮件,我只是 use Cake\Network\Email\Email; $email = new Email(); 但是用UrlHelper尝试这一点是不成功的 和一个女人一样不成功 $url_helper = new UrlHelper; 因为它给了我 Argument 1 passed to Cake\View\Helper::__construct() must be an instance of Cake\View\View. 但我想,我在壳牌公司是看不到的 谢谢。在sh
use Cake\Network\Email\Email;
$email = new Email();
但是用UrlHelper尝试这一点是不成功的
和一个女人一样不成功
$url_helper = new UrlHelper;
因为它给了我
Argument 1 passed to Cake\View\Helper::__construct() must be an instance of Cake\View\View.
但我想,我在壳牌公司是看不到的
谢谢。在shell中模拟助手的方法可能与模拟单元测试助手的方法类似。尝试:
<?php
use Cake\View\View;
use Cake\View\Helper\UrlHelper;
class FooShell extends Shell
{
public $url_helper = null;
public function bar()
{
$view = new View();
$this->url_helper = new UrlHelper($view);
// URL Helper functionality created here
}
}
在shell中模拟助手的方法可能与模拟单元测试的助手的方法类似。尝试:
<?php
use Cake\View\View;
use Cake\View\Helper\UrlHelper;
class FooShell extends Shell
{
public $url_helper = null;
public function bar()
{
$view = new View();
$this->url_helper = new UrlHelper($view);
// URL Helper functionality created here
}
}
在shell中使用助手不是正确的方法。助手也只是包装。因此,请直接使用路由器:
use Cake\Routing\Router;
$url = Router::url([/*...*/], true);
还要注意,您可以根据需要通过调用Router::fullBaseUrl()
来更改基本URL,它是一个getter和setter。看
这更好,因为:
- 它引入了更少的依赖性
- 不那么紧密的耦合(好吧,你得到的是一个单态…)
- 不违反MVC
- 更小的足迹
在shell中使用助手不是正确的方法。助手也只是包装。因此,请直接使用路由器:
use Cake\Routing\Router;
$url = Router::url([/*...*/], true);
还要注意,您可以根据需要通过调用Router::fullBaseUrl()
来更改基本URL,它是一个getter和setter。看
这更好,因为:
- 它引入了更少的依赖性
- 不那么紧密的耦合(好吧,你得到的是一个单态…)
- 不违反MVC
- 更小的足迹
我不知道Url帮助器封装了路由器,因此我同意您关于依赖关系和耦合的看法,但是我礼貌地不同意打破MVC惯例,因为Shell脚本的范围并不特别适合于范例中的三个字母中的任何一个。shell脚本可以作为业务逻辑进行论证,但大多数shell仍然作为表级逻辑的抽象存在,它接受参数的方式与控制器接受请求对象输入的方式大致相同。我很想听听你的想法,Burzum。一个外壳可以看作是一种控制器,但实际上没有“视图”层。我完全不同意“但是大多数shell仍然作为表级逻辑的抽象存在”,如果它是“表”逻辑,那么它应该在表(或其他模型层对象)中实现并作为表级逻辑使用。一个视图(也有shell帮助程序)需要一个视图对象才能工作,这应该是一个明确的指标,表明它不应该(从技术上讲它可以)在shell中使用。一个shell方法应该是skinny的,其他一些“M”层类型的类应该可以完成这项工作。同意-我想我误解了我自己。我所说的表逻辑的Shell实现是表对象本身中定义的逻辑的实现,而Shell充当一个瘦控制器,从命令行获取参数,然后将这些参数委托给表对象本身来完成繁重的工作。感谢您的投入,祝您新年快乐!我不知道Url助手封装了路由器,所以我同意您关于依赖关系和耦合的看法,但是我礼貌地不同意打破MVC惯例,因为Shell脚本的范围并不特别适合范例中的三个字母中的任何一个。shell脚本可以作为业务逻辑进行论证,但大多数shell仍然作为表级逻辑的抽象存在,它接受参数的方式与控制器接受请求对象输入的方式大致相同。我很想听听你的想法,Burzum。一个外壳可以看作是一种控制器,但实际上没有“视图”层。我完全不同意“但是大多数shell仍然作为表级逻辑的抽象存在”,如果它是“表”逻辑,那么它应该在表(或其他模型层对象)中实现并作为表级逻辑使用。一个视图(也有shell帮助程序)需要一个视图对象才能工作,这应该是一个明确的指标,表明它不应该(从技术上讲它可以)在shell中使用。一个shell方法应该是skinny的,其他一些“M”层类型的类应该可以完成这项工作。同意-我想我误解了我自己。我所说的表逻辑的Shell实现是表对象本身中定义的逻辑的实现,而Shell充当一个瘦控制器,从命令行获取参数,然后将这些参数委托给表对象本身来完成繁重的工作。感谢您的投入,祝您新年快乐!