我已经使用 Magento 和 PHP CodeIgniter MVC 大约 4 个月了。我在理解在哪里设置 CodeIgniter 和 Magento 的验证逻辑时遇到了一个特殊的问题,只有当我考虑遵循 MVC 架构的真实本质并以非常正确的语义方式时。
首先,我将从 Magento 开始:-
假设我在 Magento 中有一个“Assignment”模块,它与玩家和锦标赛有关。我有 3 个操作方法,在这个“Assignment”模块的 Controller 中,我需要在其中检查和验证以下内容:-
“Assignment”模块的 Block 类以及 3 个操作方法中也需要此验证。
所以我的问题是我应该在这个模块的 Controller 类或 Model 类中编写上述两点的验证,因为我需要在 Block 类和 Controller 类中都使用验证?
此外,在这种情况下,实际的 MVC 架构有何建议?
如果可能,请提供代码片段,突出显示您的实现逻辑。
关于 CodeIgniter 或任何其他 PHP MVC 框架:-
因为任何使用 session 的验证都是特定于页面的,并且因为在 CodeIgniter 中没有 block 的概念,所以通常 session 验证和 session 变量的设置只在 Controller 类中完成。
所以我在这方面的问题是,这是一种正确的方法吗?在什么情况下我应该将 session 和 session 验证的 setter 放在模型类中?
再一次,在这种情况下,实际的 MVC 架构意味着什么?
同样,如果可能,请提供代码片段,突出显示您的实现逻辑。
对此我真的很困惑,而且我有点被困在这里。请在这里帮助我。非常感谢任何解决方案/帮助。非常感谢。
编辑:-
如果可能,请提供一些 Magento 代码,说明如何创建和编写正确的验证以及抛出异常,以及在模型方法中定义的实际异常消息?
最佳答案
模型层应该能够保持其自身的一致性,因此无论其他决定如何,您都应该在模型层中包含您的验证。为了帮助用户(并提供更有帮助的验证消息),您可能还希望在 Controller 级别进行一些验证。
这种方法的优点是,假设您维护模型层,流氓 Controller 就不可能设置错误数据。这涉及到您的第二个问题,Magento 的答案是使用一个对象来管理部分 session 中的数据,并在进入 session 的过程中验证该数据。
顺便说一句,要处理 block / View 中的验证,请考虑使用这样的验证。它有其自身的缺陷,但通常可以最大限度地减少您必须编写的验证代码的数量:
// make sure that the below returns the relevant assignment model class
$assignment = $this->getAssignment(); // or get it via a session, or helper, or what have you.
$player = getChosenPlayer();
try {
$assignment->setPlayer($player); //throws exception when invalid
... do more ...
$assignmnent->save();
} catch(SomeException $e) {
addValidationError($e->getMessage());
renderPageAgain();
}
关于php - 关于 PHP 和 Magento 验证的一般 MVC 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4428683/
给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru
我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..
我想为Heroku构建一个Rails3应用程序。他们使用Postgres作为他们的数据库,所以我通过MacPorts安装了postgres9.0。现在我需要一个postgresgem并且共识是出于性能原因你想要pggem。但是我对我得到的错误感到非常困惑当我尝试在rvm下通过geminstall安装pg时。我已经非常明确地指定了所有postgres目录的位置可以找到但仍然无法完成安装:$envARCHFLAGS='-archx86_64'geminstallpg--\--with-pg-config=/opt/local/var/db/postgresql90/defaultdb/po
尝试通过RVM将RubyGems升级到版本1.8.10并出现此错误:$rvmrubygemslatestRemovingoldRubygemsfiles...Installingrubygems-1.8.10forruby-1.9.2-p180...ERROR:Errorrunning'GEM_PATH="/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/ruby-1.9.2-p180@global:/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/rub
我希望我的UserPrice模型的属性在它们为空或不验证数值时默认为0。这些属性是tax_rate、shipping_cost和price。classCreateUserPrices8,:scale=>2t.decimal:tax_rate,:precision=>8,:scale=>2t.decimal:shipping_cost,:precision=>8,:scale=>2endendend起初,我将所有3列的:default=>0放在表格中,但我不想要这样,因为它已经填充了字段,我想使用占位符。这是我的UserPrice模型:classUserPrice回答before_val
我有一个表单,其中有很多字段取自数组(而不是模型或对象)。我如何验证这些字段的存在?solve_problem_pathdo|f|%>... 最佳答案 创建一个简单的类来包装请求参数并使用ActiveModel::Validations。#definedsomewhere,atthesimplest:require'ostruct'classSolvetrue#youcouldevencheckthesolutionwithavalidatorvalidatedoerrors.add(:base,"WRONG!!!")unlesss
我的最终目标是安装当前版本的RubyonRails。我在OSXMountainLion上运行。到目前为止,这是我的过程:已安装的RVM$\curl-Lhttps://get.rvm.io|bash-sstable检查已知(我假设已批准)安装$rvmlistknown我看到当前的稳定版本可用[ruby-]2.0.0[-p247]输入命令安装$rvminstall2.0.0-p247注意:我也试过这些安装命令$rvminstallruby-2.0.0-p247$rvminstallruby=2.0.0-p247我很快就无处可去了。结果:$rvminstall2.0.0-p247Search
由于fast-stemmer的问题,我很难安装我想要的任何rubygem。我把我得到的错误放在下面。Buildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingfast-stemmer:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcreatingMakefilemake"DESTDIR="cleanmake"DESTDIR=
我有一些非常大的模型,我必须将它们迁移到最新版本的Rails。这些模型有相当多的验证(User有大约50个验证)。是否可以将所有这些验证移动到另一个文件中?说app/models/validations/user_validations.rb。如果可以,有人可以提供示例吗? 最佳答案 您可以为此使用关注点:#app/models/validations/user_validations.rbrequire'active_support/concern'moduleUserValidationsextendActiveSupport:
当我的预订模型通过rake任务在状态机上转换时,我试图找出如何跳过对ActiveRecord对象的特定实例的验证。我想在reservation.close时跳过所有验证!叫做。希望调用reservation.close!(:validate=>false)之类的东西。仅供引用,我们正在使用https://github.com/pluginaweek/state_machine用于状态机。这是我的预订模型的示例。classReservation["requested","negotiating","approved"])}state_machine:initial=>'requested