小编Jon*_*hon的帖子

Laravel进行复杂验证的方法

关于验证属于Laravel应用程序的位置存在很多争议.特别是当事情变得复杂时.就个人而言,我认为模型的工作应该是只接受有效数据并在收到无效的东西时抛出异常.

考虑到这一点,我想为User模型提出以下场景(我现在正在研究这样的事情):

  • 用户有字段:
    • ID:始终需要,数字,自动递增.
    • 用户名:始终需要,alpha-dash,唯一.
    • 电子邮件:始终需要,电子邮件,独特.
    • 密码:始终需要,> 6个字符.哈希.
    • 个人资料图片: - 可选,png/jpg/gif,<10mb.作为文件名存储在数据库中,该文件名指向用户特定目录(content/users/USERID/PROFILEIMAGE)中文件系统上的图像.在将上传的图像移动到此位置之前,会对其进行裁剪和调整大小.还必须确定可用的文件名.

有很多选项可供选择,有些选项更容易实现,但感觉不对:

选项1:控制器验证.在处理此对象的控制器中粘贴验证很容易.另一方面,规则在整个地方重复出现,这感觉就像是一种不好的方式.

选项2:表格验证人.为不同的表单创建分隔符验证器.从本质上讲,这与选项1或多或少是相同的方法,但我们刚刚将验证提取到单独的类中.规则仍然在各个不同的地方重复,仍然感觉很脏.

选项3:整个模型验证.将验证规则添加到模型并在保存之前进行验证(通过从控制器显式调用验证方法或在保存时验证).由于场景的复杂性,感觉好多了但仍然有缺点.我们需要处理在现有记录的唯一规则中排除ID.我们需要在保存到数据库之前处理密码哈希(如果我们从数据库加载了一条记录,该模型将包含一个真实的哈希密码,我们不应该验证).我们仍然需要处理上传图像的裁剪/调整大小/移动并以某种方式生成唯一的文件名.

选项4:模型验证/处理功能.在设置属性之前编写一个接受数据并验证它的函数(如果无效则抛出异常).仅验证其提供的数据(例如,我们可能只传入新的配置文件图像).根据对象是否存在或是新对象动态调整规则.调用相关处理功能,例如处理调整大小/裁剪/移动上载图像和删除旧配置文件图像的功能.

选项5:模型变异器.编写负责验证和处理它们所代表的字段的变更器.这可确保只有有效数据才能进入模型并完成所有处理.可以通过立即抛出异常或使用可以检索的错误字段跟踪问题来处理错误.缺点可能是如果没有设置字段,那么永远不会调用该字段的验证,因此一些空的必填字段可能会漏网 - 我想这可以通过确保控制器中所有输入都通过来解决.

选项6:模型mutators +整个模型验证.模型变换器如前面在选项5中所述,在保存数据之前添加了验证整个模型,如选项3中所示.这将确保没有空的必填字段通过网络.

有什么建议?

请注意,我不是在提供任何代码帮助之后.只是寻找有关如何以最佳方式进行复杂场景的建议和建议.

干杯

php validation model laravel

3
推荐指数
1
解决办法
1349
查看次数

Git 忽略文件,而不删除它

我有一个使用 GIT 进行版本控制的网站。我有一个系统设置,基本上可以自动将我的master分支中的更改部署到我的生产服务器。也就是说,我的存储库中有一个 Web 钩子,它触发一个 PHP 脚本,该脚本基本上git pull在服务器上启动 a以便下拉更改。

我的问题在于我目前有一个config.php使用 git 跟踪的配置文件 ( )。我自己和另一个开发人员想要拥有config.php与服务器上的文件不同的我们自己的文件,因此我们想告诉 git 停止跟踪该文件并假装它不存在。

我们决定首先使用一个不太重要的文件进行测试,所以我们添加test.php到我们的.gitignore文件中,希望这能奏效。Git 仍在跟踪该文件,因此我尝试运行git rm --cached test.php以尝试停止跟踪该文件。这似乎奏效了,所以我们承诺并推动了我们的改变。

令我惊讶的是,当我们的部署脚本在我们的服务器上发起拉取时,我们发现该文件已从生产中删除。谢天谢地,删除test.php并不重要。

TLDR;我如何告诉 git 忽略它当前跟踪的文件,取消跟踪并从我的存储库中删除它,但在我的生产服务器上保持完整?

git deployment version-control gitignore

3
推荐指数
1
解决办法
1504
查看次数

