BDu*_*elz 2 php refactoring kohana
该代码用于视图辩论页面.该代码应该确定是否向查看用户显示添加回复表单.
如果用户已登录,并且用户不是辩论的创建者,则检查用户是否已经回复辩论.
如果用户尚未回复辩论,则显示表单...否则,检查用户是否要通过查找回复ID的URL来编辑他们已存在的回复
如果这些测试中的任何一个没有通过,那么我将原因保存为int并将其传递给视图中的switch语句.
逻辑似乎很容易,但我的代码似乎有点草率.
这是代码..(使用Kohana V2.3.4)
public function view($id = 0)
{
$debate = ORM::factory('debate')->with('user')->with('category')->find($id);
if ($debate->loaded == FALSE)
{
url::redirect();
}
// series of tests to show an add reply form
if ($this->logged_in)
{
// is the viewer the creator?
if ($this->user->id != $debate->user->id)
{
// has the user already replied?
if (ORM::factory('reply')
->where(array('debate_id' => $id, 'user_id' => $this->user->id))
->count_all() == 0)
{
$form = $errors = array
(
'body' => '',
'choice_id' => '',
'add' => ''
);
if ($post = $this->input->post())
{
$reply = ORM::factory('reply');
// validate and insert the reply
if ($reply->add($post, TRUE))
{
url::redirect(url::current());
}
$form = arr::overwrite($form, $post->as_array());
$errors = arr::overwrite($errors, $post->errors('reply_errors'));
}
}
// editing a reply?
else if (($rid = (int) $this->input->get('edit'))
AND ($reply = ORM::factory('reply')
->where(array('debate_id' => $id, 'user_id' => $this->user->id))
->find($rid)))
{
$form = $errors = array
(
'body' => '',
'choice_id' => '',
'add' => ''
);
// autocomplete the form
$form = arr::overwrite($form, $reply->as_array());
if ($post = $this->input->post())
{
// validate and insert the reply
if ($reply->edit($post, TRUE))
{
url::redirect(url::current());
}
$form = arr::overwrite($form, $post->as_array());
$errors = arr::overwrite($errors, $post->errors('reply_errors'));
}
}
else
{
// user already replied
$reason = 3;
}
}
else
{
// user started the debate
$reason = 2;
}
}
else
{
// user is not logged in.
$reason = 1;
}
$limits = Kohana::config('app/debate.limits');
$page = (int) $this->input->get('page', 1);
$offset = ($page > 0) ? ($page - 1) * $limits['replies'] : 0;
$replies = ORM::factory('reply')->with('user')->with('choice')->where('replies.debate_id', $id);
$this->template->title = $debate->topic;
$this->template->debate = $debate;
$this->template->body = View::factory('debate/view')
->set('debate', $debate)
->set('replies', $replies->find_all($limits['replies'], $offset))
->set('pagination', Pagination::factory(array
(
'style' => 'digg',
'items_per_page' => $limits['replies'],
'query_string' => 'page',
'auto_hide' => TRUE,
'total_items' => $total = $replies->count_last_query()
))
)
->set('total', $total);
// are we showing the add reply form?
if (isset($form, $errors))
{
$this->template->body->add_reply_form = View::factory('reply/add_reply_form')
->set('debate', $debate)
->set('form', $form)
->set('errors', $errors);
}
else
{
$this->template->body->reason = $reason;
}
}
Run Code Online (Sandbox Code Playgroud)
继承人的观点,这里的一些逻辑确定了向用户显示的消息.
<!-- Add Reply Form -->
<?php if (isset($add_reply_form)): ?>
<?php echo $add_reply_form; ?>
<?php else: ?>
<?php
switch ($reason)
{
case 1 :
// not logged in, show a message
$message = 'Add your ' . html::anchor('login?url=' . url::current(TRUE), '<b>vote</b>') . ' to this discussion';
break;
case 2 :
// started the debate. dont show a message for that.
$message = NULL;
break;
case 3:
// already replied, show a message
$message = 'You have already replied to this debate';
break;
default:
// unknown reason. dont show a message
$message = NULL;
break;
}
?>
<?php echo app::show_message($message, 'h2'); ?>
<?php endif; ?>
<!-- End Add Reply Form -->
Run Code Online (Sandbox Code Playgroud)
我应该将添加回复逻辑重构为另一个函数或其他东西......一切正常,它看起来真的很草率.
谢谢
编辑:我考虑了所有答案.由于我现在没有添加任何新内容并且有时间杀死,我选择重构代码.经过一番思考,一个更好的解决方案突然出现在我面前.整个过程花了我大约30分钟,我认为这是值得的.感谢大家的回答
不.如果你还有一行代码要写在这个项目的其他地方,那就把时间花在那个上面.
通常情况下,会有很多不同的方法来解决代码解决的相同问题.但是如果你已经解决了问题,那么请记下你在这里学到的东西并继续前进.如果这个代码在开发之后确实是一个薄弱的环节,那么很好; 你有证据和具体的验证,应该重新考虑.在此之前,你正在浪费时间,通过重新发明轮子的重新发明来推动项目的进展.