我正在做一个项目,但我对将什么代码放在哪里感到困惑。 我将在这里举一个简单的例子来说明为什么我有些困惑。
想象一下 cakephp 应用程序中的几个网页,可以通过一种或另一种方式创建一个帐户 - 连同这个帐户,需要调用模型和库中的其他几个函数(例如压缩一些东西,为帐户创建一个证书, ...).
鉴于它需要在多个位置完成并且不完全属于模型(+是相当多的代码),最好的方法是使用我认为的组件。
这很好用,只要您在 Web 服务器后面,但如果我还想在 Shell 中使用所有这些功能怎么办? - 然后我不能使用组件,只能加载库。
这是我可以/想要共享的所有函数/php 代码的情况,让所有逻辑在两个 shell 中都可用,就像在 Controller 中一样。
问题来了:) => 所以我所有的组件都需要是库?,在这些库中加载模型/其他库等的架构是否正确?,那么组件的用途是什么?,还不如'rm -rf'它们并且只使用库?
到目前为止,我使用组件的方式是将所有可以/需要在 Controller 之间共享的流程逻辑放入其中。 当我不需要任何模型或只需要一组静态函数(例如处理图像)时,我使用过的库。 在使用 Shell 脚本时,我想要/需要访问这些组件中的逻辑时遇到了瓶颈。
知道我的理解哪里出了问题吗?
最佳答案
你自己已经给出了所有的答案!
是的,组件可以在 Controller 之间共享功能。只有 Controller 。 因此,如果您需要在模型或 shell 中使用该功能,那就错了。
您应该将我的 shell 和 Controller 都使用的代码放入模型层(如果它的模型/数据库相关)或库(静态/计算等)。 然后可以从两侧使用它们。
您可以在库中使用模型,反之亦然。请注意不要创建太多的依赖关系和循环关系。这些也很难测试/扩展/修改。
组件可用于包装那些 lib/model 方法,以便快速方便地访问 Controller ,还可以进行一些更自动化和特定于 Controller 的处理。 类似于仅包装 CakeSession 类的 SessionComponent,以在 Controller 中提供简单的 session 访问。
顺便说一下:您也可以使用任务在命令行环境中执行相同的便利包装。这些只不过是“shell 组件”。
关于php - Cakephp 组件 VS 库和 shell ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16949223/
在railstutorial中,作者为什么选择使用这个(代码list10.25):http://ruby.railstutorial.org/chapters/updating-showing-and-deleting-usersnamespace:dbdodesc"Filldatabasewithsampledata"task:populate=>:environmentdoRake::Task['db:reset'].invokeUser.create!(:name=>"ExampleUser",:email=>"example@railstutorial.org",:passwo
这可能是个愚蠢的问题。但是,我是一个新手......你怎么能在交互式rubyshell中有多行代码?好像你只能有一条长线。按回车键运行代码。无论如何我可以在不运行代码的情况下跳到下一行吗?再次抱歉,如果这是一个愚蠢的问题。谢谢。 最佳答案 这是一个例子:2.1.2:053>a=1=>12.1.2:054>b=2=>22.1.2:055>a+b=>32.1.2:056>ifa>b#Thecode‘if..."startsthedefinitionoftheconditionalstatement.2.1.2:057?>puts"f
我从Ubuntu服务器上的RVM转移到rbenv。当我使用RVM时,使用bundle没有问题。转移到rbenv后,我在Jenkins的执行shell中收到“找不到命令”错误。我内爆并删除了RVM,并从~/.bashrc'中删除了所有与RVM相关的行。使用后我仍然收到此错误:rvmimploderm~/.rvm-rfrm~/.rvmrcgeminstallbundlerecho'exportPATH="$HOME/.rbenv/bin:$PATH"'>>~/.bashrcecho'eval"$(rbenvinit-)"'>>~/.bashrc.~/.bashrcrbenvversions
我有一个问题。我想从另一个ruby脚本运行一个ruby脚本并捕获它的输出信息,同时让它也输出到屏幕。亚军#!/usr/bin/envrubyprint"Enteryourpassword:"password=gets.chompputs"Hereisyourpassword:#{password}"我运行的脚本文件:开始.rboutput=`runner`putsoutput.match(/Hereisyour(password:.*)/).captures[0].to_s正如您在此处看到的那样,存在问题。在start.rb的第一行,屏幕是空的。我在运行程序中看不到“输入您的密
在几个项目中,我希望有一个类似rakeserver的rake任务,它将通过任何需要的方式开始为该应用程序提供服务。这是一个示例:task:serverdo%x{bundleexecrackup-p1234}end这行得通,但是当我准备停止它时,按Ctrl+c并没有正常关闭;它中断了Rake任务本身,它说rakeaborted!并给出堆栈跟踪。在某些情况下,我必须执行Ctrl+c两次。我可能可以用Signal.trap写一些东西来更优雅地中断它。有没有更简单的方法? 最佳答案 trap('SIGINT'){puts"Yourmessa
我有一个数组数组,想将元素附加到子数组。+=做我想做的,但我想了解为什么push不做。我期望的行为(并与+=一起工作):b=Array.new(3,[])b[0]+=["apple"]b[1]+=["orange"]b[2]+=["frog"]b=>[["苹果"],["橙子"],["Frog"]]通过推送,我将推送的元素附加到每个子数组(为什么?):a=Array.new(3,[])a[0].push("apple")a[1].push("orange")a[2].push("frog")a=>[[“苹果”、“橙子”、“Frog”]、[“苹果”、“橙子”、“Frog”]、[“苹果”、“
给定一个元素和一个数组,Ruby#index方法返回元素在数组中的位置。我使用二进制搜索实现了我自己的索引方法,期望我的方法会优于内置方法。令我惊讶的是,内置的在实验中的运行速度大约是我的三倍。有Rubyist知道原因吗? 最佳答案 内置#indexisnotabinarysearch,这只是一个简单的迭代搜索。但是,它是用C而不是Ruby实现的,因此自然可以快几个数量级。 关于Ruby#index方法VS二进制搜索,我们在StackOverflow上找到一个类似的问题:
随着ruby被引入为新的编程救世主,我想知道是否有人基于易用性、运行所需的资源、可用性和易定制性而有偏好。两者有更好的吗? 最佳答案 好吧,任何基于Rails的社交网络应用程序的比较都应该包括insoshi(http://portal.insoshi.com/)。话虽这么说,这三个都非常相似,区别在于实现细节。Lovd和Insoshi都是完整的Rails应用程序;它旨在供您将它们用作入门工具包,并使用您自己的自定义功能对其进行扩展。另一方面,CommunityEngine是一个Rails插件。这意味着您可以更轻松地向现有Rail
我们如何从ruby脚本返回值?#!/usr/bin/envrubya="test"a我们如何在Ubuntu终端或java或c中访问'a'的值? 最佳答案 在ruby/python脚本中打印你的变量,然后可以通过示例从shell脚本中读取它:#!/bin/bashruby_var=$(rubymyrubyscript.rb)python_var=$(pythonmypythonscript.py)echo"$ruby_var"echo"$python_var"注意你的ruby/python脚本只打印这个变量(有更多复杂的方
我在跑Fastlane(适用于iOS的持续构建工具)以执行用于解密文件的自定义shell脚本。这是命令。sh"./decrypt.shENV['ENCRYPTION_P12']"我想不出将环境变量传递给该脚本的方法。显然,如果我将密码硬编码到脚本中,它就可以正常工作。sh"./decrypt.shmypwd"有什么建议吗? 最佳答案 从直接Shell中扩展假设这里的sh是一个faSTLane命令,它以给定的参数作为脚本文本调用shell命令:#asafastlanedirectivesh'./decrypt.sh"$ENCRYPTI