在阅读了很多帖子和Stack Overflow资源后,我仍然遇到一个关于"在哪里放置业务逻辑?"的着名问题.阅读StackOverflow问题和博客文章,我相信我已经很好地理解了代码分离的问题.
假设我有一个Web表单,您可以在其中添加将添加到数据库的用户.此示例涉及以下概念:
如果我没有错过任何东西,你必须创建一个包含一些属性,getter,setter等的实体,以使其持久存在于db中.如果您想获取或编写该实体,您将使用entityManager
和,用于"非规范"查询entityRepository
(这是您可以适合"查询语言"查询的地方).
现在,您必须为所有业务逻辑定义服务(即具有"惰性"实例的PHP类); 这是放置"重"代码的地方.将服务记录到应用程序后,几乎可以在任何地方使用它,并且涉及代码重用等.
当您渲染并发布表单时,您将它与您的实体绑定(当然还有约束)并使用上面定义的所有概念将它们放在一起.
所以,"old-me"会以这种方式编写控制器的动作:
public function indexAction(Request $request)
{
$modified = False;
if($request->getMethod() == 'POST'){ // submit, so have to modify data
$em = $this->getDoctrine()->getEntityManager();
$parameters = $request->request->get('User'); //form retriving
$id = $parameters['id'];
$user = $em->getRepository('SestanteUserBundle:User')->find($id);
$form = $this->createForm(new UserType(), $user);
$form->bindRequest($request);
$em->flush();
$modified = True;
}
$users = $this->getDoctrine()->getEntityManager()->getRepository('SestanteUserBundle:User')->findAll();
return $this->render('SestanteUserBundle:Default:index.html.twig',array('users'=>$users));
}
Run Code Online (Sandbox Code Playgroud)
"New-me"以这种方式重构了代码:
public function indexAction(Request $request)
{
$um = $this->get('user_manager');
$modified …
Run Code Online (Sandbox Code Playgroud) 我很难理解为什么我们得到这段代码的输出:
<?php
class Bar
{
public function test() {
$this->testPrivate();
$this->testPublic();
}
public function testPublic() {
echo "Bar::testPublic\n";
}
private function testPrivate() {
echo "Bar::testPrivate\n";
}
}
class Foo extends Bar
{
public function testPublic() {
echo "Foo::testPublic\n";
}
private function testPrivate() {
echo "Foo::testPrivate\n";
}
}
$myFoo = new foo();
$myFoo->test();
?>
Run Code Online (Sandbox Code Playgroud)
所以Foo扩展了Bar.$ myfoo是Foo类的一个对象.Foo没有一个叫做test()的方法,所以它从它的父Bar扩展它.但是为什么test()的结果是
Bar::testPrivate
Foo::testPublic
Run Code Online (Sandbox Code Playgroud)
你能解释一下为什么第一个不是Foo :: testPrivate,当这个父方法在孩子中被覆盖时?
非常感谢你提前!
最近我接受了一家软件公司的采访,在技术能力回合中询问了以下问题:
以这样的方式声明我,条件总是为真:
while(i != i) {
}
Run Code Online (Sandbox Code Playgroud)
在Java中技术上是否可以分配这种东西?
我是laravel的新手,
我在我的控制器的__construct中有代码
if(Auth::check())
{
return View::make('view_page');
}
return Redirect::route('login')->withInput()->with('errmessage', 'Please Login to access restricted area.');
Run Code Online (Sandbox Code Playgroud)
它的工作正常,但我想要的是.将这些编码放在每个控制器中真的很烦人,所以我希望将这个验证Auth和重定向到一个地方的登录页面,可能在router.php
或filters.php
.
我已经阅读了论坛以及中的一些帖子stackoverflow
,并添加了filters.php
类似下面的代码,但这也无法正常工作.
Route::filter('auth', function() {
if (Auth::guest())
return Redirect::guest('login');
});
Run Code Online (Sandbox Code Playgroud)
请帮我解决这个问题.
有人可以告诉我如何使用依赖注入将验证器注入常规类.
在我的控制器中我有:
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Form;
class FormController extends Controller {
public function indexAction()
{
$form = new Form();
$email = $request->request->get('email');
$valid = $form->isValid($email);
}
}
Run Code Online (Sandbox Code Playgroud)
我想使用这个自定义类 - 但我需要它可以访问验证器.
class Form {
public function isValid($value)
{
// This is where I fail
$validator = $this->get('validator');
... etc
}
}
Run Code Online (Sandbox Code Playgroud) 我有这种情况:
等等.
在我的代码中,我需要为tmp原因制作一个对象(比如A)的"副本"(不,我不能使用不同的结构,我需要有一个对象的副本).
如果我使用clone
,显然,我克隆了我的对象但是与他有关的对象,没有被克隆.
我完全知道我可以覆盖魔法__clone()
来分配 - 从A对象的角度来看 - B,C,D作为对象本身的克隆,但我有很多对象(其中很多都包含在ArrayCollection
Doctrine中)目的)我宁愿避免覆盖每个对象的克隆功能.
或者,我认为我可以通过这种方式从教条中重新获取一个对象来创建一个新对象:
$aCopy = $this->entity_manager
->getRepository('MyBundle:A')
->find($a->getId());
Run Code Online (Sandbox Code Playgroud)
在哪里$a
是一个实例class A
在执行此操作之后 - 当然这是"错误的"因为我怀疑doctrine会将该对象标记为"alredy fetched"并返回其指针()* - 我只是打印具有spl_object_hash()
功能的两个对象的ID ,当然,它们引用相同的对象ID,因此对同一个对象.
我不能使用doctrine detach()
函数,因为我需要在此操作后使原始对象可用
我该如何解决这种情况?正如你所看到的,我尝试了两种不同的方式,但没有一种方式让我感到满意.
我也标记了php,因为如果有人能指出我不同的解决方案,基于php-pure,我也会考虑到它
(*)
在这种情况下,文章可以从实体管理器访问两次,但在两者之间进行修改.Doctrine 2实现了这一点,并且只会让您访问ID为1234的文章的一个实例,无论您多久从EntityManager中检索它,甚至无论您使用何种查询方法(find,Repository Finder或DQL).这称为"身份映射"模式,这意味着Doctrine会保留每个实体的映射以及每个PHP请求检索到的ID,并不断返回相同的实例.
这证实了我之前说过的话
好的,你可以获得当前的路线名称,app.request.attributes.get('_route')
但是不可能从网址获取?
有点像app.request.attributes.get('/about')
?
我几乎到处搜索,但我找不到任何东西.
是否有一个命令或程序来更改表的名称(所以在doctrine内部注释)而不丢失数据?
基本上,会产生类似的东西
RENAME TABLE old_table TO new_table;
Run Code Online (Sandbox Code Playgroud)
要么
ALTER TABLE old_table RENAME new_table;
Run Code Online (Sandbox Code Playgroud)
MySQL命令取自这里
我应该手动编写迁移文件doctrine:migrations:generate
吗?
我正在尝试迁移到symfony 3.3并使用新功能autowire
/ autoconfigure
服务:
所以在services.yml我有:
services:
_defaults:
autowire: true
autoconfigure: true
public: false
# makes classes in src/AppBundle available to be used as services
AppBundle\:
resource: '../../src/AppBundle/*'
# you can exclude directories or files
# but if a service is unused, it's removed anyway
exclude: '../../src/AppBundle/{Entity,Controller,DQL,Form/DataTransformer,Repository}'
Run Code Online (Sandbox Code Playgroud)
我宣布我的枝条扩展为:
AppBundle\Twig\ImageExtension:
arguments:
$env: "%kernel.environment%"
Run Code Online (Sandbox Code Playgroud)
和此服务的构造函数:
public function __construct(TokenStorage $token, UserRepository $userRepository, RedisCacheService $cache, string $env)
{
$this->env = $env;
$this->user = $token->getToken() ? $token->getToken()->getUser() : false;
$this->userRepository = $userRepository;
$this->cache = …
Run Code Online (Sandbox Code Playgroud) array_values()
不适用于ArrayAccess对象。也不array_keys()
为什么?
如果我可以访问,$object['key']
我应该能够执行所有类型的数组操作
symfony ×6
php ×4
doctrine-orm ×2
arrayaccess ×1
autowired ×1
inheritance ×1
java ×1
laravel ×1
laravel-4 ×1
symfony-2.1 ×1
symfony-3.3 ×1
variables ×1
while-loop ×1