我正在用PHP编写一个系统,它必须写入三个持久层:
原因是遗留系统无法更改.
我想使用DataMapper模式,我正在尝试建立实现我想要的最佳方式.我有一个如下界面:
<?php
$service = $factory->getService()->create($entity);
?>
Run Code Online (Sandbox Code Playgroud)
为简洁起见,下面是一些人为的和减少的代码:
<?php
class Post extends AbstractService
{
protected $_mapper;
public function create(Entity $post)
{
return $this->_mapper->create($post);
}
}
class AbstractMapper
{
protected $_persistence;
public function create(Entity $entity)
{
$data = $this->_prepareForPersistence($entity);
return $this->_persistence->create($data);
}
}
?>
Run Code Online (Sandbox Code Playgroud)
我的问题是因为有三个持久层,因此每个都可能需要三个映射器.我想要一个干净的设计模式灵感的界面,使这项工作.
我认为它有三个选项:
这些解决方案中的每个解决方案都让我觉得错误,并且会感谢任何可能适合这种情况的反馈/认可的设计模式.
我正在为我的控制器编写一些单元测试(PHPUnit 3.6),并希望验证是否正在触发正确的操作等.这很容易.然而,一些控制器还通过诸如将记录插入数据库之类的不期望的模型执行某些动作.
我知道我需要嘲笑这些但不清楚如何做到这一点.采用以下示例控制器(为清晰起见,减少):
public function addAction()
{
$data = $this->getRequest()->getPost();
$model = $this->getModelFactory()->getCompetitionModel()->insert($data); }
Run Code Online (Sandbox Code Playgroud)
}
请注意,我想要做的就是验证是否已调度正确的控制器和操作,但不希望实际插入记录.同样我有删除等的等价物.我不希望记录实际删除.
实际上需要在这里嘲笑什么?竞争模型,数据库适配器,或模型工厂,还是全部三个?我该如何注射这些?我试过了(为了简洁而再次减少):
public function testAddActionIsDispatched()
{
$this->request->setMethod('POST');
$this->request->setPost(array($data…));
$modelMock = $this->getMockBuilder('Competition_Adder')
->disableOriginalConstructor()
->getMock();
$factoryMock = $this->getMockBuilder('ModelFactory')
->disableOriginalConstructor()
->getMock();
// Configure the stub.
$factoryMock->expects($this->any())
->method('getCompetitionModel')
->will($this->returnValue($modelMock));
$modelMock->expects($this->once())
->method('insert')
->will($this->returnValue(true));
$this->dispatch('/mymodule/add/');
$this->assertController('test');
$this->assertAction('add');
$this->assertResponseCode(200);
}
Run Code Online (Sandbox Code Playgroud)
}
据我所知,PHPUnit奇怪地用mocks替换了对原始文件的任何引用,这样当调用dispatch时,就会使用伪模拟代替它们.这不会发生.有人可以澄清一下如何实现这一目标吗?
我正在创建一个RESTFUL Web服务,它从一个使用restangular服务的angularjs应用程序调用.REST服务要求每个请求都发送一个身份验证令牌.如何使用restangular通过每个请求发送此消息?
查看文档,我可以看到有一个setRequestInterceptor方法,我可以在配置中设置,看起来我可以使用:
RestangularProvider.setFullRequestInterceptor(function(element, operation, route, url, headers, params) {
return {
element: element,
params: params,
headers: _.extend(headers, {Authorization: 'Basic ' + base64.encode('sometoken')})
};
});
Run Code Online (Sandbox Code Playgroud)
我无法通过将它放入我的配置来实现甚至调用它.我不知道需要从哪里注入RestangularProvider提供程序才能让htis工作?我还想创建一个外部服务,它读取已经生成的令牌,我不知道在哪里放这个.有没有这个在任何地方工作的例子?我只能找到使用$ ngresource的场景.
任何帮助赞赏.
我正在与具有不同权限的使用者一起设计REST API。我知道资源的表示形式不应根据用户而改变。因此,我试图确定哪种方法是最好的:
GET-列出所有文档的集合-仅限管理员。:
/ api / documents
GET-所有文档的列表集合-有权访问文档123的任何用户
/ api / documents / 123
因此,对于普通用户,端点应为
列出用户12的所有文档
/ api / user / 12 / documents
假设用户12具有访问权限的文档123
/ api / documents / 123
或...端点应如下所示,并使用查询字符串过滤器:
/ api / documents?user = 12
/ api / documents / 123
php ×2
angularjs ×1
architecture ×1
datamapper ×1
endpoints ×1
mocking ×1
oop ×1
phpunit ×1
rest ×1
restangular ×1
uri ×1