我应该在模型中访问POST参数还是从控制器传递方法参数?

时间:2009-08-18 12:13:29

标签: php model-view-controller encapsulation

我必须处理大约20个POST参数,我不知道该怎么做。

我可以将每个定义为模型上方法的参数,并在调用方法时从控制器传递它们。由于参数的数量,这将导致相当多的工作并使函数调用的可读性降低。

或者我可以在模型上调用方法,直接访问参数。

将参数作为参数传递将使我能够更好地控制函数访问哪些参数,并且文档将更加不言自明。但是如果稍后添加了新参数,则必须将它们添加到方法调用的末尾,以免中断每个现有调用。我想如果它发生几次会变得很混乱,因为参数不能在逻辑上分组。

如果我访问模型中的参数,则不需要将任何参数从控制器传递到模型,从而使方法调用更复杂。但我无法控制所访问的参数,因为它们可以轻松且无限制地添加或删除。这需要来自其他开发人员的更多纪律,我不喜欢依赖于此,因为迟早有人必须“只是(添加|更改|修复)这个真正的快速”。

我不知道该走哪条路。我倾向于在模型中完成所有操作,因为这样写起来更快,似乎更容易维护(没有参数混乱)并且在概念上更适合我对模型的看法。 另一方面,我不确定我对模型的看法是否正确,如果我依赖其他开发人员在每次更改后始终更新文档,它是否会以混乱结束。

那么,我该怎么办?

5 个答案:

答案 0 :(得分:1)

那么,为什么你不能只接受一个(关联)数组作为该模型的方法中的参数,然后将整个$ _POST数组传递给它?至少在我看来,它不会破坏封装。

编辑:如果您不喜欢使用关联数组,您还可以使用所谓的“普通旧对象”(仅用于传输数据的对象,如结构中的结构) C)。例如,如果这涉及保存提交的注册表单:

class UserData
{
    protected $name;
    protected $username;
    protected $password;

    public function getName() { /* <...> */ }
    public function setName() { /* <...> */ }
    /* other accessors go here */
}

class UserController extends Controller
{
    public function register()
    {
        $userData = UserData::create()
            ->setName($_POST['name'])
            ->setUsername($_POST['username'])
            ->setPassword($_POST['password']);
        Users::add($userData);
    }
}

这将允许您在Users :: add中使用严格类型,并使文档处理更容易。

答案 1 :(得分:1)

我一直在努力解决同样的问题,我提出的解决方案是灵活的,保持我的代码可重用,并且容忍对前端的更改:我喜欢使用setter。当然,为每个值设置一个setter是一件痛苦的事情,因此以逻辑方式对数据进行分组会有所帮助:

$user = new User();
$user->setName($_POST['lastName'],$_POST['firstName']);
$user->setAddress($_POST['address1'],$_POST['address2'],$_POST['city'],$_POST['state'],$_POST['zip']);

你明白了。保存到对象变量后,您可以在所有对象的方法中使用这些值。

让你的模特依赖超级全球是如此不灵活。它也使单元测试成为一种痛苦。

答案 2 :(得分:0)

我刚才回答a similar question。 Imho你应该通过他们,例如已经提出作为关联数组(并在之前进行所有安全检查)。通过这种方式,您可以轻松地重复使用您的文章。

答案 3 :(得分:0)

控制器。因为请求数据和模型操作不是一回事。因此,所有其他可能的请求都需要将基于请求数据的逻辑放入模型中,这很糟糕

答案 4 :(得分:0)

这就是我的所作所为......

$('#calendar').fullCalendar({

      defaultView: 'month',
      events: [{
        title: 'Some quite long event description in a day cell',
        start: '2017-01-05',
        end: '2017-01-09',
        rendering: 'background',
        allDay: true
      }],
      eventAfterAllRender: function(view) {
        $.each($('#calendar').fullCalendar('clientEvents'), function() {
          var event = this;
          var $start = $('#calendar').find('td.fc-day[data-date="' + event.start.format('YYYY-MM-DD') + '"]');
          var $end = $('#calendar').find('td.fc-day[data-date="' + event.end.format('YYYY-MM-DD') + '"]');

          if (event.rendering === 'background') {
            for (var d = event.start; d <= event.end; d.add(1, 'day')) {
              $('#calendar').find('td.fc-day[data-date="' + d.format('YYYY-MM-DD') + '"]').append('<a href="test.html">' + event.title + '</a>');
            }
          }
        });
      }
    });

我主要编写API,通过//Object Oriented POST Replacement if ($_SERVER['REQUEST_METHOD'] == 'POST') { $_POST = json_decode(file_get_contents('php://input')); } 通过JSON传输信息。但是,无论Content-Type: application/json如何填充,这都会起作用(在我看来更好)。

无论你做什么,我建议将$_POST超级全局变成一个对象。在您的模型中,接受单个对象作为参数,并拉出属性或子属性。

从那里开始,只需将控制器方法设置为以面向对象$_POST超全局作为唯一参数调用模型方法。