铁路 / 铁路内容
非常简单灵活的CMS系统,适用于开发者。
Requires
- php: ^8.2
- ext-pdo: *
- aws/aws-sdk-php: ^3.0.0
- doctrine/dbal: ^3.0
- elasticsearch/elasticsearch: ~7.0
- google/apiclient: ^2.2
- guzzlehttp/guzzle: ^7.2
- iksaku/laravel-mass-update: ^1.0
- laravel/framework: ^11.9
- league/flysystem: ^3.0
- league/flysystem-aws-s3-v3: ^3.0
- predis/predis: ^2.1
- railroad/mailora: ^4.0
- railroad/response: ^3.0
- ramsey/uuid: ^4.3
- symfony/http-foundation: ^7.0
- vimeo/vimeo-api: ^3.0
Requires (Dev)
- orchestra/testbench: ^9.2
- phpunit/php-code-coverage: ^11.0.1
- phpunit/phpunit: ^11.0.1
- dev-main
- 5.6.x-dev
- v3.0.x-dev
- v3.0.9
- v3.0.8
- v3.0.7
- v3.0.6
- v3.0.5
- v3.0.4
- v3.0.3
- v3.0.1
- v3.0.0
- v2.1.x-dev
- v2.1.93
- v2.1.92
- v2.1.91
- v2.1.90
- v2.1.89
- v2.1.88
- v2.1.87
- v2.1.86
- v2.1.85
- v2.1.84
- v2.1.83
- v2.1.82
- v2.1.81
- v2.1.80
- v2.1.79
- v2.1.78
- v2.1.77
- v2.1.76
- v2.1.75
- v2.1.74
- v2.1.73
- v2.1.72
- v2.1.71
- v2.1.70
- v2.1.69
- v2.1.68
- v2.1.67
- v2.1.66
- v2.1.65
- v2.1.64
- v2.1.63
- v2.1.62
- v2.1.61
- v2.1.60
- v2.1.59
- v2.1.58
- v2.1.57
- v2.1.56
- v2.1.55
- v2.1.54
- v2.1.53
- v2.1.52
- v2.1.51
- v2.1.50
- v2.1.49
- v2.1.48
- v2.1.47
- v2.1.46
- v2.1.45
- v2.1.44
- v2.1.43
- v2.1.42
- v2.1.41
- v2.1.40
- v2.1.39
- v2.1.38
- v2.1.37
- v2.1.36
- v2.1.35
- v2.1.34
- v2.1.33
- v2.1.32
- v2.1.31
- v2.1.30
- v2.1.29
- v2.1.28
- v2.1.27
- v2.1.26
- v2.1.25
- v2.1.24
- v2.1.23
- v2.1.21
- v2.1.20
- v2.1.19
- v2.1.18
- v2.1.17
- v2.1.6
- v2.1.5
- v2.1.4
- v2.1.3
- v2.1.2
- v2.1.1
- v2.0.79
- v2.0.78
- v2.0.77
- v2.0.76
- v2.0.75
- v2.0.74
- v2.0.73
- v2.0.72
- v2.0.71
- v2.0.70
- v2.0.69
- v2.0.68
- v2.0.67
- v2.0.66
- v2.0.65
- v2.0.64
- v2.0.63
- v2.0.62
- v2.0.61
- v2.0.60
- v2.0.59
- v2.0.58
- v2.0.57
- v2.0.56
- 2.0.55
- 2.0.54
- 2.0.53
- 2.0.52
- 2.0.51
- 2.0.50
- v2.0.47
- v2.0.46
- v2.0.45
- 2.0.44
- 2.0.43
- 2.0.42
- 2.0.41
- v2.0.40
- 2.0.39
- 2.0.38
- 2.0.37
- v2.0.36
- v2.0.35
- v2.0.34
- v2.0.33
- v2.0.32
- v2.0.31
- v2.0.30
- v2.0.29
- 2.0.28
- 2.0.27
- v2.0.26
- v2.0.25
- v2.0.24
- v2.0.23
- v2.0.22
- v2.0.21
- v2.0.20
- v2.0.19
- v2.0.18
- v2.0.17
- v2.0.16
- v2.0.15
- v2.0.14
- v2.0.13
- v2.0.12
- v2.0.11
- v2.0.10
- v2.0.9
- v2.0.8
- v2.0.7
- v2.0.6
- v2.0.5
- v2.0.4
- v2.0.3
- v2.0.2
- v2.0.1
- v2.0.0
- v1.0.7
- v1.0.6
- v1.0.5
- v1.0.4
- v1.0.3
- v1.0.2
- v1.0.1
- v1.0.0
- v0.5.191
- v0.5.190
- v0.5.189
- v0.5.188
- v0.5.187
- v0.5.186
- v0.5.185
- v0.5.184
- v0.5.183
- v0.5.182
- v0.5.181
- v0.5.180
- v0.5.179
- v0.5.178
- v0.5.177
- v0.5.176
- v0.5.175
- v0.5.174
- v0.5.173
- v0.5.172
- v0.5.171
- v0.5.170
- v0.5.169
- v0.5.168
- v0.5.167
- v0.5.166
- v0.5.165
- v0.5.164
- v0.5.163
- v0.5.162
- v0.5.161
- v0.5.160
- v0.5.159
- v0.5.158
- v0.5.157
- v0.5.156
- v0.5.155
- v0.5.154
- v0.5.153
- v0.5.152
- v0.5.151
- v0.5.150
- v0.5.149
- v0.5.148
- v0.5.147
- v0.5.146
- v0.5.145
- v0.5.144
- v0.5.143
- v0.5.142
- v0.5.141
- v0.5.140
- v0.5.139
- v0.5.138
- v0.5.137
- v0.5.136
- v0.5.135
- v0.5.134
- v0.5.133
- v0.5.132
- v0.5.131
- v0.5.130
- v0.5.129
- v0.5.128
- v0.5.127
- v0.5.126
- v0.5.125
- v0.5.124
- v0.5.123
- v0.5.122
- v0.5.121
- v0.5.120
- v0.5.119
- v0.5.118
- v0.5.117
- v0.5.116
- v0.5.115
- v0.5.114
- v0.5.113
- v0.5.112
- v0.5.111
- v0.5.110
- v0.5.109
- v0.5.108
- v0.5.107
- v0.5.106
- v0.5.105
- v0.5.104
- v0.5.103
- v0.5.102
- v0.5.101
- v0.5.100
- v0.5.99
- v0.5.98
- v0.5.97
- v0.5.96
- v0.5.95
- v0.5.94
- v0.5.93
- v0.5.92
- v0.5.91
- v0.5.90
- v0.5.89
- v0.5.88
- v0.5.87
- v0.5.86
- v0.5.85
- v0.5.84
- v0.5.83
- v0.5.82
- v0.5.81
- v0.5.80
- v0.5.79
- v0.5.78
- v0.5.77
- v0.5.76
- v0.5.75
- v0.5.74
- v0.5.73
- v0.5.72
- v0.5.71
- v0.5.70
- v0.5.69
- v0.5.68
- v0.5.67
- v0.5.66
- v0.5.65
- v0.5.64
- v0.5.63
- v0.5.62
- v0.5.61
- v0.5.59
- v0.5.58
- v0.5.57
- v0.5.56
- v0.5.55
- v0.5.54
- v0.5.53
- v0.5.52
- v0.5.51
- v0.5.50
- v0.5.49
- v0.5.48
- v0.5.47
- v0.5.46
- v0.5.45
- v0.5.44
- v0.5.43
- v0.5.42
- v0.5.41
- v0.5.40
- v0.5.39
- v0.5.38
- v0.5.37
- v0.5.36
- v0.5.35
- v0.5.34
- v0.5.33
- v0.5.32
- v0.5.31
- v0.5.30
- v0.5.29
- v0.5.28
- v0.5.27
- v0.5.26
- v0.5.25
- v0.5.24
- v0.5.23
- v0.5.22
- v0.5.21
- v0.5.20
- v0.5.19
- v0.5.18
- v0.5.17
- v0.5.16
- v0.5.15
- v0.5.14
- v0.5.13
- v0.5.12
- v0.5.11
- v0.5.10
- v0.5.9
- v0.5.8
- v0.5.7
- v0.5.6
- v0.5.5
- v0.5.4
- v0.5.3
- v0.5.2
- v0.5.1
- v0.5.0
- v0.4.24
- v0.4.23
- v0.4.22
- v0.4.21
- v0.4.20
- v0.4.19
- v0.4.18
- v0.4.17
- v0.4.16
- v0.4.15
- v0.4.14
- v0.4.13
- v0.4.12
- v0.4.11
- v0.4.10
- v0.4.09
- v0.4.08
- v0.4.07
- v0.4.06
- v0.4.05
- v0.4.04
- v0.4.03
- v0.4.02
- v0.4.01
- v0.4.0
- v0.3.02
- v0.3.01
- v0.2.27
- v0.2.26
- v0.2.25
- v0.2.24
- v0.2.23
- v0.2.22
- v0.2.21
- v0.2.20
- v0.2.17
- v0.2.16
- v0.2.15
- v0.2.14
- v0.2.13
- v0.2.12
- v0.2.11
- v0.2.10
- v0.2.05
- v0.2.04
- v0.2.03
- v0.2.02
- v0.2.01
- v0.2.00
- v0.1.37
- v0.1.36
- v0.1.35
- v0.1.34
- v0.1.33
- v0.1.32
- v0.1.26
- v0.1.25
- v0.1.24
- v0.1.23
- v0.1.22
- v0.1.21
- v0.1.20
- v0.1.19
- v0.1.18
- v0.1.17
- v0.1.16
- v0.1.15
- v0.1.14
- v0.1.13
- v0.1.12
- v0.1.11
- v0.1.1
- v0.1.0
- v0.0.99
- v0.0.98
- v0.0.97
- v0.0.96
- v0.0.95
- v0.0.94
- v0.0.93
- v0.0.92
- v0.0.91
- v0.0.90
- v0.0.89
- v0.0.88
- v0.0.87
- v0.0.86
- v0.0.85
- v0.0.84
- v0.0.83
- v0.0.82
- v0.0.81
- v0.0.80
- v0.0.79
- v0.0.78
- v0.0.77
- v0.0.76
- v0.0.75
- v0.0.74
- v0.0.73
- v0.0.72
- v0.0.71
- v0.0.70
- v0.0.61
- v0.0.60
- v0.0.53
- v0.0.52
- v0.0.51
- v0.0.50
- v0.0.41
- v0.0.4
- v0.0.3
- v0.0.2
- v0.0.1
- dev-0.5-mwp-open-beta-launch
- dev-defaultLimit
- dev-feature/amcneill20240918__rec_pagination
- dev-feature/amcneill20240828_mpw_schedule_changes_BE-300
- dev-dev/amcneill20240909_add_subscribed_coaches_endpoint
- dev-fix/amcneill20250909_add_missing_route
- dev-dev/amcneill20240905_recommended_content
- dev-feature/amcneill20240904_video_endpoints
- dev-feature/amcneill20240829_mc_schedule_changes_BE-300
- dev-feature/amcenill2050828_BE-300_schedule_changes_musora
- dev-v2.1-sanity-feature-cms
- dev-feature/amcneill20240621_BE-230_carousel_updates
- dev-feature/amcneill20240731_incorrect_urls_BE-251
- dev-feature/amcneill20240827_schedule_changes_BE-300
- dev-dev/amcneill20240731_BE-251_handle_null_case
- dev-feature/amcneill20240723__allow_admin_locked_content
- dev-feature/amcneill20240723__content_controller_null_fix
- dev-feature/amcneill20240624__licensing_changes
- dev-feature/amcneill20240719_delist_content_TS-49
- dev-0.5-TP-44-unlisted-status
- dev-TP-44-unlisted-status
- dev-TP-44
- dev-TP-45
- dev-feat/BE-227-fetch-module-sorce
- dev-BE-187
- dev-feature/amcneill20240523_BE-178_snowflake_migration
- dev-feature/amcneill20240614_BE-206_user_content_liked_endpoint
- dev-feature/amcneill20240523_BE-185_lock_timeout
- dev-BE-78
- dev-BE-34
- dev-fix/amcneill20240510_update_recsys_caching_logic
- dev-feature/amcneill20240508__log_cache
- dev-fix/BE-43-trigger-started-completed-events
- dev-feature/amcneill20240503__update_cache_time
- dev-feature/amcneill20240503__update_cache
- dev-feature/amcneill20240503__update_cache2
- dev-BE-76-Recommendation-System-Hide-Song-Pill
- dev-BE-15-MWP
- dev-BE-15
- dev-2.0-
- dev-dev/amcneill20240408_recsys_use_all_section
- dev-MT-727
- dev-FSU-212-MC
- dev-FSU-212
- dev-dev/amcneill20240403_huggingface_timeout
- dev-dev/amcneill20240202_RECSYS_V1_2
- dev-FSU-214
- dev-FSU-213
- dev-dev/rwillems2024_02_05_comment_mod_tool
- dev-hotfix-FSU-187
- dev-hotfix-FSU-158
- dev-dev/alesevero20240305-fix-content-started-event-trigger
- dev-filter-v2
- dev-dev/amcneill20240222_MT-866_CMS_linking
- dev-dev/amcneill20240223_MT-866_CMS_linking_2
- dev-feature-pack-updates
- dev-dev/amcneill20240131_rec_sys_internal
- dev-dev/amcneill20240124_mt805_recsys_v1.1
- dev-dev/amcneill20240102_MT805_recommender_implementation
- dev-hotfix-guitar-system-to-playlist
- dev-2.0-workouts-sort-fix-rwillems20231222
- dev-2.0-workouts
- dev-2.0-enrollment-dates-optimizations
- dev-2.0-workouts-filters
- dev-srr-148-CMS
- dev-2.0-included-fields-fix
- dev-catalogue-filters-v2
- dev-2.0-connection-mask-public
- dev-dummy-action-pack-started-event-BR-884
- dev-0.5-mwp-open-beta-launch-song-duration
- dev-2.0-playlists-v15
- dev-2.0-fix-paused-members-page-MT-532
- dev-2.0-update-neighbour-siblings-query
- dev-2.0-playlists
- dev-2.0-filters-updates
- dev-playlists-progress
- dev-2.0-cohort-optimizations
- dev-feature-block-user
- dev-2.0-playlists-code-review
- dev-2.0-store-reported-comments
- dev-v2.0-fix-content-list-bug-BR-458
- dev-beta-testing-BR334-BR458
- dev-v2.0-previous-next-button-bug-BR-334
- dev-2.0-external_video_id
- dev-0.5-mwp-open-beta-launch-user-progress-optimizations
- dev-2.0-video-progress-optimizations
- dev-v0.5-mwp-open-beta-launch-instrumentless-column-US-27
- dev-v2.0-add-instrumentless-column
- dev-v2.0-request-song
- dev-v2.0-dont-show-scheduled-content-from-past
- dev-test-mircea
- dev-feature-youtube-command-port-rwillems20221124
- dev-fix-vimeo-rwillems20221011
- dev-2.0-fixing-content-permissions
- dev-v2.0-fix-play-along-favorites
- dev-v2.0-content-optimisations
- dev-v2.0-optimisations-compiled-column
- dev-v2.0-content-optimisations-current-live-by-brand
- dev-v2.0-content-optimisations-tables-timestamps
- dev-0.5-
- dev-0.5-php-mysql-8-migration
- dev-2.0-php-mysql-8-migration
- dev-1.0-
- dev-1.0-laravel9
- dev-0.5-higer-key-progress-updates
- dev-0.5-query-optimisations-1
- dev-0.5-content-follow
- dev-0.5-slug-unique
- dev-0.5-sort-by-progress
- dev-migration-fix
- dev-1.0-style
- dev-1.0-elasticsearch
- dev-0.5-user-permission-start-date
- dev-0.5-comment-assignment
- dev-0.5-drumeo-method
- dev-revert_test
- dev-0.5-new-database-structure
- dev-0.6-
- dev-0.5-response-changes
- dev-0.4-
This package is auto-updated.
Last update: 2024-09-27 22:05:09 UTC
README
首个简单CMS。
进度-冒泡
当一个内容保存进度时,会触发一个 UserContentProgressSaved
事件。此事件将触发 UserContentProgressService
的 bubbleProgress
方法。如果保存的内容有一个父内容,则该父内容的类型将与你在应用程序的 /config/railcontent.php 复制中定义的配置值进行评估。
这在你有某种内容(如Drumeo的“课程”)时很有用,当子内容开始时应该将其标记为已开始。然而,如果你有你不希望标记为已开始的内容(例如,因为它有自己的系统,如Drumeo的“学习路径”),你不想当子内容开始时父内容也启动。请记住,子内容可以有多个父内容,因此如果一节课开始,我们可能希望导致一个父内容开始,但另一个保持未开始。
你可以通过从允许类型列表中省略来限制哪些内容 父类型 应在子内容开始时标记为已开始或已完成。
'allowed_types_for_bubble_progress' => [ 'started' => [ 'foo','bar', 'baz' ], 'completed' => [ 'foo','bar', 'qux' ] ];
如果你没有限制,可以在列表中同时有一个值,或者只一个,或者都不填。
请注意,这仅适用于进度 冒泡。这不会影响 UserContentProgressService
的 startContent
、completeContent
或 saveContentProgress
方法。
示例
假设你有不允许 开始 进度事件冒泡的 父类型。
如果该父内容本身 尚未开始,则在它的子内容之一开始时不会写入或更新其进度记录。如果它在“完成”允许类型列表中,如果所有子内容都已完成,则可以将其标记为完成,但除非确实发生这种情况,否则不会保存其进度百分比。除非它自己已经启动。如果父内容已经启动,则当子内容更新时,父内容的进度百分比值将根据允许启动的配置设置按其他类型的允许内容进行编辑。
验证
非技术介绍
这是一种业务规则验证,有助于确保需要特定信息或组件的内容不会因未满足这些要求而受到损害。例如,你可能有一个“发布”状态,你希望只将其分配给准备好供客户查看的内容。你不希望意外发布缺少重要组件的内容,这会对品牌产生负面影响。因此,可以在内容管理系统(CMS)中设置规则以确保内容符合既定标准。
如果没有验证,所有编辑都将“未经检查”地持久保存 - 即使它们毫无意义。这可能会导致一个内容不完整、用户体验差的网站。为了防止这种情况,技术管理员可以配置规则。内容编辑在提交时将“检查”这些设置规则。也就是说,它们将被“验证”。
在最初创建内容时,我们需要假设一个时期,内容将无法通过所有验证——因为所有字段都将为空!因此,可以设置“草稿”、“计划中”和“已发布”等“状态”在内容上。验证规则随后设置为仅应用于某些“受保护”的状态——通常是“计划中”和“已发布”。
了解这一点后,我们现在可以查看触发验证的两种情况:
- 请求将内容的状态更改为“受保护”的状态。
- 内容处于“受保护”状态,任何细节更改将触发验证。
在上述所有情况下,验证失败将导致以下结果:
- 请求更改到受保护状态将不会执行——状态将保持不变。请注意,当前或之前的状态是受保护或未受保护的状态无关紧要。唯一发生的事情是请求的状态更改不会被持久化。
- 请求的更改将不会执行。这样做会导致内容违反其类型的业务规则。
* 除了Musora CMS,对于2018年的Musora Media,当前视频ID和练习ID首先由另一个系统验证,该系统不会启用设置无意义值,无论内容状态如何。
技术介绍
这是“业务规则”验证。这并不验证内容是否适合数据库。这由特定实体和操作中的“规则”方法中硬编码的规则处理(扩展自Railroad\Railcontent\Requests\FormRequest
,所有在/src/Requests)。相反,此“业务规则”验证用于当应用程序中独特的内容需要根据其在你域内的预期使用而特定的信息时。例如,对于可消费的消费者教育和娱乐,你可能会有“公开”或“已发布”等状态,你只想将这些状态分配给满足你质量和完善性要求的全部组件的内容。
在你的应用程序的config/目录中,你应该有一个railcontent.php文件。在那里,在'validation'下,你可以列出你想要进行验证的品牌。如果品牌不存在,则不会运行验证。
规则组织如下:
品牌 -> 内容类型 -> 受保护状态 -> 规则*
* 请参阅下方的“定义规则”部分
关于定义规则
每个内容类型的键必须与在应用程序中使用的表示内容类型的字符串相同。每个内容类型的规则有两个必需组件,可以有一个可选组件
- 字段
- 数据
- number_of_children(可选)
如果内容类型存在于这些规则中,则将按上述方式运行验证。如果内容类型未在规则中表示,则验证规则不会根据规则保护该内容类型。
(目前还没有提供为特定内容类型提供自定义“限制”的方法。请参阅“todo.md”文件以了解如何更改此包以使其成为可能。)
关于字段或数据引用其他内容的部分的说明
当内容具有自身是另一篇内容引用的字段或数据时,评估的是该引用内容的ID。
因此,你的规则必须适应或使用这一点。
例如:一个视频有一个ID为视频的字段...并且那个视频本身也是一篇内容。规则可能看起来像这样
'video' => [ 'rules' => [ Rule::exists($connectionMaskPrefix . 'content', 'id')->where( function ($query) { $query->where('type', 'vimeo-video'); } ), 'required' ] ],
这是在"\Railroad\Railcontent\Requests\CustomFormRequest"类的"validateContent"方法中使用的以下逻辑完成的
if (($contentProperty['type'] ?? null) === 'content' && isset($inputToValidate['id'])) { $inputToValidate = $inputToValidate['id']; }
你可以看到如果($contentProperty['type']
是"content"并且
关于“数值”规则的重要说明
If you don't include the "numeric" rule here, this doesn't work. I don't know why and it
doesn't make sense. Laravel' validator should - for the min, max, and size rules according to the
documentation - evaluate the evaluated value in regards to these rules based on the data-type
of the value under evaluation. If it's a string, it will evaluate the length. Thus, if min:5,
the string must have at least 5 characters. If the value is an integer min:5 will pass only if
the value of the integer is 5 or higher. If an array it evaluates the count. You get the idea.
But here it's failing to do that. Even if casting the value to an int just to be sure, and then
debugging to make sure it's not changed into a string somehow (because that would break it of
course because the string "6" would only pass for "min:1" and would fail for "min:2" and upwards
but the integer 6 would pass for "min:2" to "min:6". Maybe something about the "numeric" rule
is casting it to an int somewhere I didn't see. Anyways this is smelly af because that "numeric"
condition is just there as a hack to circumvent failure of the system to act as expected. But
it works, so fuck.
(粗略地写下的注释从这里复制自代码中的注释)
指定规则
你可以“...将验证规则指定为数组,而不是使用|字符来分隔它们”(来自“指定自定义列名”部分这里)。
例如;这里的bar
和bax
会产生相同的效果
foo => [ 'bar' => ['max:2|required'], 'bax' => [ 'max:2', 'required' ] ]
每个品牌可用的选项详细信息
字段
(必需)
根据它们应用的字段进行键控的规则数组。这个“fields”数组中的每个键控值代表一个字段。每个值可以是字符串或数组,表示所使用的Laravel版本中可用的规则。有关Laravel规则的详细信息,请参阅他们的文档。
数据
(必需)
与fields相同,除了数据。
number_of_children
(可选)
参见上面的“关于"numeric"规则的注意事项”。
在需要设置内容类型为“受限”状态(例如“发布”或“计划”)之前,必须先设置一定数量的子内容的情况下提供。
可以定义为以下两种方式之一
'number_of_children' => 'min:3', 'number_of_children' => ['rules' => 'min:3'],
与其它规则不同,这个不需要是数组中的一个名为"rules"的项目。可以是,也可以不是。两种方式都可行。
配置示例
'validation' => [ 'brand' => [ 'content-type' => [ 'content-status|content-status|...' => [ 'number_of_children' => 'min:3', 'fields' => [ 'key' => [ rules => ['validation-rule', 'validation-rule', ...], 'can_have_multiple' => true/false], ], 'key' => [ rules => 'validation-rule|validation-rule|...', 'can_have_multiple' => true/false], ], ], 'data' => [ 'key' => [ rules => ['validation-rule', 'validation-rule', ...], 'can_have_multiple' => true/false], ], 'key' => [ rules => 'validation-rule|validation-rule|...', 'can_have_multiple' => true/false], ], ] ] ], ] ]
MultipleColumnExistsValidator
注意:目前这个功能实际上并没有正常工作,所以上述可能并不完全准确。
这还准确吗?(Jonathan,2018年7月)
您可能无法使用Laravel验证器的Rule::Exists()
功能来指定您的验证规则。也许您指定了配置文件中的规则,这些文件以静态方式调用方法并缓存,这可能是导致规则失效的原因。
为了解决这个问题,这个包中存在一个自定义规则,名为(Railroad\Railcontent\Validators)"MultipleColumnExistsValidator"。还有一个针对它的测试:(Tests\Feature)"MultipleColumnExistsRuleTest"。
如果需要,请查看该类以完全理解其工作原理。如果您只需要快速查看,以下是它的功能:
$exists = $this->databaseManager->connection($connection) ->table($table) ->where($row, $value) ->exists();
您通过规则传递这些参数
$connection = $parameterParts[0]; $table = $parameterParts[1]; $row = $parameterParts[2]; $value = isset($parameterParts[3]) ? $parameterParts[3] : $value;
配置的规则看起来像这样
'video' => 'exists_multiple_columns:mysql,railcontent_content,id&mysql,railcontent_content,type,vimeo-video'
解包后得到以下内容
exists_multiple_columns:
mysql,railcontent_content,id
&
mysql,railcontent_content,type,vimeo-video
逐行分解
exists_multiple_columns
是自定义规则的名字
mysql,railcontent_content,id
是一组规则,用于数据库验证中的单个"where exists"子句。
&
(与号)是我们的分隔符——因为管道或垂直线(|
)已经被Laravel用于分隔规则。
mysql,railcontent_content,type,vimeo-video
是另一个添加到数据库验证中的"where exists"子句,当所有子句都编译时将运行。
在这种情况下,验证要成功,两个"where exists"验证都必须通过。
在每个"where exists"验证中,值通过逗号(,
)分隔。
因此,第一组有三个(3)个值
mysql
railcontent_content
id
第二组有四个(4)个值
mysql
railcontent_content
type
vimeo-video
前三个(3)个参数是必需的,第四个(第4个)是可选的。
如上代码片段所示,参数如下
- 连接(必需)
- 表(必需)
- $row(必需)
- $value(可选)
如果未传递第四个(第4个)参数,用于"where exists"评估的值将是整个规则正在验证的值。
回顾示例,我们看到我们正在验证提交给video
输入的值是否与规则'exists_multiple_columns:mysql,railcontent_content,id&mysql,railcontent_content,type,vimeo-video'
匹配,以确保值匹配两个子句mysql,railcontent_content,id
和mysql,railcontent_content,type,vimeo-video
。第一个确保通过连接"mysql",在表"railcontent_content"中,正在验证的值匹配"id"列的值。第二个做同样的事情,但值不是传递的值,而是规则中硬编码的第四个参数-"vimeo-video"。因此,它确保存在一条记录,其中传递的值与"id"列中的值匹配,并且至少有一条记录匹配该值,其"类型"列至少有一个值为"vimeo-video"。
WHERE AND
上述示例描述了一个“WHERE ... AND ...”查询。这是标准行为——验证通过至少需要在某一行中包含所有内容。
WHERE OR
这描述了一个“WHERE ... OR ...”查询。
您可以在“条款规则字符串”(记住这些字符串之间用和符号(&)分隔)前加上or:
,所以对于上面的例子,第二个查询将不是这样
mysql,railcontent_content,type,vimeo-video
而是这样
or:mysql,railcontent_content,type,vimeo-video
这与前面的规则一样,当存在一个or:
“在它们之间”时,它们通过一个或语句连接。
请注意,因为您可以在一个规则中有超过两个“条款规则字符串”,所以您可以这样组合OR和AND
exists_multiple_columns:
mysql,railcontent_content,id
&
or:mysql,railcontent_content,foo_id
&
mysql,railcontent_content,type,vimeo-video
&
or:mysql,railcontent_content,slug,'bar baz'
这意味着前两个“条款规则字符串”之一必须与最后两个“条款规则字符串”之一匹配。
(
mysql,railcontent_content,id
OR
mysql,railcontent_content,foo_id
)
AND
(
mysql,railcontent_content,type,vimeo-video
OR
mysql,railcontent_content,slug,'bar baz'
)