Vue.js将数据从插槽传递到组件实例

我正在尝试构建一个可重用的组件来处理使用Vue.js通过AJAX提交表单.理想情况下,我想要做的是有一个可以代替HTML中使用的通用组件form元素,在可能含有未知组表单元素如input,select,textarea等等.

我为我的组件命名了以下代码ajax-form:

<template>
    <form class="form" :action="action" :method="method" v-on:submit.prevent="ajaxSubmit">
        <slot></slot>
    </form>
</template>

<script>
module.exports = {
    props: {
        action: {
            required: true,
            type: String
        },
        method: {
            default: 'post',
            required: false,
            type: String
        }
    },
    data() {
        return {
            formData: {}
        }
    },
    methods: {
        ajaxSubmit() {
            // Do ajax
        }
    }
}
</script>
Run Code Online (Sandbox Code Playgroud)

在我的HTML中,我会有以下内容:

<ajax-form action="http://example.com/do/something">
    <input name="first_name" type="text">
    <textarea name="about_you"></textarea>
</ajax-form>
Run Code Online (Sandbox Code Playgroud)

理想情况下,我希望将所有表单元素放在我的组件中,使用它的插槽映射到data.formData我的Vue组件实例中的属性.所以在这种情况下,data属性看起来像:

data: {
    formData: …
Run Code Online (Sandbox Code Playgroud)

javascript vue.js vue-component vuejs2

3
推荐指数
2
解决办法
7185
查看次数

Laravel 5.4升级,从utf8转换为utf4mb

我正忙着将我的一个站点从5.3升级到Laravel 5.4.我注意到,当通过当前的Github存储库时,默认字符集和排序规则已从更改utf8utf8mb4,以便为emojis提供支持.

我当前的数据库(MariaDB 10.0.29)目前已设置使用,utf8但我想将其升级使用utf8mb4.不幸的是,我无法找到有关此过程的任何文档.

也许我正在思考它,但我认为改变数据库的字符集和整理将需要一些工作,至少运行一些ALTER TABLE命令.

  • 是否有必要更改数据库和表上的字符集和排序规则?或者仅仅更改我config/database.php文件中的设置就足够了?
  • 如果是这样,任何人都可以提供一个示例迁移(或一些MySQL代码)如何实现这一点,请记住,保留现有数据是必不可少的.

谢谢

php mysql database encoding laravel

3
推荐指数
1
解决办法
2431
查看次数

在对包装 HashMap 的结构的引用上实现 IntoIterator

我正在尝试构建一种 HTTP Web 服务器作为学习练习,但在尝试使用 for 循环(通过实现IntoIterator)使我的其中一个类型可迭代时遇到了麻烦。

迄今为止

我创建了一个数据结构,其中我有一个Response对象(旨在模拟 HTTP 响应),并且包含一个Headers对象(旨在模拟 HTTP 响应标头),并且包含HashMap<String, String>,表示实际标头值:

use std::collections::HashMap;

struct Headers {
    headers: HashMap<String, String>,
}

impl Headers {
    pub fn new(headers: HashMap<String, String>) -> Self {
        Self { headers }
    }
}

struct Response {
    headers: Headers,
}

impl Response {
    pub fn new(headers: Headers) -> Self {
        Self { headers }
    }

    pub fn headers(&self) -> &Headers {
        &self.headers
    }
}
Run Code Online (Sandbox Code Playgroud)

注意:该headers方法返回一个不可变的引用,因为我只想读取这些值。理想情况下,我不想复制/克隆标题以便可以读取它们。 …

iterator lifetime ownership rust borrow-checker

3
推荐指数
1
解决办法
411
查看次数

添加一个新的传输驱动程序到Laravel的Mailer

我需要向Laravel的邮件包添加一个新的传输驱动程序,以便我可以通过默认情况下不支持的外部服务(Mailjet)发送电子邮件.

编写传输驱动程序不会有问题,但我找不到一种方法来挂钩并添加一个新的,所以我可以继续正常使用Laravel的邮件程序.我找不到任何有关扩展Mailer的文档.

我能想出的唯一方法MailServiceProviderconfig/app.php用我自己的服务提供商替换Laravel的引用,然后我可以使用它来注册我自己的TransportManager和我自己的传输驱动程序.

有没有更好的方法来添加另一个传输驱动程序?

php laravel laravel-5 laravel-5.2

1
推荐指数
1
解决办法
1836
查看次数