@artilingo/artiframe-cli 1.3.0 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/core-stubs/bin/SystemMethod.php +600 -521
- package/core-stubs/bin/ViewMethod.php +591 -393
- package/core-stubs/docs/de.html +853 -1172
- package/core-stubs/docs/en.html +585 -904
- package/core-stubs/docs/es.html +934 -1253
- package/core-stubs/docs/fr.html +913 -1232
- package/core-stubs/docs/tr.html +4212 -5021
- package/package.json +1 -1
- package/src/App.php +38 -0
- package/src/Commands/AddCommand.php +1 -1
- package/src/Commands/AuthCommand.php +219 -0
- package/src/Commands/IssuesCommand.php +174 -0
- package/src/Commands/ListCommand.php +2 -1
- package/src/Commands/MakeApiCommand.php +1 -1
- package/src/Commands/MakeClassCommand.php +1 -1
- package/src/Commands/MakeViewCommand.php +1 -1
- package/src/Commands/NewProjectCommand.php +37 -25
- package/src/Commands/RemoveCommand.php +21 -10
- package/src/Commands/ServeCommand.php +29 -9
- package/src/Commands/SuggestCommand.php +143 -0
- package/src/Commands/TableCommand.php +2 -1
- package/src/Commands/UpgradeCommand.php +209 -0
- package/src/Commands/VersionCommand.php +2 -1
- package/src/Lang/de.php +9 -1
- package/src/Lang/en.php +8 -0
- package/src/Lang/es.php +9 -1
- package/src/Lang/fr.php +8 -0
- package/src/Lang/tr.php +10 -2
- package/src/Services/Safeguard.php +25 -0
- package/stubs/service/image.stub +334 -334
- package/stubs/service/iyzico.stub +637 -637
- package/stubs/service/jwt.stub +312 -312
- package/stubs/service/phpmailer.stub +143 -143
- package/stubs/service/pusher.stub +232 -232
- package/stubs/service/qrcode.stub +169 -169
- package/stubs/service/redis.stub +361 -361
- package/stubs/service/s3.stub +377 -377
- package/stubs/service/sentry.stub +76 -106
- package/stubs/service/stripe.stub +526 -526
- package/stubs/service/twilio.stub +361 -361
- package/core-stubs/app/R2Manager.php +0 -130
package/core-stubs/docs/es.html
CHANGED
|
@@ -1,18 +1,23 @@
|
|
|
1
|
-
|
|
2
|
-
<!DOCTYPE html>
|
|
3
|
-
|
|
1
|
+
HTML
|
|
4
2
|
<html lang="es">
|
|
5
3
|
<head>
|
|
6
4
|
<meta charset="utf-8"/>
|
|
7
5
|
<meta content="width=device-width, initial-scale=1.0" name="viewport"/>
|
|
8
|
-
<title>
|
|
9
|
-
|
|
10
|
-
<
|
|
11
|
-
<
|
|
12
|
-
|
|
13
|
-
<
|
|
14
|
-
<
|
|
15
|
-
|
|
6
|
+
<title>Documentación oficial para desarrolladores: marco PHP ArtiFrame</title>
|
|
7
|
+
<meta content="ArtiFrame framework kullanım rehberi ve API referansları. En hızlı ve güvenli PHP framework'ünü öğrenin." name="description"/>
|
|
8
|
+
<meta content="artiframe, artiframe framework, php framework, fast php framework, secure php framework, artilingo framework, php, framework, mvc" name="keywords"/>
|
|
9
|
+
<meta content="Artilingo" name="author"/>
|
|
10
|
+
Abrir gráfico / Redes sociales
|
|
11
|
+
<meta content="Resmi Geliştirici Dokümantasyonu — ArtiFrame PHP Framework" property="og:title"/>
|
|
12
|
+
<meta content="ArtiFrame framework kullanım rehberi ve API referansları. En hızlı ve güvenli PHP framework'ünü öğrenin." property="og:description"/>
|
|
13
|
+
<meta content="website" property="og:type"/>
|
|
14
|
+
<meta content="https://artiframe.artilingo.com/docs/tr.html" property="og:url"/>
|
|
15
|
+
<meta content="ArtiFrame" property="og:site_name"/>
|
|
16
|
+
<link href="../../public/assets/images/favicon-96x96.png" rel="icon" sizes="96x96" type="image/png"/>
|
|
17
|
+
<link href="../../public/assets/images/favicon.svg" rel="icon" type="image/svg+xml"/>
|
|
18
|
+
<link href="../../public/assets/images/favicon.ico" rel="shortcut icon"/>
|
|
19
|
+
<link href="../../public/assets/images/apple-touch-icon.png" rel="apple-touch-icon" sizes="180x180"/>
|
|
20
|
+
<link href="../../public/assets/images/site.webmanifest" rel="manifest"/>
|
|
16
21
|
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet"/>
|
|
17
22
|
<style>
|
|
18
23
|
:root {
|
|
@@ -33,9 +38,7 @@
|
|
|
33
38
|
--sidebar-w: 280px;
|
|
34
39
|
}
|
|
35
40
|
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
|
|
36
|
-
|
|
37
41
|
html { scroll-behavior: smooth; }
|
|
38
|
-
|
|
39
42
|
body {
|
|
40
43
|
font-family: 'Inter', sans-serif;
|
|
41
44
|
background: var(--bg);
|
|
@@ -43,7 +46,6 @@
|
|
|
43
46
|
line-height: 1.75;
|
|
44
47
|
display: flex;
|
|
45
48
|
}
|
|
46
|
-
|
|
47
49
|
/* ---- SIDEBAR ---- */
|
|
48
50
|
.sidebar {
|
|
49
51
|
width: var(--sidebar-w);
|
|
@@ -57,7 +59,6 @@
|
|
|
57
59
|
display: flex;
|
|
58
60
|
flex-direction: column;
|
|
59
61
|
}
|
|
60
|
-
|
|
61
62
|
.sb-logo {
|
|
62
63
|
padding: 0 22px 24px;
|
|
63
64
|
border-bottom: 1px solid var(--border);
|
|
@@ -75,7 +76,6 @@
|
|
|
75
76
|
color: var(--muted);
|
|
76
77
|
margin-top: 3px;
|
|
77
78
|
}
|
|
78
|
-
|
|
79
79
|
.sb-subcat {
|
|
80
80
|
padding: 12px 22px 4px;
|
|
81
81
|
font-size: 0.62rem;
|
|
@@ -107,7 +107,6 @@
|
|
|
107
107
|
background: var(--green-dim);
|
|
108
108
|
border-left-color: var(--green);
|
|
109
109
|
}
|
|
110
|
-
|
|
111
110
|
/* ---- MAIN ---- */
|
|
112
111
|
.content {
|
|
113
112
|
margin-left: var(--sidebar-w);
|
|
@@ -115,7 +114,6 @@
|
|
|
115
114
|
max-width: 1100px;
|
|
116
115
|
width: 100%;
|
|
117
116
|
}
|
|
118
|
-
|
|
119
117
|
/* ---- TYPOGRAPHY ---- */
|
|
120
118
|
h1 { font-size: 2.6rem; font-weight: 700; letter-spacing: -0.5px; margin-bottom: 16px; }
|
|
121
119
|
h1 span { color: var(--green); }
|
|
@@ -133,10 +131,8 @@
|
|
|
133
131
|
li { margin-bottom: 8px; }
|
|
134
132
|
a { color: var(--green-light); text-decoration: none; }
|
|
135
133
|
a:hover { text-decoration: underline; }
|
|
136
|
-
|
|
137
134
|
/* ---- LEAD ---- */
|
|
138
135
|
.lead { font-size: 1.05rem; color: var(--muted); margin-bottom: 0; max-width: 720px; }
|
|
139
|
-
|
|
140
136
|
/* ---- BADGES ---- */
|
|
141
137
|
.badge { font-size: 0.68rem; padding: 3px 8px; border-radius: 4px; font-weight: 700; text-transform: uppercase; letter-spacing: .5px; white-space: nowrap; }
|
|
142
138
|
.b-view { background: rgba(88,166,255,.12); color: #58a6ff; border: 1px solid rgba(88,166,255,.3); }
|
|
@@ -144,7 +140,6 @@
|
|
|
144
140
|
.b-cli { background: rgba(0,200,140,.12); color: #00c88c; border: 1px solid rgba(0,200,140,.3); }
|
|
145
141
|
.b-core { background: rgba(227,179,65,.12); color: #e3b341; border: 1px solid rgba(227,179,65,.3); }
|
|
146
142
|
.b-sec { background: rgba(248,81,73,.12); color: #f85149; border: 1px solid rgba(248,81,73,.3); }
|
|
147
|
-
|
|
148
143
|
/* ---- CODE ---- */
|
|
149
144
|
pre {
|
|
150
145
|
background: var(--code-bg);
|
|
@@ -172,7 +167,6 @@
|
|
|
172
167
|
.cm { color: #8b949e; } /* comment */
|
|
173
168
|
.nu { color: #79c0ff; } /* number / bool */
|
|
174
169
|
.var { color: #ffa657; } /* variable */
|
|
175
|
-
|
|
176
170
|
/* ---- CARDS ---- */
|
|
177
171
|
.card {
|
|
178
172
|
background: var(--surface);
|
|
@@ -182,21 +176,17 @@
|
|
|
182
176
|
margin-bottom: 20px;
|
|
183
177
|
}
|
|
184
178
|
.card.highlight { border-left: 3px solid var(--green); }
|
|
185
|
-
|
|
186
179
|
/* ---- ALERTS ---- */
|
|
187
180
|
.alert { padding: 18px 22px; border-radius: 8px; margin: 24px 0; border-left: 3px solid; font-size: 0.95rem; }
|
|
188
181
|
.a-info { background: rgba(88,166,255,.08); border-color: var(--blue); color: #93c5fd; }
|
|
189
182
|
.a-warn { background: rgba(227,179,65,.08); border-color: var(--yellow); color: #fbbf24; }
|
|
190
183
|
.a-danger { background: rgba(248,81,73,.08); border-color: var(--red); color: #fca5a5; }
|
|
191
184
|
.a-success { background: rgba(0,157,108,.08); border-color: var(--green); color: #6ee7b7; }
|
|
192
|
-
|
|
193
185
|
/* ---- RETURN TYPE ---- */
|
|
194
186
|
.ret { display: inline-block; font-size: 0.78rem; color: var(--green); font-family: 'JetBrains Mono', monospace; background: rgba(0,157,108,.12); padding: 3px 10px; border-radius: 4px; border: 1px solid rgba(0,157,108,.25); margin-bottom: 12px; }
|
|
195
|
-
|
|
196
187
|
/* ---- GRID ---- */
|
|
197
188
|
.grid-2 { display: grid; grid-template-columns: 1fr 1fr; gap: 18px; margin-bottom: 24px; }
|
|
198
189
|
@media(max-width: 900px) { .grid-2 { grid-template-columns: 1fr; } }
|
|
199
|
-
|
|
200
190
|
/* ---- DIR TREE ---- */
|
|
201
191
|
.tree { background: var(--code-bg); border: 1px solid var(--border); border-radius: 8px; padding: 22px 24px; font-family: 'JetBrains Mono', monospace; font-size: 0.875rem; line-height: 1.9; white-space: pre; overflow-x: auto; }
|
|
202
192
|
.tree .dir { color: var(--blue); font-weight: 600; }
|
|
@@ -204,7 +194,6 @@
|
|
|
204
194
|
.tree .note { color: #8b949e; }
|
|
205
195
|
.tree .warn { color: var(--yellow); }
|
|
206
196
|
.tree .safe { color: var(--green); }
|
|
207
|
-
|
|
208
197
|
/* ---- STEP LIST ---- */
|
|
209
198
|
.steps { counter-reset: step; list-style: none; margin: 0 0 24px; padding: 0; }
|
|
210
199
|
.steps li { counter-increment: step; display: flex; gap: 18px; margin-bottom: 20px; }
|
|
@@ -220,17 +209,14 @@
|
|
|
220
209
|
font-weight: 700; font-size: 0.85rem;
|
|
221
210
|
margin-top: 2px;
|
|
222
211
|
}
|
|
223
|
-
|
|
224
212
|
/* ---- SIGNATURE TABLE ---- */
|
|
225
213
|
.sig-table { width: 100%; border-collapse: collapse; margin: 16px 0 24px; font-size: 0.87rem; }
|
|
226
214
|
.sig-table th { text-align: left; padding: 10px 14px; background: var(--surface-2); color: var(--muted); font-weight: 600; border-bottom: 1px solid var(--border); }
|
|
227
215
|
.sig-table td { padding: 10px 14px; border-bottom: 1px solid rgba(48,54,61,.5); vertical-align: top; }
|
|
228
216
|
.sig-table td:first-child { font-family: 'JetBrains Mono', monospace; color: var(--yellow); white-space: nowrap; }
|
|
229
217
|
.sig-table td:last-child { color: var(--muted); }
|
|
230
|
-
|
|
231
218
|
/* ---- SCROLL SPY ---- */
|
|
232
219
|
header#page-header { margin-bottom: 52px; }
|
|
233
|
-
|
|
234
220
|
.table-wrapper {
|
|
235
221
|
width: 100%;
|
|
236
222
|
overflow-x: auto;
|
|
@@ -241,7 +227,6 @@
|
|
|
241
227
|
margin-bottom: 0; /* Override default table margin if any */
|
|
242
228
|
white-space: nowrap; /* Keep table cells on one line for better scroll */
|
|
243
229
|
}
|
|
244
|
-
|
|
245
230
|
@media(max-width: 900px) {
|
|
246
231
|
body { flex-direction: column; }
|
|
247
232
|
.sidebar { position: relative; width: 100%; height: auto; border-right: none; border-bottom: 1px solid var(--border); padding: 20px; z-index: 10; }
|
|
@@ -255,7 +240,7 @@
|
|
|
255
240
|
</style>
|
|
256
241
|
</head>
|
|
257
242
|
<body>
|
|
258
|
-
|
|
243
|
+
BARRA LATERAL
|
|
259
244
|
<aside class="sidebar">
|
|
260
245
|
<div class="sb-logo">
|
|
261
246
|
<strong>ArtiFrame</strong>
|
|
@@ -268,86 +253,90 @@
|
|
|
268
253
|
<a href="#kurulum">Configuración</a>
|
|
269
254
|
<a href="#dizin">Estructura del directorio</a>
|
|
270
255
|
<div class="sb-cat">Arquitectónico</div>
|
|
256
|
+
<a href="#v2-routing">Enrutamiento sin configuración (v2.0)</a>
|
|
271
257
|
<a href="#bootstrapper">Arquitectura previa</a>
|
|
272
258
|
<a href="#kurallar">Conjunto de reglas</a>
|
|
273
259
|
<div class="sb-cat">Herramienta CLI</div>
|
|
274
|
-
<a href="#cli-giris">
|
|
275
|
-
<a href="#cli-new">
|
|
276
|
-
<a href="#cli-
|
|
277
|
-
<a href="#cli-
|
|
278
|
-
<a href="#cli-
|
|
279
|
-
|
|
280
|
-
<a href="#cli-
|
|
281
|
-
<a href="#cli-
|
|
282
|
-
<a href="#cli-
|
|
283
|
-
<a href="#cli-
|
|
284
|
-
<a href="#cli-
|
|
285
|
-
<a href="#cli-
|
|
286
|
-
<a href="#cli-
|
|
287
|
-
|
|
288
|
-
<a href="#cli-
|
|
260
|
+
<a href="#cli-giris">Introducción a la CLI</a>
|
|
261
|
+
<a href="#cli-new">nuevo</a>
|
|
262
|
+
<a href="#cli-upgrade">mejora</a>
|
|
263
|
+
<a href="#cli-view">hacer:ver</a>
|
|
264
|
+
<a href="#cli-api">hacer:api</a>
|
|
265
|
+
<a href="#cli-class">hacer: clase</a>
|
|
266
|
+
<a href="#cli-table">mesa:</a>
|
|
267
|
+
<a href="#cli-cliv">cliv</a>
|
|
268
|
+
<a href="#cli-show">espectáculo</a>
|
|
269
|
+
<a href="#cli-list">lista</a>
|
|
270
|
+
<a href="#cli-go">ir</a>
|
|
271
|
+
<a href="#cli-remove">eliminar</a>
|
|
272
|
+
<a href="#cli-version">versión</a>
|
|
273
|
+
<a href="#cli-mode">modo</a>
|
|
274
|
+
<a href="#cli-serve">atender</a>
|
|
275
|
+
<a href="#cli-auth">autenticación</a>
|
|
276
|
+
<a href="#cli-suggest">sugerir</a>
|
|
277
|
+
<a href="#cli-add">agregar</a>
|
|
289
278
|
<div class="sb-cat">Servicios Integrados</div>
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
<a href="#svc-stripe">
|
|
294
|
-
<a href="#svc-jwt">
|
|
295
|
-
<a href="#svc-image">
|
|
296
|
-
<a href="#svc-s3">AWS S3
|
|
279
|
+
<a href="#svc-qrcode">Código QR</a>
|
|
280
|
+
<a href="#svc-phpmailer">PHPMailer (correo)</a>
|
|
281
|
+
<a href="#svc-iyzico">Iyzico<span class="tag b-core" style="padding: 1px 5px; margin-left: 2px; font-weight: bold;" title="Servicio pago/con licencia">$</span></a>
|
|
282
|
+
<a href="#svc-stripe">Raya<span class="tag b-core" style="padding: 1px 5px; margin-left: 2px; font-weight: bold;" title="Servicio pago/con licencia">$</span></a>
|
|
283
|
+
<a href="#svc-jwt">J.W.T.</a>
|
|
284
|
+
<a href="#svc-image">Procesamiento de imágenes</a>
|
|
285
|
+
<a href="#svc-s3">AWS S3<span class="tag b-core" style="padding: 1px 5px; margin-left: 2px; font-weight: bold;" title="Servicio pago/con licencia">$</span></a>
|
|
297
286
|
<a href="#svc-redis">Redis</a>
|
|
298
|
-
<a href="#svc-pusher">
|
|
299
|
-
<a href="#svc-twilio">
|
|
300
|
-
<a href="#svc-sentry">
|
|
287
|
+
<a href="#svc-pusher">arribista<span class="tag b-core" style="padding: 1px 5px; margin-left: 2px; font-weight: bold;" title="Servicio pago/con licencia">$</span></a>
|
|
288
|
+
<a href="#svc-twilio">Gorjeo<span class="tag b-core" style="padding: 1px 5px; margin-left: 2px; font-weight: bold;" title="Servicio pago/con licencia">$</span></a>
|
|
289
|
+
<a href="#svc-sentry">centinela<span class="tag b-core" style="padding: 1px 5px; margin-left: 2px; font-weight: bold;" title="Servicio pago/con licencia">$</span></a>
|
|
301
290
|
<div class="sb-cat">Ver ayudantes</div>
|
|
302
|
-
<a href="#vh-display">
|
|
303
|
-
<a href="#vh-escapeurl">
|
|
304
|
-
<a href="#vh-csrf">
|
|
305
|
-
<a href="#vh-dates">
|
|
306
|
-
<a href="#vh-truncate">
|
|
307
|
-
<a href="#vh-activeclass">
|
|
308
|
-
<a href="#vh-formatsize">
|
|
309
|
-
<a href="#vh-maskemail">
|
|
310
|
-
<a href="#vh-maskphone">
|
|
311
|
-
<a href="#vh-slugify">
|
|
312
|
-
<a href="#vh-money">
|
|
313
|
-
|
|
291
|
+
<a href="#vh-display">mostrar()</a>
|
|
292
|
+
<a href="#vh-escapeurl">URL de escape()</a>
|
|
293
|
+
<a href="#vh-csrf">campocsrf()</a>
|
|
294
|
+
<a href="#vh-dates">Funciones de fecha</a>
|
|
295
|
+
<a href="#vh-truncate">truncar()</a>
|
|
296
|
+
<a href="#vh-activeclass">clase activa()</a>
|
|
297
|
+
<a href="#vh-formatsize">formatoTamaño()</a>
|
|
298
|
+
<a href="#vh-maskemail">máscaraCorreo electrónico()</a>
|
|
299
|
+
<a href="#vh-maskphone">máscaraTeléfono()</a>
|
|
300
|
+
<a href="#vh-slugify">slugificar()</a>
|
|
301
|
+
<a href="#vh-money">dinero()</a>
|
|
302
|
+
<a href="#vh-uuid">UUID()</a>
|
|
314
303
|
<div class="sb-cat">Ayudantes del sistema</div>
|
|
315
304
|
<div class="sb-subcat">Respuesta y depuración</div>
|
|
316
|
-
<a href="#sh-apiresponse">
|
|
317
|
-
<a href="#sh-json">
|
|
318
|
-
<a href="#sh-redirect">
|
|
305
|
+
<a href="#sh-apiresponse">apiRespuesta()</a>
|
|
306
|
+
<a href="#sh-json">jsonRespuesta()</a>
|
|
307
|
+
<a href="#sh-redirect">redirigir()</a>
|
|
319
308
|
<a href="#sh-dd">dd()</a>
|
|
320
309
|
<div class="sb-subcat">Seguridad CSRF</div>
|
|
321
|
-
<a href="#sh-generatecsrf">
|
|
322
|
-
<a href="#sh-csrf">
|
|
310
|
+
<a href="#sh-generatecsrf">generarCsrf()</a>
|
|
311
|
+
<a href="#sh-csrf">verificarCsrf()</a>
|
|
323
312
|
<div class="sb-subcat">Desinfectar y validar</div>
|
|
324
|
-
<a href="#sh-sanitizeint">
|
|
325
|
-
<a href="#sh-sanitizefloat">
|
|
326
|
-
<a href="#sh-sanitizestring">
|
|
327
|
-
<a href="#sh-sanitizeemail">
|
|
328
|
-
<a href="#sh-verifyemail">
|
|
313
|
+
<a href="#sh-sanitizeint">sanitizarInt()</a>
|
|
314
|
+
<a href="#sh-sanitizefloat">desinfectarFloat()</a>
|
|
315
|
+
<a href="#sh-sanitizestring">desinfectarString()</a>
|
|
316
|
+
<a href="#sh-sanitizeemail">desinfectarcorreo electrónico()</a>
|
|
317
|
+
<a href="#sh-verifyemail">verificarcorreo electrónico()</a>
|
|
329
318
|
<div class="sb-subcat">Solicitud HTTP</div>
|
|
330
|
-
<a href="#sh-ispost">
|
|
331
|
-
<a href="#sh-isget">
|
|
332
|
-
<a href="#sh-isput">
|
|
333
|
-
<a href="#sh-isdelete">
|
|
334
|
-
<a href="#sh-isajax">
|
|
335
|
-
<a href="#sh-getclientip">
|
|
319
|
+
<a href="#sh-ispost">espublicar()</a>
|
|
320
|
+
<a href="#sh-isget">esObtener()</a>
|
|
321
|
+
<a href="#sh-isput">esPut()</a>
|
|
322
|
+
<a href="#sh-isdelete">es eliminar()</a>
|
|
323
|
+
<a href="#sh-isajax">esAjax()</a>
|
|
324
|
+
<a href="#sh-getclientip">obtenerIpCliente()</a>
|
|
336
325
|
<div class="sb-subcat">Autenticación</div>
|
|
337
|
-
<a href="#sh-generatetoken">
|
|
338
|
-
<a href="#sh-hashpassword">
|
|
339
|
-
<a href="#sh-verifypassword">
|
|
326
|
+
<a href="#sh-generatetoken">generarToken()</a>
|
|
327
|
+
<a href="#sh-hashpassword">hashContraseña()</a>
|
|
328
|
+
<a href="#sh-verifypassword">verificar contraseña()</a>
|
|
340
329
|
<div class="sb-subcat">Utilidades de datos</div>
|
|
341
|
-
<a href="#sh-slugify">
|
|
342
|
-
<a href="#sh-arrayonly">
|
|
330
|
+
<a href="#sh-slugify">slugificar()</a>
|
|
331
|
+
<a href="#sh-arrayonly">solomatriz()</a>
|
|
343
332
|
<div class="sb-subcat">Generación de identificación y utilidades</div>
|
|
344
|
-
<a href="#sh-byteid">
|
|
345
|
-
<a href="#sh-makeid">
|
|
346
|
-
<a href="#sh-formatid">
|
|
347
|
-
<a href="#sh-intid">
|
|
333
|
+
<a href="#sh-byteid">ID de byte()</a>
|
|
334
|
+
<a href="#sh-makeid">hacerId()</a>
|
|
335
|
+
<a href="#sh-formatid">identificador de formato()</a>
|
|
336
|
+
<a href="#sh-intid">identificadorint()</a>
|
|
348
337
|
<a href="#sh-bigintid">bigintId()</a>
|
|
349
|
-
<a href="#sh-stringer">
|
|
350
|
-
|
|
338
|
+
<a href="#sh-stringer">larguero()</a>
|
|
339
|
+
<a href="#sh-otpcoder">Codificador OTP</a>
|
|
351
340
|
<div class="sb-cat">Seguridad API</div>
|
|
352
341
|
<a href="#api-methods">Control del método HTTP</a>
|
|
353
342
|
<a href="#api-cors">CORS</a>
|
|
@@ -356,17 +345,17 @@
|
|
|
356
345
|
<a href="#workflow">Flujo de trabajo completo</a>
|
|
357
346
|
</nav>
|
|
358
347
|
</aside>
|
|
359
|
-
|
|
348
|
+
CONTENIDO PRINCIPAL
|
|
360
349
|
<main class="content">
|
|
361
|
-
|
|
350
|
+
====== INICIAR SESIÓN ======
|
|
362
351
|
<header id="page-header">
|
|
363
|
-
<h1>ArtiFrame
|
|
352
|
+
<h1>ArtiFrame<span>Documentación</span></h1>
|
|
364
353
|
<p class="lead">Marco para proyectos PHP nativos escalables administrados sin dependencias externas, reglas estrictas y una potente CLI. Sin dependencias, un ecosistema ligero y rápido libre de sopa de paquetes de compositores, lo que le permite centrarse en su lógica empresarial.</p>
|
|
365
354
|
</header>
|
|
366
|
-
|
|
355
|
+
====== INTRODUCCIÓN Y FILOSOFÍA ======
|
|
367
356
|
<section id="giris">
|
|
368
357
|
<h2>Introducción y Filosofía</h2>
|
|
369
|
-
<p>marco artístico
|
|
358
|
+
<p>marco artístico,<strong>"Convención sobre configuración"</strong>Se basa en el principio de (Reglas antes de la configuración). El poder de un marco no proviene de la riqueza de las herramientas que ofrece, sino de la coherencia del orden que establece.</p>
|
|
370
359
|
<div class="grid-2">
|
|
371
360
|
<div class="card highlight">
|
|
372
361
|
<h3>Cero gastos generales</h3>
|
|
@@ -378,32 +367,30 @@
|
|
|
378
367
|
</div>
|
|
379
368
|
<div class="card highlight">
|
|
380
369
|
<h3>Conjunto de reglas estrictas</h3>
|
|
381
|
-
<p>Un desarrollador junior que acaba de unirse al proyecto
|
|
370
|
+
<p>Un desarrollador junior que acaba de unirse al proyecto,<code class="ic">data-js</code>Entiende la arquitectura y la estructura de directorios en minutos. La compatibilidad del equipo está garantizada a nivel de marco.</p>
|
|
382
371
|
</div>
|
|
383
372
|
<div class="card highlight">
|
|
384
373
|
<h3>Prioridad CLI</h3>
|
|
385
|
-
<p>No es necesario crear manualmente archivos de vista, API o clase. La CLI genera archivos resguardo,
|
|
374
|
+
<p>No es necesario crear manualmente archivos de vista, API o clase. La CLI genera archivos resguardo, establece vínculos de activos y mantiene la coherencia del proyecto.</p>
|
|
386
375
|
</div>
|
|
387
376
|
</div>
|
|
388
377
|
<div class="alert a-info">
|
|
389
|
-
<strong>💡 Filosofía de las Adicciones:</strong>
|
|
390
|
-
</div>
|
|
378
|
+
<strong>💡 Filosofía de las Adicciones:</strong>Al crear un nuevo proyecto, se instalan paquetes de compositores estándar mundial como phpmailer, redis, ramsey/uuid. Sin embargo, el núcleo de ArtiFrame no depende de ellos. Puedes eliminarlo cuando quieras, descargar tus propios paquetes y reescribir tus funciones de acuerdo con tu propia arquitectura. ArtiFrame preserva su libertad arquitectónica al tiempo que reduce la dependencia externa a cero.</div>
|
|
391
379
|
<div class="alert a-info">
|
|
392
|
-
<strong>ℹ️ Licencia AGPLv3:</strong>
|
|
393
|
-
</div>
|
|
380
|
+
<strong>ℹ️ Licencia AGPLv3:</strong>ArtiFrame es de código abierto. Las obras derivadas que usted produzca se pueden utilizar libremente, siempre que el código fuente permanezca abierto. El aviso de derechos de autor no se puede eliminar.</div>
|
|
394
381
|
</section>
|
|
395
|
-
|
|
382
|
+
====== LICENCIA Y USO ======
|
|
396
383
|
<section id="lisans">
|
|
397
384
|
<h2>Licencia y términos de uso</h2>
|
|
398
385
|
<p>ArtiFrame es un framework de código abierto con licencia AGPLv3. Sin embargo, se han diseñado escenarios de uso flexibles para que los desarrolladores puedan comercializar sus proyectos y venderlos como código cerrado.</p>
|
|
399
386
|
<div class="grid-2">
|
|
400
387
|
<div class="card highlight" style="border-left-color: var(--green);">
|
|
401
388
|
<h3>🗽 Özgür Ticaret (Proyectos de usuario final)</h3>
|
|
402
|
-
<p>En las webs de tus clientes, paneles internos B2B, infraestructuras de E-Commerce o cualquier proyecto SaaS/PaaS que sirva al usuario final
|
|
389
|
+
<p>En las webs de tus clientes, paneles internos B2B, infraestructuras de E-Commerce o cualquier proyecto SaaS/PaaS que sirva al usuario final.<strong>eres libre</strong>Puede ocultar su código, venderlo y protegerlo con derechos de autor.</p>
|
|
403
390
|
</div>
|
|
404
391
|
<div class="card highlight" style="border-left-color: var(--yellow);">
|
|
405
392
|
<h3>🔄 Bifurcación y nuevo marco</h3>
|
|
406
|
-
<p>Los archivos principales de ArtiFrame (<code>bin/</code>
|
|
393
|
+
<p>Los archivos principales de ArtiFrame (<code>bin/</code>Y<code>app/</code>) Si está produciendo un nuevo marco, infraestructura CMS o herramienta de codificación para usted o para otros, también puede utilizar este nuevo producto.<strong>Código abierto</strong>Tienes que publicarlo como .</p>
|
|
407
394
|
</div>
|
|
408
395
|
<div class="card highlight" style="border-left-color: var(--red); grid-column: span 2;">
|
|
409
396
|
<h3>⚖️ Situación de aplicación e infracción legal</h3>
|
|
@@ -417,11 +404,11 @@
|
|
|
417
404
|
<button class="tab-btn active" onclick="switchTab('tab-enduser', this)" style="white-space: nowrap; padding: 10px 20px; background: #00c88c; color: #000; font-weight: 600; border: none; border-radius: 5px; cursor: pointer;">Proyecto de usuario final</button>
|
|
418
405
|
<button class="tab-btn" onclick="switchTab('tab-core', this)" style="white-space: nowrap; padding: 10px 20px; background: #1c2128; color: #fff; border: 1px solid #30363d; border-radius: 5px; cursor: pointer;">Cambio central (marco/CMS)</button>
|
|
419
406
|
</div>
|
|
420
|
-
|
|
407
|
+
pestaña 1
|
|
421
408
|
<div class="tab-content" id="tab-enduser" style="display: block;">
|
|
422
409
|
<div class="card highlight" style="border-left-color: var(--green);">
|
|
423
410
|
<h3>✅ Eres completamente libre</h3>
|
|
424
|
-
<p>Si utiliza la infraestructura ArtiFrame en los sitios web de sus clientes, paneles internos B2B, infraestructuras de comercio electrónico o proyectos SaaS
|
|
411
|
+
<p>Si utiliza la infraestructura ArtiFrame en los sitios web de sus clientes, paneles internos B2B, infraestructuras de comercio electrónico o proyectos SaaS<strong>No está sujeto a ninguna restricción de licencia.</strong></p>
|
|
425
412
|
<ul>
|
|
426
413
|
<li>Puede cifrar y ocultar su código.</li>
|
|
427
414
|
<li>Puedes vender tu proyecto al precio que quieras.</li>
|
|
@@ -429,11 +416,10 @@
|
|
|
429
416
|
</ul>
|
|
430
417
|
</div>
|
|
431
418
|
</div>
|
|
432
|
-
|
|
419
|
+
pestaña 2
|
|
433
420
|
<div class="tab-content" id="tab-core" style="display: none;">
|
|
434
421
|
<div class="alert a-info">
|
|
435
|
-
<strong>ℹ️ Modificación del kernel:</strong>
|
|
436
|
-
</div>
|
|
422
|
+
<strong>ℹ️ Modificación del kernel:</strong>Los propios códigos fuente de ArtiFrame (<code>bin/</code>Y<code>app/</code>) y cambiar esto<strong>un nuevo marco, CMS o herramienta de codificación</strong>Si utiliza as , se aplica el siguiente árbol de decisión:</div>
|
|
437
423
|
<div class="card" style="padding: 0; overflow-x: auto; background: #0d1117; border-radius: 10px;">
|
|
438
424
|
<canvas height="520" id="licenseCanvasCore" style="min-width: 800px; display: block;" width="1200"></canvas>
|
|
439
425
|
</div>
|
|
@@ -448,87 +434,61 @@
|
|
|
448
434
|
el.style.border = '1px solid #30363d';
|
|
449
435
|
el.style.fontWeight = '400';
|
|
450
436
|
});
|
|
451
|
-
|
|
452
437
|
document.getElementById(tabId).style.display = 'block';
|
|
453
|
-
|
|
454
438
|
btn.style.background = tabId === 'tab-enduser' ? '#00c88c' : '#58a6ff';
|
|
455
439
|
btn.style.color = '#000';
|
|
456
440
|
btn.style.fontWeight = '600';
|
|
457
441
|
btn.style.border = 'none';
|
|
458
442
|
}
|
|
459
443
|
</script>
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
</section>
|
|
469
|
-
<!-- ====== KURULUM ====== -->
|
|
444
|
+
<h3 style="margin-top: 30px;">Comandos adicionales</h3>
|
|
445
|
+
<p><strong>Tablas de listado:</strong>Para ver todas las plantillas y descripciones de tablas disponibles:</p>
|
|
446
|
+
<pre><code>artiframe> <span class="fn">mesa</span> <span class="st">lista</span></code></pre>
|
|
447
|
+
<p><strong>Vista previa del contenido de la tabla:</strong>una pintura<code>schema.sql</code>al final del comando para examinar el contenido de SQL en la terminal antes de agregarlo al archivo.<code>check</code>Puedes agregar el parámetro:</p>
|
|
448
|
+
<pre><code>artiframe> <span class="fn">mesa:</span><span class="st">usuarios</span> <span class="st">controlar</span></code></pre>
|
|
449
|
+
</section>
|
|
450
|
+
====== INSTALACIÓN ======
|
|
470
451
|
<section id="kurulum">
|
|
471
452
|
<h2>Configuración</h2>
|
|
472
453
|
<p>ArtiFrame CLI se instala como una herramienta PHP global. Instalado una vez, utilizado en cada proyecto.</p>
|
|
473
454
|
<h3>1. Instale la herramienta CLI globalmente</h3>
|
|
474
|
-
<pre><code><span class="cm">#
|
|
455
|
+
<pre><code><span class="cm"># Instalación global a través de NPM</span>
|
|
475
456
|
npm install -g @artilingo/artiframe-cli
|
|
476
|
-
|
|
477
|
-
<span class="cm"># Kurulumu doğrula</span>
|
|
457
|
+
<span class="cm"># Verificar la instalación</span>
|
|
478
458
|
artiframe</code></pre>
|
|
479
459
|
<h3>2. Shell interactivo</h3>
|
|
480
|
-
<p>Solo a la terminal
|
|
460
|
+
<p>Solo a la terminal<code class="ic">artiframe</code>Escríbelo y presiona Enter. CLI no se cierra; Se abre un shell interactivo que escucha constantemente los comandos:</p>
|
|
481
461
|
<pre><code>==================================================
|
|
482
462
|
ArtiFrame CLI Interactive Shell v1.0.0
|
|
483
463
|
==================================================
|
|
484
464
|
Type 'help' for commands, or 'exit' to quit.
|
|
485
|
-
|
|
486
465
|
artiframe> </code></pre>
|
|
487
466
|
<h3>3. Iniciar un nuevo proyecto</h3>
|
|
488
467
|
<pre><code>artiframe> new benim-projem</code></pre>
|
|
489
|
-
<p>este comando
|
|
468
|
+
<p>este comando<code class="ic">benim-projem/</code>directorio y copia toda la estructura del esqueleto en él:<code class="ic">app/</code>, <code class="ic">bin/</code>, <code class="ic">config/</code>, <code class="ic">public/</code>, <code class="ic">src/</code>, <code class="ic">.env.example</code>y primero<code class="ic">index.php</code>página.</p>
|
|
490
469
|
<h3>4. Configuración del entorno</h3>
|
|
491
470
|
<pre><code>cp .env.example .env</code></pre>
|
|
492
|
-
<p><code class="ic">.env</code>
|
|
471
|
+
<p><code class="ic">.env</code>Abra su archivo y complete la base de datos y la información de la solicitud. Este archivo nunca entra en control de versiones.</p>
|
|
493
472
|
<div class="alert a-warn">
|
|
494
|
-
<strong>⚠️ Configuración del servidor web:</strong>
|
|
495
|
-
</div>
|
|
473
|
+
<strong>⚠️ Configuración del servidor web:</strong>Raíz del documento de Apache/Nginx<code class="ic">/public/</code>redirigir a la carpeta. Otros directorios nunca deben estar abiertos al exterior.</div>
|
|
496
474
|
</section>
|
|
497
|
-
|
|
475
|
+
====== ESTRUCTURA DEL DIRECTORIO ======
|
|
498
476
|
<section id="dizin">
|
|
499
477
|
<h2>Estructura del directorio</h2>
|
|
500
478
|
<p>La arquitectura creada cuando se inició el proyecto; Proporciona una clara separación de responsabilidades (SoC).</p>
|
|
501
479
|
<div class="tree">
|
|
502
480
|
<span class="dir">nombre-proyecto/</span>
|
|
503
|
-
├── <span class="dir">aplicación/</span> <span class="note"># Capa de infraestructura</span>
|
|
504
|
-
│ ├── <span class="file">VerControl.php</span> <span class="note"># Ver programa previo (página HTML)</span>
|
|
505
|
-
│ ├── <span class="file">ApiControl.php</span> <span class="note"># Arrancador de punto final API</span>
|
|
506
|
-
│ ├── <span class="file">base de datos.php</span> <span class="note"># Conexión de base de datos basada en PDO</span>
|
|
507
|
-
│ ├── <span class="file">DotEnv.php</span> <span class="note"># lector .env</span>
|
|
508
|
-
│ └── <span class="file">R2Manager.php</span> <span class="note"># Administrador de archivos Cloudflare R2</span>
|
|
481
|
+
├── <span class="dir">aplicación/</span> <span class="note"># Capa de infraestructura</span>│ ├──<span class="file">VerControl.php</span> <span class="note"># Ver programa previo (página HTML)</span>│ ├──<span class="file">ApiControl.php</span> <span class="note"># Arrancador de punto final API</span>│ ├──<span class="file">base de datos.php</span> <span class="note"># Conexión de base de datos basada en PDO</span>│ └──<span class="file">DotEnv.php</span> <span class="note"># lector .env</span>
|
|
509
482
|
│
|
|
510
|
-
├── <span class="dir warn">mil/</span> <span class="note"># ⚠️ Sistema principal: no editar directamente</span>
|
|
511
|
-
│ ├── <span class="file">MétodoSistema.php</span> <span class="note"># API/ayudantes globales de backend</span>
|
|
512
|
-
│ ├── <span class="file">VerMetodo.php</span> <span class="note"># Ver/frontend ayudantes globales</span>
|
|
513
|
-
│ └── <span class="dir">talones/</span> <span class="note"># Archivos de plantilla utilizados por CLI</span>
|
|
514
|
-
│ ├── ver.stub
|
|
483
|
+
├── <span class="dir warn">mil/</span> <span class="note"># ⚠️ Sistema principal: no editar directamente</span>│ ├──<span class="file">MétodoSistema.php</span> <span class="note"># API/ayudantes globales de backend</span>│ ├──<span class="file">VerMetodo.php</span> <span class="note"># Ver/frontend ayudantes globales</span>│ └──<span class="dir">talones/</span> <span class="note"># Archivos de plantilla utilizados por CLI</span>│ ├── ver.stub
|
|
515
484
|
│ ├── api-estándar.stub
|
|
516
485
|
│ ├── api-switch-case.stub
|
|
517
486
|
│ └── clase.stub
|
|
518
487
|
│
|
|
519
|
-
|
|
520
|
-
│ └── <span class="file">versión-aplicación.php</span> <span class="note"># Constantes APP_VERSION y APP_ENV</span>
|
|
488
|
+
├──<span class="dir">configuración/</span> <span class="note"># Archivos de configuración</span>│ └──<span class="file">versión-aplicación.php</span> <span class="note"># Constantes APP_VERSION y APP_ENV</span>
|
|
521
489
|
│
|
|
522
|
-
├── <span class="dir">público/</span> <span class="note"># ← El único directorio abierto del servidor web.</span>
|
|
523
|
-
│
|
|
524
|
-
│ │ ├── <span class="dir">css/</span> <span class="note"># Ver archivos CSS específicos</span>
|
|
525
|
-
│ │ └── <span class="dir">js/</span> <span class="note"># Ver archivos JS específicos</span>
|
|
526
|
-
│ ├── <span class="dir">incluye/</span> <span class="note"># Componentes compartidos</span>
|
|
527
|
-
│ │ ├── cabeza.php
|
|
528
|
-
│ │ ├── encabezado.php
|
|
529
|
-
│ │ └── pie de página.php
|
|
530
|
-
│ ├── <span class="dir">API/</span> <span class="note"># archivos de punto final API</span>
|
|
531
|
-
│ └── <span class="file">index.php</span> <span class="note"># Página de inicio</span>
|
|
490
|
+
├── <span class="dir">público/</span> <span class="note"># ← El único directorio abierto del servidor web.</span>│ ├──<span class="dir safe">activos/</span>│ │ ├──<span class="dir">css/</span> <span class="note"># Ver archivos CSS específicos</span>│ │ └──<span class="dir">js/</span> <span class="note"># Ver archivos JS específicos</span>│ ├──<span class="dir">incluye/</span> <span class="note"># Componentes compartidos</span>│ │ ├── cabeza.php
|
|
491
|
+
│ ├──<span class="file">cabeza.php</span>│ ├──<span class="file">encabezado.php</span>│ └──<span class="file">pie de página.php</span>│ ├──<span class="dir">API/</span> <span class="note"># archivos de punto final API</span>│ └──<span class="file">index.php</span> <span class="note"># Página de inicio</span>
|
|
532
492
|
│
|
|
533
493
|
├── <span class="dir">src/</span> <span class="note"># Lógica empresarial y clases.</span>
|
|
534
494
|
├── <span class="file">.env</span> <span class="note"># Variables de entorno (no incluidas en git)</span>
|
|
@@ -536,65 +496,128 @@ artiframe> </code></pre>
|
|
|
536
496
|
└── <span class="file">guía.html</span> <span class="note"># Este documento</span>
|
|
537
497
|
</div>
|
|
538
498
|
<div class="alert a-danger">
|
|
539
|
-
<strong>🚫 No toque el directorio bin/:</strong> <code class="ic">bin/</code>
|
|
540
|
-
</div>
|
|
499
|
+
<strong>🚫 No toque el directorio bin/:</strong> <code class="ic">bin/</code>Los archivos internos son el núcleo del marco. Aquí no se agrega la lógica empresarial específica del proyecto. Clases y servicios que agregarás<code class="ic">src/</code>Bajo componentes de infraestructura<code class="ic">app/</code>se encuentra debajo.</div>
|
|
541
500
|
</section>
|
|
542
|
-
|
|
501
|
+
====== V2.0 ENRUTAMIENTO Y ARQUITECTURA ======
|
|
502
|
+
<section id="v2-routing">
|
|
503
|
+
<h2>Enrutamiento sin configuración e innovaciones v2.0.0<span class="tag b-cli">NUEVO</span></h2>
|
|
504
|
+
<p class="lead">Con ArtiFrame v2.0.0, la estructura central del marco ha obtenido una arquitectura de enrutamiento basada en archivos "Zero-Config" mucho más liviana, rápida y fácil de usar para los desarrolladores.</p>
|
|
505
|
+
<h3>1. Enrutamiento automático basado en archivos (routeLink)</h3>
|
|
506
|
+
<p>A diferencia de los frameworks tradicionales, ArtiFrame permite la configuración individual para cada ruta (por ejemplo:<code>web.php</code>No quiere que le agregues una ruta. Todas las solicitudes<code>public/index.php</code>en el archivo<strong>a una única puerta de enlace</strong>caídas y<code>routeLink()</code>Se gestiona mágicamente a través del método.</p>
|
|
507
|
+
<div class="card highlight">
|
|
508
|
+
<h4>¿Cómo funciona?</h4>
|
|
509
|
+
<p>Si desde el navegador<code>/kategori/elektronik/15</code>Si se ingresa la dirección, el sistema<code>DOCUMENT_ROOT</code>Busca en el directorio de abajo hacia arriba el archivo PHP coincidente más largo:</p>
|
|
510
|
+
<ol>
|
|
511
|
+
<li><code>/kategori/elektronik/15.php</code>(Extraviado)</li>
|
|
512
|
+
<li><code>/kategori/elektronik.php</code>(Extraviado)</li>
|
|
513
|
+
<li><code>/kategori.php</code>(¡Encontró!)</li>
|
|
514
|
+
</ol>
|
|
515
|
+
<p>Al ejecutar el archivo coincidente, los fragmentos de URL restantes se eliminan automáticamente.<code>$_GET</code>convertido a parámetros:</p>
|
|
516
|
+
<pre><code>$_GET['params'] = ['elektronik', '15'];
|
|
517
|
+
$_GET['param1'] = 'elektronik';
|
|
518
|
+
$_GET['param2'] = '15';</code></pre>
|
|
519
|
+
</div>
|
|
520
|
+
<div class="alert a-info">
|
|
521
|
+
<strong>💡 Compatibilidad con versiones anteriores (ID):</strong>Para no romper con los hábitos de las versiones antiguas.<code>$_GET['param1']</code>Siempre<code>$_GET['id']</code>También está sincronizado en . Así, directamente en las páginas de detalles<code>$_GET['id']</code>puedes usar</div>
|
|
522
|
+
<div class="card">
|
|
523
|
+
<h4>Enlace (a) ¿Cómo deben ser las etiquetas?</h4>
|
|
524
|
+
<p>En el nuevo sistema de enrutamiento, los parámetros de cadena de consulta de estilo antiguo (<code>?id=...&token=...</code>) en su lugar<strong>Limpiar URL</strong>Se utiliza la estructura. De esta manera, tus enlaces serán más legibles y amigables con el SEO.</p>
|
|
525
|
+
<pre><code><span class="cm"><!-- ❌ EDIFICIO ANTIGUO (No debe usarse) --></span>
|
|
526
|
+
<a href="user.php?id=123456&token=123j54m23k">Profili Gör</a>
|
|
527
|
+
|
|
528
|
+
<span class="cm"><!-- ✅ NUEVA ESTRUCTURA (Estándar ArtiFrame) --></span>
|
|
529
|
+
<a href="/user/123456/123j54m23k">Profili Gör</a></code></pre>
|
|
530
|
+
<p>En la nueva estructura anterior, acceder a los datos en la página correspondiente es bastante sencillo:</p>
|
|
531
|
+
<pre><code><span class="cm">// en público/usuario.php:</span>
|
|
532
|
+
$userId = sanitizeInt($_GET['param1']); <span class="cm">// 123456 (o $_GET['id'])</span>
|
|
533
|
+
$token = sanitizeString($_GET['param2']); <span class="cm">// 123j54m23k</span></code></pre>
|
|
534
|
+
</div>
|
|
535
|
+
<h3>2. Ayudantes globales</h3>
|
|
536
|
+
<p>En versiones anteriores<code>\Bin\SystemMethod::generateToken()</code>o<code>\Bin\ViewMethod::display()</code>Se requerían llamadas de espacios de nombres largos como este. Con v2.0.0, todas estas funciones están disponibles en el espacio de nombres global (<code>namespace { }</code>) fue incluido.</p>
|
|
537
|
+
<p>Ahora puedes llamarlo desde cualquier lugar de tu aplicación así:</p>
|
|
538
|
+
<pre><code>$token = generateToken();
|
|
539
|
+
echo display($user['name']);
|
|
540
|
+
echo csrfField();</code></pre>
|
|
541
|
+
<h3>3. Cambios estructurales (cambios importantes)</h3>
|
|
542
|
+
<div class="alert a-success">
|
|
543
|
+
<strong>🕊️ No más miedo a la refactorización:</strong>A diferencia de otros marcos, no experimentará crisis de "refactorización" que duren días en sus proyectos cuando se publiquen las actualizaciones principales de ArtiFrame.<code>artiframe new</code>Tan pronto como usted lo diga, todos los archivos principales de esa versión se copian a su proyecto. Las nuevas versiones lanzadas (por ejemplo, v3, v4) nunca interrumpirán sus proyectos existentes; Sigue funcionando de forma estable durante años, independientemente de los requisitos de la versión instalada en el proyecto.</div>
|
|
544
|
+
<div class="alert a-danger">
|
|
545
|
+
<strong>⚠️ Importante:</strong>En tus viejos proyectos<code>public/index.php</code>una página de bienvenida contenía HTML. A partir de v2.0.0<code>index.php</code>Es sólo un archivo de enrutador. El antiguo diseño de tu página de inicio ahora es el predeterminado<code>public/landing.php</code>Se ofrece vía. (Cuando llega una URL vacía, el sistema utiliza de forma predeterminada<code>landing.php</code>redirige al archivo).</div>
|
|
546
|
+
<p>También en nuevos proyectos<code>artiframe new</code>para que el sistema pueda retroceder automáticamente cuando lo ejecute.<code>public/404.php</code>Y<code>public/503.php</code>Se producen páginas de error.</p>
|
|
547
|
+
<div class="card">
|
|
548
|
+
<h4>Gestión inteligente de errores de API</h4>
|
|
549
|
+
<p>Si hay errores 404 (Página no encontrada) o 503 (Modo de mantenimiento)<strong>al punto final API</strong>(Por ejemplo<code>/api/user/get</code>) llega; En lugar de mostrar una página HTML al cliente HTTP (aplicación móvil, interfaz), el sistema establece el código de estado y crea automáticamente un estándar.<strong>Error JSON</strong>regresa. Esto garantiza que su API siempre pueda responder JSON sin fallar.</p>
|
|
550
|
+
<pre><code>{
|
|
551
|
+
"status": "error",
|
|
552
|
+
"message": "API Endpoint Not Found",
|
|
553
|
+
"data": []
|
|
554
|
+
}</code></pre>
|
|
555
|
+
<div class="alert a-warning" style="margin-top: 15px;">
|
|
556
|
+
<strong>💡 Nota: captura de errores de interfaz</strong><br/>El código de error (404, 503, etc.) no está incluido en los datos JSON, sino directamente en el estándar.<strong>En respuesta de red HTTP (código de estado)</strong>giratorio. De esta manera, puedes detectar errores en la capa de red sin tener que analizar el contenido JSON:</div>
|
|
557
|
+
<pre><code><span class="cm">// Obtener ejemplo de API:</span>
|
|
558
|
+
fetch('/api/user/get').then(response => {
|
|
559
|
+
if (!response.ok) {
|
|
560
|
+
console.error("HTTP Hatası:", response.status); <span class="cm">// 404 o 503</span>
|
|
561
|
+
}
|
|
562
|
+
});
|
|
563
|
+
|
|
564
|
+
<span class="cm">// Ejemplo de Axios:</span>
|
|
565
|
+
axios.get('/api/user/get').catch(error => {
|
|
566
|
+
console.error("HTTP Hatası:", error.response.status); <span class="cm">// 404 o 503</span>
|
|
567
|
+
});</code></pre>
|
|
568
|
+
</div>
|
|
569
|
+
</section>
|
|
570
|
+
====== BOTAS ======
|
|
543
571
|
<section id="bootstrapper">
|
|
544
|
-
<h2>Arquitectura previa
|
|
545
|
-
<p>ArtiFrame utiliza dos bootstrappers completamente independientes. esta arquitectura
|
|
572
|
+
<h2>Arquitectura previa<span class="tag b-core">Crítico</span></h2>
|
|
573
|
+
<p>ArtiFrame utiliza dos bootstrappers completamente independientes. esta arquitectura<strong>Problemas de encabezado HTML y vulnerabilidades de seguridad</strong>lo impide radicalmente.</p>
|
|
546
574
|
<div class="grid-2">
|
|
547
575
|
<div class="card highlight">
|
|
548
|
-
<h3><span class="badge b-view">
|
|
549
|
-
<p>Se utiliza para páginas HTML (ver archivos). Comienza la sesión
|
|
550
|
-
<pre><code><span class="cm">// public/
|
|
576
|
+
<h3><span class="badge b-view">vista</span>VerControl.php</h3>
|
|
577
|
+
<p>Se utiliza para páginas HTML (ver archivos). Comienza la sesión,<code class="ic">ViewMethod</code>Se instala.</p>
|
|
578
|
+
<pre><code><span class="cm">// public/profile.php — HACIA ARRIBA, antes de imprimir HTML</span>
|
|
551
579
|
<span class="kw"><?php</span>
|
|
552
|
-
<span class="fn">
|
|
580
|
+
<span class="fn">requerir_una vez</span> <span class="var">$_SERVIDOR</span>[<span class="st">'DOCUMENT_ROOT'</span>]
|
|
553
581
|
. <span class="st">'/../app/ViewControl.php'</span>;
|
|
554
|
-
<span class="kw">
|
|
582
|
+
<span class="kw">usar</span> Bin\ViewMethod;
|
|
555
583
|
<span class="kw">?></span>
|
|
556
584
|
<span class="kw"><!DOCTYPE html></span>
|
|
557
585
|
...</code></pre>
|
|
558
586
|
</div>
|
|
559
587
|
<div class="card highlight">
|
|
560
|
-
<h3><span class="badge b-api">API</span>
|
|
561
|
-
<p>Se utiliza para archivos de punto final API. Establece el encabezado JSON, realiza el control del método HTTP
|
|
562
|
-
<pre><code><span class="cm">//
|
|
588
|
+
<h3><span class="badge b-api">API</span>ApiControl.php</h3>
|
|
589
|
+
<p>Se utiliza para archivos de punto final API. Establece el encabezado JSON, realiza el control del método HTTP,<code class="ic">SystemMethod</code>Se instala.</p>
|
|
590
|
+
<pre><code><span class="cm">// público/api/usuario/getir.php</span>
|
|
563
591
|
<span class="kw"><?php</span>
|
|
564
|
-
<span class="cm">// $allowedMethods
|
|
565
|
-
<span class="var">$
|
|
566
|
-
|
|
567
|
-
<span class="fn">require_once</span> <span class="var">$_SERVER</span>[<span class="st">'DOCUMENT_ROOT'</span>]
|
|
592
|
+
<span class="cm">// $allowedMethods DEBEN definirse antes de requerir</span>
|
|
593
|
+
<span class="var">$métodos permitidos</span> = [<span class="st">'CONSEGUIR'</span>];
|
|
594
|
+
<span class="fn">requerir_una vez</span> <span class="var">$_SERVIDOR</span>[<span class="st">'DOCUMENT_ROOT'</span>]
|
|
568
595
|
. <span class="st">'/../app/ApiControl.php'</span>;
|
|
569
|
-
|
|
570
|
-
<span class="kw">use</span> Bin\SystemMethod;</code></pre>
|
|
596
|
+
<span class="kw">usar</span> Bin\SystemMethod;</code></pre>
|
|
571
597
|
</div>
|
|
572
598
|
</div>
|
|
573
599
|
<div class="alert a-danger">
|
|
574
|
-
<strong>🚫 ViewControl y ApiControl nunca se mezclan:</strong>
|
|
575
|
-
</div>
|
|
600
|
+
<strong>🚫 ViewControl y ApiControl nunca se mezclan:</strong>Si se requiere ViewControl para un archivo API, es posible que se devuelva el encabezado HTML en lugar del encabezado JSON y se dañará toda la respuesta de la API. Si se requiere ApiControl en una página HTML, la sesión no se iniciará y la página se interrumpirá.</div>
|
|
576
601
|
</section>
|
|
577
|
-
|
|
602
|
+
====== REGLAS ======
|
|
578
603
|
<section id="kurallar">
|
|
579
|
-
<h2>Conjunto de reglas
|
|
604
|
+
<h2>Conjunto de reglas<span class="tag b-core">Estándar</span></h2>
|
|
580
605
|
<div class="card">
|
|
581
|
-
<h3>Regla 1: Arquitectura data-js
|
|
582
|
-
<p>Los eventos de JavaScript nunca son
|
|
583
|
-
<pre><code><span class="cm"><!-- ❌
|
|
606
|
+
<h3>Regla 1: Arquitectura data-js<span class="badge b-sec">Crítico</span></h3>
|
|
607
|
+
<p>Los eventos de JavaScript nunca son<code class="ic">class</code>o<code class="ic">id</code>No se puede escuchar por encima de él. Estas son identidades visuales/de estilo. Todas las interacciones JS<code class="ic">data-js</code>Está gestionado por el atributo. JavaScript nunca falla cuando CSS elimina una clase.</p>
|
|
608
|
+
<pre><code><span class="cm"><!-- ❌ Antipatrón — no compatible --></span>
|
|
584
609
|
<button id="submitBtn" class="btn">Gönder</button>
|
|
585
610
|
<span class="cm">// JS: document.getElementById('submitBtn').addEventListener(...)</span>
|
|
586
|
-
|
|
587
|
-
<span class="
|
|
588
|
-
<button class="btn btn-primary" <span class="var">data-js</span>="login-submit">Gönder</button>
|
|
611
|
+
<span class="cm"><!-- ✅ Estándar ArtiFrame --></span>
|
|
612
|
+
<button class="btn btn-primary" <span class="var">datos-js</span>="login-submit">Gönder</button>
|
|
589
613
|
<span class="cm">// JS: document.querySelector('[data-js="login-submit"]').addEventListener(...)</span></code></pre>
|
|
590
614
|
</div>
|
|
591
615
|
<div class="card">
|
|
592
616
|
<h3>Regla 2: Arquitectura temática</h3>
|
|
593
|
-
<p>Modo y temas oscuro/claro
|
|
594
|
-
<pre><code><span class="cm"><!--
|
|
617
|
+
<p>Modo y temas oscuro/claro,<code class="ic"><html></code>de la etiqueta<code class="ic">data-theme</code>Y<code class="ic">data-mode</code>Se gestiona a través de sus atributos. No se utilizan clases de cuerpo.</p>
|
|
618
|
+
<pre><code><span class="cm"><!-- Etiqueta de apertura HTML de la plantilla view.stub --></span>
|
|
595
619
|
<html lang="tr" data-theme="default" data-mode="light">
|
|
596
|
-
|
|
597
|
-
<span class="cm">/* app.css içindeki tema tanımı */</span>
|
|
620
|
+
<span class="cm">/* definición del tema en app.css */</span>
|
|
598
621
|
html[data-theme="default"][data-mode="dark"] {
|
|
599
622
|
--bg-color: #0b0c0e;
|
|
600
623
|
--text-main: #ffffff;
|
|
@@ -606,80 +629,69 @@ html[data-theme="default"][data-mode="light"] {
|
|
|
606
629
|
</div>
|
|
607
630
|
<div class="card">
|
|
608
631
|
<h3>Regla 3: flujo de datos seguro</h3>
|
|
609
|
-
<p>Todos los datos provenientes de la base de datos se procesan antes de enviarse al DOM
|
|
632
|
+
<p>Todos los datos provenientes de la base de datos se procesan antes de enviarse al DOM.<code class="ic">display()</code>Está envuelto con. Todos los datos que llegan a la API se procesan antes de procesarse.<code class="ic">sanitizeString()</code>o<code class="ic">sanitizeInt()</code>Se limpia con .</p>
|
|
610
633
|
</div>
|
|
611
634
|
<div class="card">
|
|
612
635
|
<h3>Regla 4: Manejo de errores con APP_ENV</h3>
|
|
613
|
-
<p><code class="ic">.env</code>
|
|
614
|
-
<pre><code><span class="cm">//
|
|
615
|
-
define(<span class="st">'APP_ENV'</span>, (int)<span class="var">$_ENV</span>[<span class="st">'APP_ENV'</span>]); <span class="cm">// 1=
|
|
616
|
-
|
|
617
|
-
<span class="kw">if</span> (APP_ENV === <span class="nu">1</span>) {
|
|
636
|
+
<p><code class="ic">.env</code>en el archivo<code class="ic">APP_ENV</code>El valor determina la visibilidad del error. En producción, no se muestra ningún mensaje de error al usuario.</p>
|
|
637
|
+
<pre><code><span class="cm">//config/app-version.php</span>
|
|
638
|
+
define(<span class="st">'APP_ENV'</span>, (int)<span class="var">$_ENV</span>[<span class="st">'APP_ENV'</span>]); <span class="cm">// 1=Depurar, 0=Producción</span>
|
|
639
|
+
<span class="kw">si</span> (APP_ENV === <span class="nu">1</span>) {
|
|
618
640
|
ini_set(<span class="st">'display_errors'</span>, <span class="nu">1</span>);
|
|
619
641
|
error_reporting(E_ALL);
|
|
620
|
-
} <span class="kw">
|
|
642
|
+
} <span class="kw">demás</span> {
|
|
621
643
|
ini_set(<span class="st">'display_errors'</span>, <span class="nu">0</span>);
|
|
622
644
|
}</code></pre>
|
|
623
645
|
</div>
|
|
624
646
|
</section>
|
|
625
|
-
|
|
647
|
+
====== INICIAR SESIÓN CLI ======
|
|
626
648
|
<section id="cli-giris">
|
|
627
649
|
<h2>Ecosistema CLI</h2>
|
|
628
|
-
<p>ArtiFrame CLI al terminal
|
|
629
|
-
<pre><code><span class="cm">#
|
|
650
|
+
<p>ArtiFrame CLI al terminal<code class="ic">artiframe</code>Abre un shell interactivo cuando se escribe. Todos los comandos se ejecutan dentro de este shell. Los comandos también se pueden ejecutar una vez.</p>
|
|
651
|
+
<pre><code><span class="cm"># Modo interactivo (recomendado)</span>
|
|
630
652
|
artiframe
|
|
631
653
|
artiframe> make:view admin/kullanicilar.php
|
|
632
|
-
|
|
633
|
-
<span class="cm"># Tek seferlik mod</span>
|
|
654
|
+
<span class="cm"># Modo único</span>
|
|
634
655
|
artiframe make:view admin/kullanicilar.php</code></pre>
|
|
635
656
|
</section>
|
|
636
|
-
|
|
657
|
+
nuevo
|
|
637
658
|
<section id="cli-new">
|
|
638
|
-
<h2><code>new</code> <span class="tag b-cli">CLI
|
|
639
|
-
<p>Crea un nuevo proyecto ArtiFrame. Cuando se ejecuta este comando, se inicia un asistente interactivo y su proyecto
|
|
640
|
-
<pre><code>artiframe> <span class="fn">
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
<span class="kw">?</span> Package name (e.g. vendor/project) <span class="st">[artiframe/benim-projem]</span>:
|
|
650
|
-
<span class="kw">?</span> Description <span class="st">[ArtiFrame Core PHP Application]</span>:
|
|
659
|
+
<h2><code>new</code> <span class="tag b-cli">Comando CLI</span></h2>
|
|
660
|
+
<p>Crea un nuevo proyecto ArtiFrame. Cuando se ejecuta este comando, se inicia un asistente interactivo y su proyecto<code>composer.json</code>Le solicita la información básica requerida para su configuración (nombre del paquete, autor, tipo de licencia, etc.). Una vez que se copian todos los archivos, las dependencias se instalan automáticamente.</p>
|
|
661
|
+
<pre><code>artiframe> <span class="fn">nuevo</span> <span class="st">mi-proyecto</span>
|
|
662
|
+
<span class="cm">╔═════════════════════════ ═════════════════════════╗
|
|
663
|
+
║ Generador de proyectos ArtiFrame ║
|
|
664
|
+
╚═════════════════════════ ═════════════════════════╝
|
|
665
|
+
Proyecto: mi-proyecto
|
|
666
|
+
Ubicación: C:/artiframe/mi-proyecto</span>
|
|
667
|
+
<span class="kw">?</span> Package name (e.g. vendor/project) <span class="st">[artiframe/mi-proyecto]</span>:
|
|
668
|
+
<span class="kw">?</span> Description <span class="st">[Aplicación PHP ArtiFrame Core]</span>:
|
|
651
669
|
<span class="kw">?</span> Author name <span class="st">[Artilingo]</span>:
|
|
652
670
|
<span class="kw">?</span> Author homepage <span class="st">[https://artilingo.com]</span>:
|
|
653
|
-
<span class="kw">?</span> Type (project, library, composer-plugin) <span class="st">[
|
|
654
|
-
<span class="kw">?</span> License (AGPL-3.0-or-later, MIT, Apache-2.0, GPL-2.0-or-later, GPL-3.0-or-later, BSD-2-Clause, BSD-3-Clause, ISC, proprietary, none) <span class="st">[AGPL-3.0
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
│
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
<span class="cm">Installing dependencies from lock file (including require-dev)...</span>
|
|
678
|
-
|
|
679
|
-
<span class="cm"> ╔══════════════════════════════════════════════════╗
|
|
680
|
-
║ Tebrikler! Proje başarıyla oluşturuldu. ║
|
|
681
|
-
╚══════════════════════════════════════════════════╝</span>
|
|
682
|
-
|
|
671
|
+
<span class="kw">?</span> Type (project, library, composer-plugin) <span class="st">[proyecto]</span>:
|
|
672
|
+
<span class="kw">?</span> License (AGPL-3.0-or-later, MIT, Apache-2.0, GPL-2.0-or-later, GPL-3.0-or-later, BSD-2-Clause, BSD-3-Clause, ISC, proprietary, none) <span class="st">[AGPL-3.0 o posterior]</span>:
|
|
673
|
+
<span class="cm">┌──────────────────────── ─────────────────────────┐
|
|
674
|
+
│ 📂 Fase 1/4 — Copiando... │
|
|
675
|
+
│ Archivos a Procesar: 42 Piezas │
|
|
676
|
+
└──────────────────────── ─────────────────────────┘
|
|
677
|
+
[████████████████████] 100% (42/42) docs/guide.html...
|
|
678
|
+
┌──────────────────────── ─────────────────────────┐
|
|
679
|
+
│ 📂 Fase 2/4 — Creación de directorios... │
|
|
680
|
+
│ Archivos a Procesar: 10 Piezas │
|
|
681
|
+
└──────────────────────── ─────────────────────────┘
|
|
682
|
+
[████████████████████] 100% (52/52) público/activos/imágenes/...
|
|
683
|
+
┌──────────────────────── ─────────────────────────┐
|
|
684
|
+
│ 📂 Fase 3/4 — Generando archivos dinámicos... │
|
|
685
|
+
│ Archivos a Procesar: 14 Piezas │
|
|
686
|
+
└──────────────────────── ─────────────────────────┘
|
|
687
|
+
[████████████████████] 100% (66/66) .agentes/AGENTES.md...
|
|
688
|
+
┌──────────────────────── ─────────────────────────┐
|
|
689
|
+
│ 📦 Fase 4/4 — Instalación de dependencias (Composer)│
|
|
690
|
+
└──────────────────────── ─────────────────────────┘</span>
|
|
691
|
+
<span class="cm">Instalando dependencias desde el archivo de bloqueo (incluido require-dev)...</span>
|
|
692
|
+
<span class="cm">╔═════════════════════════ ═════════════════════════╗
|
|
693
|
+
║ ¡Felicitaciones! El proyecto ha sido creado exitosamente. ║
|
|
694
|
+
╚═════════════════════════ ═════════════════════════╝</span>
|
|
683
695
|
📂 benim-projem/
|
|
684
696
|
│ ├── 📂 bin/
|
|
685
697
|
│ ├── 📂 config/
|
|
@@ -693,247 +705,238 @@ artiframe make:view admin/kullanicilar.php</code></pre>
|
|
|
693
705
|
│ └── 📄 kilavuz.html [125 KB]
|
|
694
706
|
│
|
|
695
707
|
Sonraki Adım: Lütfen .env dosyasındaki ortam değişkenlerini yapılandırın.
|
|
696
|
-
|
|
697
708
|
</code></pre>
|
|
698
|
-
<p>Una vez creado el proyecto, ArtiFrame CLI lo ejecuta por usted
|
|
709
|
+
<p>Una vez creado el proyecto, ArtiFrame CLI lo ejecuta por usted.<strong>abre automáticamente una nueva ventana de terminal</strong>, va a ese directorio y reinicia la herramienta enfocada en ese proyecto. Puede cerrar la antigua ventana de terminal.</p>
|
|
699
710
|
<p>Estructura esquelética creada:</p>
|
|
700
|
-
<div class="tree" style="font-size:0.82rem; line-height:1.7">
|
|
701
|
-
nombre-proyecto/
|
|
711
|
+
<div class="tree" style="font-size:0.82rem; line-height:1.7">nombre-proyecto/
|
|
702
712
|
├── aplicación/ (ViewControl.php, ApiControl.php, Database.php, DotEnv.php)
|
|
703
713
|
├── bin/ (SystemMethod.php, ViewMethod.php, stubs/)
|
|
704
714
|
├── config/ (versión-aplicación.php)
|
|
705
715
|
├── público/ (index.php, activos/, incluye/, api/)
|
|
706
716
|
├── src/
|
|
707
717
|
├── .env.ejemplo
|
|
708
|
-
└── guía.html
|
|
709
|
-
|
|
718
|
+
└── guía.html</div>
|
|
719
|
+
</section>
|
|
720
|
+
mejora
|
|
721
|
+
<section id="cli-upgrade">
|
|
722
|
+
<h2><code>upgrade</code> <span class="tag b-cli">Comando CLI</span></h2>
|
|
723
|
+
<p>Le permite integrar de forma segura nuevas funciones en la herramienta ArtiFrame CLI que ha actualizado globalmente a través de NPM en su proyecto existente.</p>
|
|
724
|
+
<pre><code>artiframe> <span class="fn">mejora</span></code></pre>
|
|
725
|
+
<ul style="margin-left: 20px; margin-bottom: 15px; line-height: 1.6;">
|
|
726
|
+
<li>Solo<code>app/</code>Y<code>bin/</code>con carpetas principales<code>src/Service/</code>Actualiza las clases de servicios fijos (si las hay) bajo él.</li>
|
|
727
|
+
<li>Dónde se encuentra su lógica de negocio<code>src/</code>, <code>public/</code>Y<code>config/</code>Definitivamente en tus directorios<strong>intocable</strong>(para que su proyecto no se dañe).</li>
|
|
728
|
+
<li><strong>Cortafuegos:</strong>Si su proyecto es v1.x y<code>public/index.php</code>Si su archivo no se ajusta a la nueva estructura del enrutador, dará un error y le pedirá el nombre de su index.php existente.<code>landing.php</code>Te pide que lo cambies a .</li>
|
|
729
|
+
<li><strong>Aviso de modificación:</strong>si antes<code>bin/</code>Si ha cambiado manualmente las funciones principales en<strong>ingresar</strong>Pide confirmación manual (aviso de respaldo) con el botón.</li>
|
|
730
|
+
<li><strong>Informe de cambio inteligente (diferencia):</strong>Cuando finaliza la actualización, imprime en el terminal un informe detallado de los archivos recién agregados o modificados (actualizados) en su proyecto.</li>
|
|
731
|
+
<li><strong>Análisis de nivel de función:</strong>Si el archivo actualizado es un<code>.php</code>El archivo compara los métodos del archivo antiguo y del nuevo. Si se agrega una nueva función, el informe<code>[YENİ FONKSİYON] ad()</code>Le indica que lea la documentación con una advertencia especial.</li>
|
|
732
|
+
</ul>
|
|
710
733
|
</section>
|
|
711
|
-
|
|
734
|
+
hacer:ver
|
|
712
735
|
<section id="cli-view">
|
|
713
|
-
<h2><code>make:view</code> <span class="tag b-cli">CLI
|
|
714
|
-
<p>Crea un nuevo archivo de página (vista) y sus recursos CSS/JS personalizados. Los activos se vinculan automáticamente a la página y
|
|
715
|
-
<pre><code>artiframe> <span class="fn">
|
|
736
|
+
<h2><code>make:view</code> <span class="tag b-cli">Comando CLI</span></h2>
|
|
737
|
+
<p>Crea un nuevo archivo de página (vista) y sus recursos CSS/JS personalizados. Los activos se vinculan automáticamente a la página y<code class="ic">?v=APP_VERSION</code>La eliminación de caché se aplica con .</p>
|
|
738
|
+
<pre><code>artiframe> <span class="fn">hacer: ver</span> <span class="st">administrador/usuarios.php</span></code></pre>
|
|
716
739
|
<p>Archivos creados:</p>
|
|
717
|
-
<pre><code><span class="cm">✔
|
|
718
|
-
<span class="cm">✔
|
|
719
|
-
<span class="cm">✔
|
|
740
|
+
<pre><code><span class="cm">✔ público/admin/usuarios.php</span>
|
|
741
|
+
<span class="cm">✔ público/activos/css/admin/users.css</span>
|
|
742
|
+
<span class="cm">✔ público/activos/js/admin/users.js</span></code></pre>
|
|
720
743
|
<p>Al comienzo del archivo de vista creado, se requiere ViewControl, se agregan inclusiones de encabezado/encabezado/pie de página y los enlaces CSS/JS están conectados con eliminación de caché.</p>
|
|
721
744
|
</section>
|
|
722
|
-
|
|
745
|
+
hacer:api
|
|
723
746
|
<section id="cli-api">
|
|
724
|
-
<h2><code>make:api</code> <span class="tag b-cli">CLI
|
|
725
|
-
<p>Crea un archivo de punto final API eligiendo una de dos plantillas diferentes. Con cada nuevo archivo API
|
|
747
|
+
<h2><code>make:api</code> <span class="tag b-cli">Comando CLI</span></h2>
|
|
748
|
+
<p>Crea un archivo de punto final API eligiendo una de dos plantillas diferentes. Con cada nuevo archivo API<code class="ic">$allowedMethods</code>variables y<code class="ic">ApiControl.php</code>Viene con el requisito listo.</p>
|
|
726
749
|
<div class="card">
|
|
727
|
-
<h3><span class="badge b-api">
|
|
750
|
+
<h3><span class="badge b-api">estándar</span>— API de acción única</h3>
|
|
728
751
|
<p>Para puntos finales que realizan un solo trabajo (iniciar sesión, enviar, eliminar). La lógica empresarial se escribe directamente.</p>
|
|
729
|
-
<pre><code>artiframe> <span class="fn">
|
|
752
|
+
<pre><code>artiframe> <span class="fn">hacer:api</span> <span class="st">estándar</span> <span class="st">api/auth/login.php</span></code></pre>
|
|
730
753
|
<pre><code><span class="kw"><?php</span>
|
|
731
|
-
<span class="var">$
|
|
732
|
-
<span class="fn">
|
|
733
|
-
|
|
734
|
-
<span class="
|
|
735
|
-
|
|
736
|
-
<span class="cm">// İş mantığı buraya...</span>
|
|
737
|
-
<span class="fn">jsonResponse</span>([<span class="st">'status'</span> => <span class="st">'success'</span>], <span class="nu">200</span>);</code></pre>
|
|
754
|
+
<span class="var">$métodos permitidos</span> = [<span class="st">'CORREO'</span>]; <span class="cm">// Acepta solo POST</span>
|
|
755
|
+
<span class="fn">requerir_una vez</span> <span class="var">$_SERVIDOR</span>[<span class="st">'DOCUMENT_ROOT'</span>] . <span class="st">'/../app/ApiControl.php'</span>;
|
|
756
|
+
<span class="kw">usar</span> Bin\SystemMethod;
|
|
757
|
+
<span class="cm">//Lógica de negocios aquí...</span>
|
|
758
|
+
<span class="fn">jsonRespuesta</span>([<span class="st">'estado'</span> => <span class="st">'éxito'</span>], <span class="nu">200</span>);</code></pre>
|
|
738
759
|
</div>
|
|
739
760
|
<div class="card">
|
|
740
|
-
<h3><span class="badge b-api">
|
|
741
|
-
<p>Una estructura que gestiona las operaciones CRUD para un módulo en un único punto final
|
|
742
|
-
<pre><code>artiframe> <span class="fn">
|
|
761
|
+
<h3><span class="badge b-api">caja de interruptor</span>— API de acción múltiple</h3>
|
|
762
|
+
<p>Una estructura que gestiona las operaciones CRUD para un módulo en un único punto final.<code class="ic">action</code>El parámetro determina qué operación se realizará.</p>
|
|
763
|
+
<pre><code>artiframe> <span class="fn">hacer:api</span> <span class="st">caja de interruptor</span> <span class="st">api/usuario/admin.php</span></code></pre>
|
|
743
764
|
<pre><code><span class="kw"><?php</span>
|
|
744
|
-
<span class="var">$
|
|
745
|
-
<span class="fn">
|
|
746
|
-
|
|
747
|
-
<span class="
|
|
748
|
-
|
|
749
|
-
<span class="
|
|
750
|
-
|
|
751
|
-
<span class="kw">
|
|
752
|
-
<span class="kw">
|
|
753
|
-
<span class="fn">
|
|
754
|
-
<span class="kw">
|
|
755
|
-
<span class="kw">
|
|
756
|
-
<span class="fn">
|
|
757
|
-
<span class="kw">
|
|
758
|
-
<span class="kw">
|
|
759
|
-
<span class="fn">
|
|
760
|
-
<span class="kw">break</span>;
|
|
761
|
-
<span class="kw">default</span>:
|
|
762
|
-
<span class="fn">jsonResponse</span>([<span class="st">'status'</span> => <span class="st">'error'</span>, <span class="st">'message'</span> => <span class="st">'Geçersiz action.'</span>], <span class="nu">400</span>);
|
|
765
|
+
<span class="var">$métodos permitidos</span> = [<span class="st">'CORREO'</span>];
|
|
766
|
+
<span class="fn">requerir_una vez</span> <span class="var">$_SERVIDOR</span>[<span class="st">'DOCUMENT_ROOT'</span>] . <span class="st">'/../app/ApiControl.php'</span>;
|
|
767
|
+
<span class="kw">usar</span> Bin\SystemMethod;
|
|
768
|
+
<span class="var">$acción</span> = <span class="fn">desinfectarString</span>(<span class="var">$_POST</span>[<span class="st">'acción'</span>] ?? <span class="st">''</span>);
|
|
769
|
+
<span class="kw">cambiar</span> (<span class="var">$acción</span>) {
|
|
770
|
+
<span class="kw">caso</span> <span class="st">'crear'</span>:
|
|
771
|
+
<span class="fn">jsonRespuesta</span>([<span class="st">'estado'</span> => <span class="st">'éxito'</span>, <span class="st">'mensaje'</span> => <span class="st">'Creado.'</span>], <span class="nu">200</span>);
|
|
772
|
+
<span class="kw">romper</span>;
|
|
773
|
+
<span class="kw">caso</span> <span class="st">'actualizar'</span>:
|
|
774
|
+
<span class="fn">jsonRespuesta</span>([<span class="st">'estado'</span> => <span class="st">'éxito'</span>, <span class="st">'mensaje'</span> => <span class="st">'Actualizado.'</span>], <span class="nu">200</span>);
|
|
775
|
+
<span class="kw">romper</span>;
|
|
776
|
+
<span class="kw">caso</span> <span class="st">'borrar'</span>:
|
|
777
|
+
<span class="fn">jsonRespuesta</span>([<span class="st">'estado'</span> => <span class="st">'éxito'</span>, <span class="st">'mensaje'</span> => <span class="st">'Eliminado'.</span>], <span class="nu">200</span>);
|
|
778
|
+
<span class="kw">romper</span>;
|
|
779
|
+
<span class="kw">por defecto</span>:
|
|
780
|
+
<span class="fn">jsonRespuesta</span>([<span class="st">'estado'</span> => <span class="st">'error'</span>, <span class="st">'mensaje'</span> => <span class="st">'Acción inválida.'</span>], <span class="nu">400</span>);
|
|
763
781
|
}</code></pre>
|
|
764
782
|
</div>
|
|
765
783
|
</section>
|
|
766
|
-
|
|
784
|
+
hacer: clase
|
|
767
785
|
<section id="cli-class">
|
|
768
|
-
<h2><code>make:class</code> <span class="tag b-cli">CLI
|
|
769
|
-
<p>Crea un nuevo archivo de clase PHP con el espacio de nombres y el modelo estándar de clase listos. El espacio de nombres se determina automáticamente según la ruta de
|
|
770
|
-
<pre><code>artiframe> <span class="fn">
|
|
786
|
+
<h2><code>make:class</code> <span class="tag b-cli">Comando CLI</span></h2>
|
|
787
|
+
<p>Crea un nuevo archivo de clase PHP con el espacio de nombres y el modelo estándar de clase listos. El espacio de nombres se determina automáticamente según la ruta de clase. Si<strong>aplicación/</strong>Y<strong>src/</strong>afuera (por ejemplo<strong>privado/</strong>) si se utiliza un directorio, la herramienta CLI se ejecuta en segundo plano<code>composer dump-autoload</code>ejecuta automáticamente el script.</p>
|
|
788
|
+
<pre><code>artiframe> <span class="fn">hacer: clase</span> <span class="st">src/Servicio/EmailService.php</span></code></pre>
|
|
771
789
|
<p>Si no se especifica el directorio de clase, el comando devuelve un error:</p>
|
|
772
|
-
<pre><code>artiframe> <span class="fn">
|
|
790
|
+
<pre><code>artiframe> <span class="fn">hacer: clase</span>
|
|
773
791
|
❌ Hata: Sınıfın oluşturulacağı dizin belirtilmeli! (örn: /app veya /src)
|
|
774
792
|
Example: /src/Service/PaymentService</code></pre>
|
|
775
793
|
</section>
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
`
|
|
794
|
-
`
|
|
795
|
-
`
|
|
796
|
-
`
|
|
797
|
-
`
|
|
798
|
-
`
|
|
799
|
-
`
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
`
|
|
810
|
-
`
|
|
811
|
-
`
|
|
812
|
-
`
|
|
813
|
-
`
|
|
814
|
-
`
|
|
815
|
-
`
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
`
|
|
827
|
-
`
|
|
828
|
-
`
|
|
829
|
-
`
|
|
830
|
-
`
|
|
831
|
-
`
|
|
832
|
-
`
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
<p><strong>Listar Tablas:</strong> Para ver todas las plantillas de tablas disponibles y sus descripciones:</p>
|
|
862
|
-
<pre><code>artiframe> <span class="fn">table</span> <span class="st">list</span></code></pre>
|
|
863
|
-
|
|
864
|
-
<p><strong>Vista previa del contenido de la tabla:</strong> Para inspeccionar el contenido SQL en la terminal antes de agregarlo al archivo <code>schema.sql</code>, puede agregar el parámetro <code>check</code>:</p>
|
|
865
|
-
<pre><code>artiframe> <span class="fn">table:</span><span class="st">users</span> <span class="st">check</span></code></pre>
|
|
866
|
-
|
|
867
|
-
</section>
|
|
868
|
-
|
|
869
|
-
<!-- cli v -->
|
|
794
|
+
mesa:
|
|
795
|
+
<section id="cli-table">
|
|
796
|
+
<h2><code>table:</code> <span class="tag b-cli">Comando CLI</span></h2>
|
|
797
|
+
<p>en tu proyecto<code>schema.sql</code>Le permite agregar rápidamente tablas de bases de datos estándar y relacionales al archivo. Plantillas globales<code>stubs/sql.stub</code>se lee del archivo.</p>
|
|
798
|
+
<pre><code>artiframe> <span class="fn">mesa:</span><span class="st">usuarios</span></code></pre>
|
|
799
|
+
<p>Tablas estándar actualmente soportadas:</p>
|
|
800
|
+
<div class="table-tabs-container" style="margin-top: 20px;">
|
|
801
|
+
<div class="tabs-header" style="display: flex; gap: 10px; margin-bottom: 10px; overflow-x: auto; padding-bottom: 5px;">
|
|
802
|
+
<button class="table-tab-btn active" onclick="switchTableTab('tab-users', this)" style="white-space: nowrap; padding: 10px 20px; background: #00c88c; color: #000; font-weight: 600; border: none; border-radius: 5px; cursor: pointer;">usuarios</button>
|
|
803
|
+
<button class="table-tab-btn" onclick="switchTableTab('tab-sessions', this)" style="white-space: nowrap; padding: 10px 20px; background: #1c2128; color: #fff; border: 1px solid #30363d; border-radius: 5px; cursor: pointer;">sesiones_de_usuario</button>
|
|
804
|
+
<button class="table-tab-btn" onclick="switchTableTab('tab-prefs', this)" style="white-space: nowrap; padding: 10px 20px; background: #1c2128; color: #fff; border: 1px solid #30363d; border-radius: 5px; cursor: pointer;">preferencias_de_usuario</button>
|
|
805
|
+
</div>
|
|
806
|
+
Pestaña: usuarios
|
|
807
|
+
<div class="table-tab-content" id="tab-users" style="display: block;">
|
|
808
|
+
<pre><code><span class="kw">CREAR TABLA `usuarios` (
|
|
809
|
+
`id` binario(16) NO NULO,
|
|
810
|
+
`correo electrónico` varchar(255) NO NULO,
|
|
811
|
+
`contraseña` varchar(255) NO NULO,
|
|
812
|
+
`nombre` varchar(255) POR DEFECTO NULO,
|
|
813
|
+
`role` enum('usuario','admin','moderador') NOT NULL DEFAULT 'usuario',
|
|
814
|
+
`status` tinyint(1) NOT NULL DEFAULT '1',
|
|
815
|
+
Marca de tiempo `created_at` NULL DEFAULT CURRENT_TIMESTAMP,
|
|
816
|
+
Marca de tiempo `updated_at` NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|
817
|
+
CLAVE PRIMARIA (`id`),
|
|
818
|
+
CLAVE ÚNICA `correo electrónico` (`correo electrónico`)
|
|
819
|
+
) MOTOR=InnoDB CONJUNTO DE CARACTERES PREDETERMINADO=utf8mb4 COLLATE=utf8mb4_unicode_ci;</span></code></pre>
|
|
820
|
+
</div>
|
|
821
|
+
Pestaña: sesiones_usuario
|
|
822
|
+
<div class="table-tab-content" id="tab-sessions" style="display: none;">
|
|
823
|
+
<pre><code><span class="kw">CREAR TABLA `sesiones_usuario` (
|
|
824
|
+
`id` binario(16) NO NULO,
|
|
825
|
+
`user_id` binario(16) NO NULO,
|
|
826
|
+
`token` varchar(255) NO NULO,
|
|
827
|
+
`dirección_ip` varchar(45) POR DEFECTO NULO,
|
|
828
|
+
`user_agent` varchar(255) POR DEFECTO NULO,
|
|
829
|
+
`expires_at` marca de tiempo NULL DEFAULT NULL,
|
|
830
|
+
Marca de tiempo `created_at` NULL DEFAULT CURRENT_TIMESTAMP,
|
|
831
|
+
CLAVE PRIMARIA (`id`),
|
|
832
|
+
CLAVE ÚNICA `token` (`token`),
|
|
833
|
+
CLAVE `user_id` (`user_id`),
|
|
834
|
+
RESTRICCIÓN `fk_user_sessions_user_id` CLAVE EXTRANJERA (`user_id`) REFERENCIAS `usuarios` (`id`) AL ELIMINAR CASCADA AL ACTUALIZAR CASCADA
|
|
835
|
+
) MOTOR=InnoDB CONJUNTO DE CARACTERES PREDETERMINADO=utf8mb4 COLLATE=utf8mb4_unicode_ci;</span></code></pre>
|
|
836
|
+
</div>
|
|
837
|
+
Pestaña: preferencias_usuario
|
|
838
|
+
<div class="table-tab-content" id="tab-prefs" style="display: none;">
|
|
839
|
+
<pre><code><span class="kw">CREAR TABLA `preferencias_usuario` (
|
|
840
|
+
`id` binario(16) NO NULO,
|
|
841
|
+
`user_id` binario(16) NO NULO,
|
|
842
|
+
`idioma` varchar(10) NO NULO POR DEFECTO 'tr',
|
|
843
|
+
`theme` varchar(20) NOT NULL DEFAULT 'ligero',
|
|
844
|
+
`push_notifications` tinyint(1) NOT NULL DEFAULT '1',
|
|
845
|
+
`email_notifications` tinyint(1) NOT NULL DEFAULT '1',
|
|
846
|
+
Marca de tiempo `created_at` NULL DEFAULT CURRENT_TIMESTAMP,
|
|
847
|
+
Marca de tiempo `updated_at` NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|
848
|
+
CLAVE PRIMARIA (`id`),
|
|
849
|
+
CLAVE ÚNICA `user_id` (`user_id`),
|
|
850
|
+
RESTRICCIÓN `fk_user_prefs_user_id` CLAVE EXTRANJERA (`user_id`) REFERENCIAS `usuarios` (`id`) AL ELIMINAR CASCADA AL ACTUALIZAR CASCADA
|
|
851
|
+
) MOTOR=InnoDB CONJUNTO DE CARACTERES PREDETERMINADO=utf8mb4 COLLATE=utf8mb4_unicode_ci;</span></code></pre>
|
|
852
|
+
</div>
|
|
853
|
+
</div>
|
|
854
|
+
<script>
|
|
855
|
+
function switchTableTab(tabId, btn) {
|
|
856
|
+
const container = btn.closest('.table-tabs-container');
|
|
857
|
+
container.querySelectorAll('.table-tab-content').forEach(el => el.style.display = 'none');
|
|
858
|
+
container.querySelectorAll('.table-tab-btn').forEach(el => {
|
|
859
|
+
el.style.background = '#1c2128';
|
|
860
|
+
el.style.color = '#fff';
|
|
861
|
+
el.style.border = '1px solid #30363d';
|
|
862
|
+
el.style.fontWeight = '400';
|
|
863
|
+
});
|
|
864
|
+
container.querySelector('#' + tabId).style.display = 'block';
|
|
865
|
+
btn.style.background = '#00c88c';
|
|
866
|
+
btn.style.color = '#000';
|
|
867
|
+
btn.style.fontWeight = '600';
|
|
868
|
+
btn.style.border = 'none';
|
|
869
|
+
}
|
|
870
|
+
</script>
|
|
871
|
+
<h3 style="margin-top: 30px;">Comandos adicionales</h3>
|
|
872
|
+
<p><strong>Tablas de listado:</strong>Para ver todas las plantillas y descripciones de tablas disponibles:</p>
|
|
873
|
+
<pre><code>artiframe> <span class="fn">mesa</span> <span class="st">lista</span></code></pre>
|
|
874
|
+
<p><strong>Vista previa del contenido de la tabla:</strong>una pintura<code>schema.sql</code>al final del comando para examinar el contenido de SQL en la terminal antes de agregarlo al archivo.<code>check</code>Puedes agregar el parámetro:</p>
|
|
875
|
+
<pre><code>artiframe> <span class="fn">mesa:</span><span class="st">usuarios</span> <span class="st">controlar</span></code></pre>
|
|
876
|
+
</section>
|
|
877
|
+
mejora
|
|
878
|
+
cliv
|
|
870
879
|
<section id="cli-cliv">
|
|
871
|
-
<h2><code>cli v</code>
|
|
872
|
-
<p>ArtiFrame CLI controla su propia versión (global) de la herramienta. No solo muestra la versión actual
|
|
873
|
-
<pre><code>artiframe> <span class="fn">
|
|
874
|
-
<span class="cm">
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
<span class="cm"> Güncelleniyor...
|
|
881
|
-
✅ CLI başarıyla güncellendi!</span></code></pre>
|
|
880
|
+
<h2><code>cli v</code>(o<code>cli version</code>) <span class="tag b-cli">Comando CLI</span></h2>
|
|
881
|
+
<p>ArtiFrame CLI controla su propia versión (global) de la herramienta. No solo muestra la versión actual,<strong>Registro del MNP</strong>También comprueba si está disponible la versión más actualizada. Si hay una nueva versión, puede actualizarse globalmente con un clic (sí/no).<code>npm install -g @artilingo/artiframe-cli@latest</code>).</p>
|
|
882
|
+
<pre><code>artiframe> <span class="fn">cliv</span>
|
|
883
|
+
<span class="cm">Versión actual: v1.0.0
|
|
884
|
+
Versión actual: v1.0.1
|
|
885
|
+
¡Hay una nueva actualización disponible! v1.0.0 → v1.0.1
|
|
886
|
+
¿Quieres actualizar ahora? (t/n)</span> <span class="st">y</span>
|
|
887
|
+
<span class="cm">Actualizando...
|
|
888
|
+
✅ ¡CLI actualizado exitosamente!</span></code></pre>
|
|
882
889
|
</section>
|
|
883
|
-
|
|
890
|
+
espectáculo
|
|
884
891
|
<section id="cli-show">
|
|
885
|
-
<h2><code>show</code> <span class="tag b-cli">CLI
|
|
892
|
+
<h2><code>show</code> <span class="tag b-cli">Comando CLI</span></h2>
|
|
886
893
|
<p>Muestra en qué directorio de trabajo se encuentra actualmente la CLI. Útil para la navegación.</p>
|
|
887
|
-
<pre><code>artiframe> <span class="fn">
|
|
894
|
+
<pre><code>artiframe> <span class="fn">espectáculo</span>
|
|
888
895
|
📍 Mevcut Çalışma Dizini:
|
|
889
896
|
C:\projeler\benim_projem</code></pre>
|
|
890
897
|
</section>
|
|
891
|
-
|
|
898
|
+
lista
|
|
892
899
|
<section id="cli-list">
|
|
893
|
-
<h2><code>list</code> <span class="tag b-cli">CLI
|
|
900
|
+
<h2><code>list</code> <span class="tag b-cli">Comando CLI</span></h2>
|
|
894
901
|
<p>Enumera los archivos y carpetas en el directorio actual en una estructura de árbol en orden de prioridad. Muestra la cantidad de elementos dentro de las carpetas y los tamaños de los archivos.</p>
|
|
895
|
-
<pre><code>artiframe> <span class="fn">
|
|
902
|
+
<pre><code>artiframe> <span class="fn">lista</span>
|
|
896
903
|
📂 benim_projem/
|
|
897
904
|
│ ├── 📂 src/ (5 öğe)
|
|
898
905
|
│ ├── 📂 public/ (4 öğe)
|
|
899
906
|
│ ├── 📄 composer.json [1.2 KB]
|
|
900
907
|
│ └── 📄 README.md [4.5 KB]</code></pre>
|
|
901
908
|
</section>
|
|
902
|
-
|
|
909
|
+
ir
|
|
903
910
|
<section id="cli-go">
|
|
904
|
-
<h2><code>go</code> <span class="tag b-cli">CLI
|
|
911
|
+
<h2><code>go</code> <span class="tag b-cli">Comando CLI</span></h2>
|
|
905
912
|
<p>Le permite navegar entre directorios mientras se encuentra en el shell interactivo de la CLI. No tiene un efecto permanente a nivel del sistema operativo, pero cambia su directorio de trabajo siempre que la CLI permanezca abierta.</p>
|
|
906
|
-
<pre><code>artiframe> <span class="fn">
|
|
913
|
+
<pre><code>artiframe> <span class="fn">ir</span> <span class="st">público</span>
|
|
907
914
|
✅ Dizin başarıyla değiştirildi.
|
|
908
915
|
C:\projeler\benim_projem\public
|
|
909
|
-
|
|
910
|
-
artiframe> <span class="fn">go</span> <span class="st">back</span>
|
|
916
|
+
artiframe> <span class="fn">ir</span> <span class="st">atrás</span>
|
|
911
917
|
✅ Dizin başarıyla değiştirildi.
|
|
912
918
|
C:\projeler\benim_projem</code></pre>
|
|
913
919
|
</section>
|
|
914
|
-
|
|
920
|
+
eliminar
|
|
915
921
|
<section id="cli-remove">
|
|
916
|
-
<h2><code>remove</code> <span class="tag b-cli">CLI
|
|
917
|
-
<p>Elimina de forma segura un archivo específico
|
|
922
|
+
<h2><code>remove</code> <span class="tag b-cli">Comando CLI</span></h2>
|
|
923
|
+
<p>Elimina de forma segura un archivo específico.<code>make</code>Funciona de manera opuesta a los comandos y analiza las dependencias en el proyecto y da advertencias antes de la eliminación:</p>
|
|
918
924
|
<ul>
|
|
919
|
-
<li><strong>Si se elimina la vista:</strong>
|
|
920
|
-
<li><strong>Si se elimina la clase:</strong>
|
|
925
|
+
<li><strong>Si se elimina la vista:</strong>si archivo<code>public/</code>y archivos CSS/JS vinculados a este archivo<code>public/assets</code>Si los hay, te preguntará si quieres limpiarlos también.</li>
|
|
926
|
+
<li><strong>Si se elimina la clase:</strong>si archivo<code>src/</code>o<code>app/</code>si está debajo,<code>public/api/</code>escanea el directorio. Le advierte imprimiendo los extremos de la API y los números de línea en los que se utiliza la clase que eliminó, pero no elimina las API automáticamente (por razones de seguridad, debe editar manualmente las API relevantes).</li>
|
|
921
927
|
</ul>
|
|
922
|
-
<pre><code>artiframe> <span class="fn">
|
|
928
|
+
<pre><code>artiframe> <span class="fn">eliminar</span> <span class="st">src/Auth/UserManager.php</span>
|
|
923
929
|
⚠️ Bu dosyayı KÖKTEN silmek üzeresiniz. Emin misiniz? C:\...\src\Auth\UserManager.php [y/N]: y
|
|
924
|
-
|
|
925
930
|
🚨 DİKKAT: Sildiğiniz UserManager sınıfı şu API dosyalarında kullanılıyor:
|
|
926
931
|
-> C:\...\public\api\auth\login.php (Satır: 12)
|
|
927
932
|
-> C:\...\public\api\auth\register.php (Satır: 15)
|
|
928
|
-
|
|
929
933
|
📌 Yukarıdaki API dosyalarındaki ilgili satırları kendiniz düzenlemeli veya silmelisiniz.
|
|
930
|
-
|
|
931
934
|
✅ Dosya başarıyla silindi: C:\...\src\Auth\UserManager.php</code></pre>
|
|
932
935
|
</section>
|
|
933
|
-
|
|
936
|
+
versión
|
|
934
937
|
<section id="cli-version">
|
|
935
|
-
<h2><code>version</code> <span class="tag b-cli">CLI
|
|
936
|
-
<p><code class="ic">config/app-version.php</code>
|
|
938
|
+
<h2><code>version</code> <span class="tag b-cli">Comando CLI</span></h2>
|
|
939
|
+
<p><code class="ic">config/app-version.php</code>Actualiza el número de versión de acuerdo con las reglas de control de versiones semánticas (SemVer). Formato de versión:<strong>PARCHE.MAYOR.MENOR.</strong></p>
|
|
937
940
|
<table class="sig-table">
|
|
938
941
|
<thead>
|
|
939
942
|
<tr><th>dominio</th><th>Explicación</th><th>Ejemplo</th></tr>
|
|
@@ -947,52 +950,76 @@ artiframe> <span class="fn">go</span> <span class="st">back</span>
|
|
|
947
950
|
<tr><td>versión degradada mayor</td><td>Deshacer el último gran</td><td>2.0.0 → 1.0.0</td></tr>
|
|
948
951
|
</tbody>
|
|
949
952
|
</table>
|
|
950
|
-
<pre><code>artiframe> <span class="fn">
|
|
951
|
-
<span class="cm">✔
|
|
953
|
+
<pre><code>artiframe> <span class="fn">versión</span> upgrade minor
|
|
954
|
+
<span class="cm">✔ Actualizado a la Versión 1.2.0 → 1.3.0.</span></code></pre>
|
|
952
955
|
</section>
|
|
953
|
-
|
|
954
|
-
|
|
955
|
-
|
|
956
|
-
|
|
957
|
-
|
|
958
|
-
✅
|
|
959
|
-
|
|
960
|
-
|
|
961
|
-
|
|
962
|
-
|
|
956
|
+
modo
|
|
957
|
+
<section id="cli-mode">
|
|
958
|
+
<h2><code>mode</code> <span class="tag b-cli">Comando CLI</span></h2>
|
|
959
|
+
<p>Te permite cambiar el modo de trabajo del proyecto (Desarrollo o Live) con un solo comando. Este comando puede ser manualmente<code>config/app-version.php</code>Le ahorra la molestia de abrir y editar el archivo.</p>
|
|
960
|
+
<pre><code>artiframe> <span class="fn">modo</span> <span class="st">1</span>
|
|
961
|
+
✅ Prod modundan Debug moduna geçiş yapıldı.</code></pre>
|
|
962
|
+
<p>Para cambiar a la versión en vivo<code>0</code>Puedes usar el parámetro:</p>
|
|
963
|
+
<pre><code>artiframe> <span class="fn">modo</span> <span class="st">0</span></code></pre>
|
|
964
|
+
</section>
|
|
965
|
+
atender
|
|
963
966
|
<section id="cli-serve">
|
|
964
|
-
<h2><code>serve</code> <span class="tag b-cli">CLI
|
|
965
|
-
<p>
|
|
966
|
-
<pre><code>artiframe> <span class="fn">
|
|
967
|
-
🚀 Geliştirme sunucusu
|
|
968
|
-
Durdurmak için CTRL+C tuşlarına basın
|
|
967
|
+
<h2><code>serve</code> <span class="tag b-cli">Comando CLI</span></h2>
|
|
968
|
+
<p>Para probar el proyecto, inicia un servidor de desarrollo local y lo abre en la red local (red local) a través de 0.0.0.0 (todas las interfaces de red). Lanza tu proyecto en segundos sin necesidad de instalar un servidor web adicional (XAMPP, Nginx, etc.), abre automáticamente la pestaña localhost en tu propia computadora e imprime la IP de conexión para otros dispositivos en la red (teléfono/tableta) en la pantalla.</p>
|
|
969
|
+
<pre><code>artiframe> <span class="fn">atender</span>
|
|
970
|
+
🚀 Geliştirme sunucusu başlatıldı: 0.0.0.0:8000
|
|
971
|
+
Durdurmak için CTRL+C tuşlarına basın.
|
|
972
|
+
|
|
973
|
+
Local: http://localhost:8000
|
|
974
|
+
Network: http://192.168.1.34:8000</code></pre>
|
|
969
975
|
<p>Puede especificar un número de puerto diferente si desea:</p>
|
|
970
|
-
<pre><code>artiframe> <span class="fn">
|
|
976
|
+
<pre><code>artiframe> <span class="fn">atender</span> <span class="st">8080</span></code></pre>
|
|
977
|
+
</section>
|
|
978
|
+
autenticación
|
|
979
|
+
<section id="cli-auth">
|
|
980
|
+
<h2><code>auth</code> <span class="tag b-cli">Comando CLI</span></h2>
|
|
981
|
+
<p>El problema autoriza a la CLI con su cuenta de GitHub (a través de OAuth Device Flow) a poder enviar sugerencias e informes de errores.</p>
|
|
982
|
+
<pre><code>artiframe> <span class="fn">autenticación</span></code></pre>
|
|
983
|
+
<p>Este comando imprime un código de usuario y abre la página de autorización de GitHub en su navegador. Una vez confirmada la autorización, el token se almacena de forma segura.</p>
|
|
984
|
+
</section>
|
|
985
|
+
sugerir
|
|
986
|
+
<section id="cli-suggest">
|
|
987
|
+
<h2><code>suggest</code> <span class="tag b-cli">Comando CLI</span></h2>
|
|
988
|
+
<p>Le permite enviar solicitudes de funciones, informes de errores o sugerencias directamente a GitHub sin salir de la terminal. antes<code>auth</code>Es obligatorio iniciar sesión con el comando.</p>
|
|
989
|
+
<pre><code>artiframe> <span class="fn">sugerir</span></code></pre>
|
|
990
|
+
<p>El script le solicita de forma interactiva que seleccione una categoría, escriba un título e ingrese una descripción detallada. Una vez completado, se publica como un Issue en el repositorio oficial de ArtiFrame.</p>
|
|
971
991
|
</section>
|
|
972
|
-
|
|
992
|
+
asuntos
|
|
993
|
+
<section id="cli-issues">
|
|
994
|
+
<h2><code>issues</code> <span class="tag b-cli">Comando CLI</span></h2>
|
|
995
|
+
<p>Enumere los problemas que ha enviado y lea sus comentarios directamente desde su terminal.<code>auth</code>Requiere iniciar sesión con el comando.</p>
|
|
996
|
+
<pre><code>artiframe> <span class="fn">asuntos</span> [id]</code></pre>
|
|
997
|
+
<p>Para ver una lista de sus problemas<code>issues</code>ejecutarlo. Para ver los detalles y comentarios del número 4<code>issues 4</code>ejecutarlo.</p>
|
|
998
|
+
</section>
|
|
999
|
+
agregar
|
|
973
1000
|
<section id="cli-add">
|
|
974
|
-
<h2><code>add</code> <span class="tag b-cli">CLI
|
|
975
|
-
<p>Es el comando más poderoso que le permite incluir módulos externos o integraciones listas para usar en su proyecto. Clásico
|
|
976
|
-
<pre><code>artiframe> <span class="fn">
|
|
1001
|
+
<h2><code>add</code> <span class="tag b-cli">Comando CLI</span></h2>
|
|
1002
|
+
<p>Es el comando más poderoso que le permite incluir módulos externos o integraciones listas para usar en su proyecto. Clásico<code>composer require</code>Yendo más allá del proceso, crea clases de servicio automáticas (stubs) para algunos módulos y<code>.env</code>Automáticamente realiza las definiciones necesarias para sus archivos.</p>
|
|
1003
|
+
<pre><code>artiframe> <span class="fn">agregar</span> <span class="st">paquete_nombre_corto</span></code></pre>
|
|
977
1004
|
<h3>1. Paquetes integrados (dependientes de la clase)</h3>
|
|
978
|
-
<p>Cuando se instalan estos paquetes, se crea automáticamente una clase de servicio y
|
|
1005
|
+
<p>Cuando se instalan estos paquetes, se crea automáticamente una clase de servicio y<code>.env</code>Las claves de conexión se agregan a su archivo. Estos paquetes y las ubicaciones de las clases que crean se enumeran a continuación:</p>
|
|
979
1006
|
<div class="table-wrapper">
|
|
980
1007
|
<table class="sig-table">
|
|
981
1008
|
<thead>
|
|
982
1009
|
<tr><th>dominio</th><th>Paquete de compositor</th><th>Archivo de clase generado</th></tr>
|
|
983
1010
|
</thead>
|
|
984
1011
|
<tbody>
|
|
985
|
-
|
|
986
|
-
|
|
987
|
-
<tr><td><code>add stripe</code></td><td>
|
|
988
|
-
|
|
989
|
-
|
|
990
|
-
<tr><td><code>add image</code></td><td>intervención/imagen</td><td><span class="tag b-core">src/
|
|
991
|
-
<tr><td><code>add s3</code></td><td>aws/aws-sdk-php</td><td><span class="tag b-core">src/
|
|
992
|
-
<tr><td><code>add sentry</code></td><td>
|
|
1012
|
+
<tr><td><code>add phpmailer</code></td><td>phpmailer/phpmailer</td><td><span class="tag b-core">src/Servicio/Mailer.php</span></td></tr>
|
|
1013
|
+
<tr><td><code>add iyzico</code></td><td>iyzipay/iyzipay-php</td><td><span class="tag b-core">src/Servicio/Iyzico.php</span></td></tr>
|
|
1014
|
+
<tr><td><code>add stripe</code></td><td>raya/raya-php</td><td><span class="tag b-core">src/Servicio/Stripe.php</span></td></tr>
|
|
1015
|
+
<tr><td><code>add qrcode</code></td><td>endroid/código qr</td><td><span class="tag b-core">src/Servicio/QrCode.php</span></td></tr>
|
|
1016
|
+
<tr><td><code>add jwt</code></td><td>base de fuego/php-jwt</td><td><span class="tag b-core">src/Auth/JwtAuth.php</span></td></tr>
|
|
1017
|
+
<tr><td><code>add image</code></td><td>intervención/imagen</td><td><span class="tag b-core">src/Servicio/ImageProcessor.php</span></td></tr>
|
|
1018
|
+
<tr><td><code>add s3</code></td><td>aws/aws-sdk-php</td><td><span class="tag b-core">src/Servicio/S3Storage.php</span></td></tr>
|
|
1019
|
+
<tr><td><code>add sentry</code></td><td>centinela/centinela</td><td><span class="tag b-core">src/Servicio/Sentry.php</span></td></tr>
|
|
993
1020
|
<tr><td><code>add redis</code></td><td>predis/predis</td><td><span class="tag b-core">src/Service/RedisCache.php</span></td></tr>
|
|
994
|
-
<tr><td><code>add pusher</code></td><td>empujador/empujador-php-servidor</td><td><span class="tag b-core">src/
|
|
995
|
-
<tr><td><code>add twilio</code></td><td>twilio/sdk</td><td><span class="tag b-core">src/
|
|
1021
|
+
<tr><td><code>add pusher</code></td><td>empujador/empujador-php-servidor</td><td><span class="tag b-core">src/Servicio/Pusher.php</span></td></tr>
|
|
1022
|
+
<tr><td><code>add twilio</code></td><td>twilio/sdk</td><td><span class="tag b-core">src/Servicio/Twilio.php</span></td></tr>
|
|
996
1023
|
</tbody>
|
|
997
1024
|
</table>
|
|
998
1025
|
</div>
|
|
@@ -1004,11 +1031,9 @@ artiframe> <span class="fn">go</span> <span class="st">back</span>
|
|
|
1004
1031
|
<tr><th>dominio</th><th>Paquete de compositor</th></tr>
|
|
1005
1032
|
</thead>
|
|
1006
1033
|
<tbody>
|
|
1007
|
-
<tr><td><code>add phpmailer</code></td><td>phpmailer/phpmailer</td></tr>
|
|
1008
1034
|
<tr><td><code>add mpdf</code></td><td>mpdf/mpdf</td></tr>
|
|
1009
1035
|
<tr><td><code>add dompdf</code></td><td>dompdf/dompdf</td></tr>
|
|
1010
1036
|
<tr><td><code>add spreadsheet</code></td><td>phpoffice/phphoja de cálculo</td></tr>
|
|
1011
|
-
<tr><td><code>add qrcode</code></td><td>endroid/código qr</td></tr>
|
|
1012
1037
|
<tr><td><code>add guzzle</code></td><td>tragohttp/trago</td></tr>
|
|
1013
1038
|
<tr><td><code>add uuid</code></td><td>ramsey/uuid</td></tr>
|
|
1014
1039
|
<tr><td><code>add carbon</code></td><td>nesbot/carbono</td></tr>
|
|
@@ -1017,101 +1042,87 @@ artiframe> <span class="fn">go</span> <span class="st">back</span>
|
|
|
1017
1042
|
</table>
|
|
1018
1043
|
</div>
|
|
1019
1044
|
<div class="alert a-info">
|
|
1020
|
-
<strong>ℹ️ Consejo:</strong>
|
|
1021
|
-
</div>
|
|
1045
|
+
<strong>ℹ️ Consejo:</strong>Para ver la lista completa de instalados o compatibles simplemente abra la terminal<code>add list</code>puedes escribir. Puede encontrar el uso del código de los módulos en el menú "Servicios integrados" a la derecha.</div>
|
|
1022
1046
|
</section>
|
|
1023
|
-
|
|
1047
|
+
====== SERVICIOS INTEGRADOS ======
|
|
1024
1048
|
<section id="entegre-servisler">
|
|
1025
|
-
<h2>Servicios Integrados (Wrapper)
|
|
1026
|
-
<p>En lugar de utilizar paquetes populares directamente, ArtiFrame
|
|
1027
|
-
|
|
1028
|
-
|
|
1029
|
-
|
|
1030
|
-
|
|
1031
|
-
|
|
1032
|
-
|
|
1033
|
-
|
|
1034
|
-
|
|
1035
|
-
|
|
1036
|
-
|
|
1037
|
-
|
|
1038
|
-
|
|
1039
|
-
|
|
1040
|
-
|
|
1041
|
-
|
|
1042
|
-
|
|
1043
|
-
|
|
1044
|
-
|
|
1045
|
-
|
|
1046
|
-
|
|
1047
|
-
|
|
1048
|
-
<span class="
|
|
1049
|
-
|
|
1050
|
-
|
|
1051
|
-
|
|
1052
|
-
|
|
1053
|
-
|
|
1054
|
-
|
|
1055
|
-
|
|
1056
|
-
<span class="
|
|
1057
|
-
|
|
1058
|
-
|
|
1059
|
-
|
|
1060
|
-
|
|
1061
|
-
<
|
|
1062
|
-
<
|
|
1063
|
-
|
|
1064
|
-
|
|
1065
|
-
|
|
1066
|
-
|
|
1067
|
-
|
|
1068
|
-
|
|
1069
|
-
|
|
1070
|
-
|
|
1071
|
-
|
|
1072
|
-
|
|
1073
|
-
|
|
1074
|
-
|
|
1075
|
-
|
|
1076
|
-
|
|
1077
|
-
|
|
1078
|
-
|
|
1079
|
-
|
|
1080
|
-
|
|
1081
|
-
|
|
1082
|
-
|
|
1083
|
-
|
|
1084
|
-
|
|
1085
|
-
|
|
1086
|
-
|
|
1087
|
-
<span class="cm">//
|
|
1088
|
-
|
|
1089
|
-
|
|
1090
|
-
|
|
1091
|
-
|
|
1092
|
-
|
|
1093
|
-
<
|
|
1094
|
-
<span class="
|
|
1095
|
-
|
|
1096
|
-
<span class="cm">// 3. Enviar el correo</span>
|
|
1097
|
-
<span class="var">Mailer</span>::create()
|
|
1098
|
-
-><span class="fn">to</span>(<span class="st">'musteri@mail.com'</span>, <span class="st">'Ahmet Yılmaz'</span>)
|
|
1099
|
-
-><span class="fn">bcc</span>(<span class="st">'arsiv@sirket.com'</span>) <span class="cm">// El cliente no puede ver esto</span>
|
|
1100
|
-
-><span class="fn">subject</span>(<span class="st">'Siparişiniz Onaylandı: '</span> . <span class="var">$siparisNo</span>)
|
|
1101
|
-
-><span class="fn">html</span>(<span class="var">$htmlIcerik</span>)
|
|
1102
|
-
-><span class="fn">attach</span>(<span class="var">$pdfDosyasi</span>, <span class="st">'Siparis_Faturasi.pdf'</span>)
|
|
1103
|
-
-><span class="fn">send</span>();</code></pre>
|
|
1104
|
-
</div>
|
|
1105
|
-
|
|
1106
|
-
<div class="card" id="svc-iyzico">
|
|
1107
|
-
<h2>Iyzico <span class="tag b-core" style="padding: 1px 5px; margin-left: 2px; font-weight: bold;" title="Ücretli/Lisanslı Servis">$</span></h2>
|
|
1108
|
-
<div class="alert a-info" style="margin-top: 10px; padding: 10px 15px; font-size: 0.85em;"><strong>📌 Membresía y claves API:</strong> Para utilizar la infraestructura de pagos de Iyzico <a href="https://www.iyzico.com" style="color: var(--green); font-weight: bold;" target="_blank">iyzico.com</a> (en vivo) o <a href="https://sandbox-merchants.iyzipay.com/" style="color: var(--green); font-weight: bold;" target="_blank">sandbox.iyzipay.com</a> Debe crear una cuenta de vendedor a través de (prueba) y obtener sus claves API/secretas.</div>
|
|
1049
|
+
<h2>Servicios Integrados (Wrapper)<span class="tag b-core">talones</span></h2>
|
|
1050
|
+
<p>En lugar de utilizar paquetes populares directamente, ArtiFrame<strong>Envoltorio preconfigurado</strong>Ofrece clases para su uso.</p>
|
|
1051
|
+
<div class="card" id="svc-qrcode">
|
|
1052
|
+
<h2>Código QR</h2>
|
|
1053
|
+
<div class="alert a-info" style="margin-top: 10px; padding: 10px 15px; font-size: 0.85em;"><strong>📌 Clase inmersiva:</strong> <code>add qrcode</code>cuando ejecutas el comando<code>endroid/qr-code</code>La biblioteca está cargada y<code>src/Service/QrCode.php</code>Se crea la clase contenedora.</div>
|
|
1054
|
+
<p>Es una clase moderna y fluida que oculta los difíciles procesos de producción de objetos (Constructor/Escritor) de la biblioteca de Códigos QR de Endroid, donde puedes crear un código QR en una sola línea e incrustar un logotipo en él.</p>
|
|
1055
|
+
<h3 style="margin-top:20px; margin-bottom:10px; font-size: 1.1em; color: var(--text-color);">Métodos y usos</h3>
|
|
1056
|
+
<ul style="line-height: 1.6; margin-bottom: 20px;">
|
|
1057
|
+
<li><code>->generate('Metin')</code>: Especifica el texto o URL que se convertirá en un código QR e inicia la cadena.</li>
|
|
1058
|
+
<li><code>->size(300)</code>: Determina el ancho/alto del código QR en píxeles (por ejemplo: 300).</li>
|
|
1059
|
+
<li><code>->margin(10)</code>: Determina el espacio en blanco alrededor del código QR.</li>
|
|
1060
|
+
<li><code>->color('#000000', '#ffffff')</code>: Especifica los colores de primer plano (líneas) y de fondo como código HEX. (p.ej:<code>#000000, #ffffff</code>).</li>
|
|
1061
|
+
<li><code>->logo('/path/logo.png', 50, true)</code>: inserta una imagen (logotipo) en medio del código QR. Recupera la ruta física al logotipo, su tamaño y si se perforará el fondo.</li>
|
|
1062
|
+
<li><code>->format('png')</code>: Determina el formato de salida.<code>png</code>o<code>svg</code>es compatible. Predeterminado: png.</li>
|
|
1063
|
+
<li><code>->save('/path/save.png')</code>: Guarda el código QR creado en un archivo físico en el servidor.</li>
|
|
1064
|
+
<li><code>->base64()</code>: Código QR HTML<code><img src="..."></code>Lo devuelve como una cadena base64 para que puedas usarlo directamente dentro de la etiqueta.</li>
|
|
1065
|
+
<li><code>->output()</code>: imprime el código QR directamente en el navegador con los encabezados HTTP adecuados.</li>
|
|
1066
|
+
</ul>
|
|
1067
|
+
<h3 style="margin-top:20px; margin-bottom:10px; font-size: 1.1em; color: var(--text-color);">Ejemplos de uso</h3>
|
|
1068
|
+
<pre><code><span class="kw">usar</span> <span class="var">Aplicación\Servicio\QrCode</span>;
|
|
1069
|
+
<span class="cm">// Ejemplo 1: Imprimir una imagen HTML en la pantalla</span>
|
|
1070
|
+
<span class="var">$base64</span> = <span class="var">Código QR</span>::generate(<span class="st">'https://artiframe.dev'</span>)
|
|
1071
|
+
-><span class="fn">tú</span>(400)
|
|
1072
|
+
-><span class="fn">logo</span>(<span class="var">$_SERVIDOR</span>[<span class="st">'DOCUMENT_ROOT'</span>] . <span class="st">'/activos/logo.png'</span>)
|
|
1073
|
+
-><span class="fn">base64</span>();
|
|
1074
|
+
<span class="kw">eco</span> <span class="st">'<img src="'</span> . <span class="var">$base64</span> . <span class="st">'"alt="QR">'</span>;
|
|
1075
|
+
<span class="cm">// Ejemplo 2: Guardar como PNG físico</span>
|
|
1076
|
+
<span class="var">Código QR</span>::generate(<span class="st">'Información VCARD'</span>)
|
|
1077
|
+
-><span class="fn">color</span>(<span class="st">'#ff0000'</span>, <span class="st">'#ffffff'</span>)
|
|
1078
|
+
-><span class="fn">ahorrar</span>(<span class="st">'/temp/user_card.png'</span>);
|
|
1079
|
+
<span class="cm">// Ejemplo 3: enviar una imagen al navegador como punto final API</span>
|
|
1080
|
+
<span class="var">Código QR</span>::generate(<span class="st">'https://artilingo.com'</span>)-><span class="fn">producción</span>();</code></pre>
|
|
1081
|
+
</div>
|
|
1082
|
+
<div class="card" id="svc-phpmailer">
|
|
1083
|
+
<h2>PHPMailer (correo)</h2>
|
|
1084
|
+
<div class="alert a-info" style="margin-top: 10px; padding: 10px 15px; font-size: 0.85em;"><strong>📌 Instalación automática de .env:</strong> <code>add phpmailer</code>Configuración de SMTP cuando ejecuta el comando<code>.env</code>agregado automáticamente a su archivo y<code>src/Service/Mailer.php</code>Se crea la clase.</div>
|
|
1085
|
+
<p>Es una clase Wrapper mucho más moderna, fluida y segura (protegida por CRLF) que se ejecuta en la biblioteca PHPMailer. Todos los métodos ofrecidos por la clase son encadenables.</p>
|
|
1086
|
+
<h3 style="margin-top:20px; margin-bottom:10px; font-size: 1.1em; color: var(--text-color);">Métodos y usos</h3>
|
|
1087
|
+
<ul style="line-height: 1.6; margin-bottom: 20px;">
|
|
1088
|
+
<li><code>->to('mail@adres.com', 'İsim')</code>: determina a quién se enviará el correo electrónico.</li>
|
|
1089
|
+
<li><code>->cc('mail@adres.com')</code>: Agrega destinatarios de información (copia carbón).</li>
|
|
1090
|
+
<li><code>->bcc('mail@adres.com')</code>: Agrega destinatarios de Copia oculta. Los destinatarios principales no pueden ver estas direcciones.</li>
|
|
1091
|
+
<li><code>->subject('Konu')</code>: Determina el título (asunto) del correo electrónico.</li>
|
|
1092
|
+
<li><code>->attach('/path/fatura.pdf', 'Isim.pdf')</code>: Coloca un archivo físico en el servidor (o temporal) en el correo electrónico como archivo adjunto.</li>
|
|
1093
|
+
<li><code>->embedImage('/path/logo.png', 'logo_cid')</code>: Para ser utilizado en HTML dentro del correo electrónico (<code><img src="cid:logo_cid"></code>) incrusta imágenes.</li>
|
|
1094
|
+
<li><code>->html('HTML Kodu')</code>: establece el contenido HTML del correo electrónico. Crea automáticamente una versión de texto sin formato (AltBody) por seguridad.</li>
|
|
1095
|
+
<li><code>->text('Düz Metin')</code>: Se utiliza si desea enviar el correo electrónico sólo en texto sin formato.</li>
|
|
1096
|
+
<li><code>->send()</code>: Completa todas las transacciones en la cadena y envía el correo electrónico vía SMTP. Si hay un error, arroja una excepción.</li>
|
|
1097
|
+
</ul>
|
|
1098
|
+
<h3 style="margin-top:20px; margin-bottom:10px; font-size: 1.1em; color: var(--text-color);">Ejemplo avanzado: plantilla PHP (ver) y envío dinámico de archivos</h3>
|
|
1099
|
+
<p>Si no desea escribir el contenido HTML del correo electrónico en una cadena como código espagueti,<code>ob_start()</code>Puede importar un archivo de plantilla PHP externo (con variables dentro) e incrustar un PDF generado por el sistema directamente en el correo electrónico usando:</p>
|
|
1100
|
+
<pre><code><span class="kw">usar</span> <span class="var">Aplicación\Servicio\Correo</span>;
|
|
1101
|
+
<span class="cm">// 1. Tus datos dinámicos</span>
|
|
1102
|
+
<span class="var">$pedidoNo</span> = <span class="st">'#90210'</span>;
|
|
1103
|
+
<span class="var">$pdfArchivo</span> = <span class="var">$_SERVIDOR</span>[<span class="st">'DOCUMENT_ROOT'</span>] . <span class="st">'/temp/invoice_90210.pdf'</span>;
|
|
1104
|
+
<span class="cm">// 2. Cargando la plantilla HTML desde fuera (Búfer de salida)</span>
|
|
1105
|
+
<span class="fn">ob_start</span>();
|
|
1106
|
+
<span class="kw">requerir_una vez</span> <span class="var">$_SERVIDOR</span>[<span class="st">'DOCUMENT_ROOT'</span>] . <span class="st">'/vistas/correo electrónico/pedido.php'</span>;
|
|
1107
|
+
<span class="var">$htmlContenido</span> = <span class="fn">ob_get_clean</span>();
|
|
1108
|
+
<span class="cm">// 3. Envío del correo electrónico</span>
|
|
1109
|
+
<span class="var">Remitente</span>::create()
|
|
1110
|
+
-><span class="fn">a</span>(<span class="st">'custeri@mail.com'</span>, <span class="st">'Ahmet Yilmaz'</span>)
|
|
1111
|
+
-><span class="fn">bcc</span>(<span class="st">'archivo@empresa.com'</span>) <span class="cm">// El cliente no puede ver esto</span>
|
|
1112
|
+
-><span class="fn">sujeto</span>(<span class="st">'Su pedido confirmado:'</span> . <span class="var">$pedidoNo</span>)
|
|
1113
|
+
-><span class="fn">HTML</span>(<span class="var">$htmlContenido</span>)
|
|
1114
|
+
-><span class="fn">adjuntar</span>(<span class="var">$pdfArchivo</span>, <span class="st">'Pedido_Factura.pdf'</span>)
|
|
1115
|
+
-><span class="fn">enviar</span>();</code></pre>
|
|
1116
|
+
</div>
|
|
1117
|
+
<div class="card" id="svc-iyzico">
|
|
1118
|
+
<h2>Iyzico<span class="tag b-core" style="padding: 1px 5px; margin-left: 2px; font-weight: bold;" title="Servicio pago/con licencia">$</span></h2>
|
|
1119
|
+
<div class="alert a-info" style="margin-top: 10px; padding: 10px 15px; font-size: 0.85em;"><strong>📌 Membresía y claves API:</strong>Para utilizar la infraestructura de pago de Iyzico<a href="https://www.iyzico.com" style="color: var(--green); font-weight: bold;" target="_blank">iyzico.com</a>(en vivo) o<a href="https://sandbox-merchants.iyzipay.com/" style="color: var(--green); font-weight: bold;" target="_blank">sandbox.iyzipay.com</a>Debe crear una cuenta de vendedor a través de (prueba) y obtener sus claves API/secretas.</div>
|
|
1109
1120
|
<div class="code-badge" style="margin-bottom: 15px; padding: 10px; background: rgba(0,0,0,0.2); border: 1px solid rgba(255,255,255,0.05); border-radius: 6px; font-family: monospace;">
|
|
1110
1121
|
<strong>Ubicación de la clase:</strong> <code style="color: #4ade80;">src/Service/Iyzico.php</code>
|
|
1111
1122
|
</div>
|
|
1112
1123
|
<p style="margin-bottom: 15px; font-size: 0.95em; color: #a1a1aa;">Servicio de pago Iyzico<br/>Proporciona un contenedor limpio alrededor del SDK iyzipay-php para el procesamiento de pagos.<br/>Flujos 3D Secure, reembolsos, cancelaciones, bóveda de tarjetas y subcomerciantes del mercado.<br/>Variables de entorno requeridas:<br/>IYZICO_API_KEY — Su clave API de iyzico<br/>IYZICO_SECRET_KEY — Tu clave secreta de iyzico<br/>IYZICO_BASE_URL: URL base de API (https://sandbox-api.iyzipay.com o https://api.iyzipay.com)</p>
|
|
1113
1124
|
<div class="alert a-info" style="margin-bottom: 20px;">
|
|
1114
|
-
<strong>ℹ️ Devolución estándar:</strong>
|
|
1125
|
+
<strong>ℹ️ Devolución estándar:</strong>Todos los métodos<code>['status' => 'success|error', 'message' => '...', 'data' => [...]]</code>Convierte una cadena estándar en el formato (con excepciones).<strong>en la matriz devuelta en la sección "Retorno esperado" a continuación.<code>data</code>Se muestra la estructura detallada de la clave.</strong>
|
|
1115
1126
|
</div>
|
|
1116
1127
|
<h3>Métodos y ejemplos de uso</h3>
|
|
1117
1128
|
<div class="accordion-group">
|
|
@@ -1153,7 +1164,6 @@ artiframe> <span class="fn">go</span> <span class="st">back</span>
|
|
|
1153
1164
|
<div style="flex: 1; min-width: 250px; max-width: 100%; box-sizing: border-box; overflow: hidden;">
|
|
1154
1165
|
<h4 style="margin-bottom: 8px; font-size: 0.9em; color: #9ca3af;">Uso de ejemplo:</h4>
|
|
1155
1166
|
<pre style="background: rgba(15,23,42,0.6); padding: 10px; border-radius: 4px; font-size: 0.85em; overflow-x: auto; color: #34d399; border: 1px solid rgba(52,211,153,0.2); margin: 0; height: 100%; box-sizing: border-box; max-width: 100%;"><code>$iyzico = new \Service\Iyzico();
|
|
1156
|
-
|
|
1157
1167
|
$response = $iyzico->pay([
|
|
1158
1168
|
'price' => 150.50,
|
|
1159
1169
|
'paidPrice' => 160.00,
|
|
@@ -1186,7 +1196,6 @@ $response = $iyzico->pay([
|
|
|
1186
1196
|
]
|
|
1187
1197
|
]
|
|
1188
1198
|
]);
|
|
1189
|
-
|
|
1190
1199
|
if ($response['status'] === 'success') {
|
|
1191
1200
|
$paymentId = $response['data']['paymentId'];
|
|
1192
1201
|
echo "Ödeme başarılı! ID: " . $paymentId;
|
|
@@ -1219,7 +1228,6 @@ if ($response['status'] === 'success') {
|
|
|
1219
1228
|
<div style="flex: 1; min-width: 250px; max-width: 100%; box-sizing: border-box; overflow: hidden;">
|
|
1220
1229
|
<h4 style="margin-bottom: 8px; font-size: 0.9em; color: #9ca3af;">Uso de ejemplo:</h4>
|
|
1221
1230
|
<pre style="background: rgba(15,23,42,0.6); padding: 10px; border-radius: 4px; font-size: 0.85em; overflow-x: auto; color: #34d399; border: 1px solid rgba(52,211,153,0.2); margin: 0; height: 100%; box-sizing: border-box; max-width: 100%;"><code>$iyzico = new \Service\Iyzico();
|
|
1222
|
-
|
|
1223
1231
|
$response = $iyzico->threeDSecureInit([
|
|
1224
1232
|
'price' => 500.00,
|
|
1225
1233
|
'paidPrice' => 500.00,
|
|
@@ -1253,7 +1261,6 @@ $response = $iyzico->threeDSecureInit([
|
|
|
1253
1261
|
]
|
|
1254
1262
|
]
|
|
1255
1263
|
]);
|
|
1256
|
-
|
|
1257
1264
|
if ($response['status'] === 'success') {
|
|
1258
1265
|
// Bankanın 3D doğrulama sayfasına yönlendirecek HTML formu
|
|
1259
1266
|
echo $response['data']['threeDSHtmlContent'];
|
|
@@ -1285,10 +1292,8 @@ if ($response['status'] === 'success') {
|
|
|
1285
1292
|
<div style="flex: 1; min-width: 250px; max-width: 100%; box-sizing: border-box; overflow: hidden;">
|
|
1286
1293
|
<h4 style="margin-bottom: 8px; font-size: 0.9em; color: #9ca3af;">Uso de ejemplo:</h4>
|
|
1287
1294
|
<pre style="background: rgba(15,23,42,0.6); padding: 10px; border-radius: 4px; font-size: 0.85em; overflow-x: auto; color: #34d399; border: 1px solid rgba(52,211,153,0.2); margin: 0; height: 100%; box-sizing: border-box; max-width: 100%;"><code>$iyzico = new \Service\Iyzico();
|
|
1288
|
-
|
|
1289
1295
|
// Bankadan dönen POST verisi (paymentId ve conversationData vb.)
|
|
1290
1296
|
$response = $iyzico->threeDSecureComplete($_POST);
|
|
1291
|
-
|
|
1292
1297
|
if ($response['status'] === 'success') {
|
|
1293
1298
|
echo "3D Doğrulama başarılı, ödeme çekildi: " . $response['data']['paymentId'];
|
|
1294
1299
|
}</code></pre>
|
|
@@ -1319,9 +1324,7 @@ if ($response['status'] === 'success') {
|
|
|
1319
1324
|
<div style="flex: 1; min-width: 250px; max-width: 100%; box-sizing: border-box; overflow: hidden;">
|
|
1320
1325
|
<h4 style="margin-bottom: 8px; font-size: 0.9em; color: #9ca3af;">Uso de ejemplo:</h4>
|
|
1321
1326
|
<pre style="background: rgba(15,23,42,0.6); padding: 10px; border-radius: 4px; font-size: 0.85em; overflow-x: auto; color: #34d399; border: 1px solid rgba(52,211,153,0.2); margin: 0; height: 100%; box-sizing: border-box; max-width: 100%;"><code>$iyzico = new \Service\Iyzico();
|
|
1322
|
-
|
|
1323
1327
|
$response = $iyzico->refund('dummy_data', $price);
|
|
1324
|
-
|
|
1325
1328
|
if ($response['status'] === 'success') {
|
|
1326
1329
|
// Başarılı
|
|
1327
1330
|
}</code></pre>
|
|
@@ -1350,9 +1353,7 @@ if ($response['status'] === 'success') {
|
|
|
1350
1353
|
<div style="flex: 1; min-width: 250px; max-width: 100%; box-sizing: border-box; overflow: hidden;">
|
|
1351
1354
|
<h4 style="margin-bottom: 8px; font-size: 0.9em; color: #9ca3af;">Uso de ejemplo:</h4>
|
|
1352
1355
|
<pre style="background: rgba(15,23,42,0.6); padding: 10px; border-radius: 4px; font-size: 0.85em; overflow-x: auto; color: #34d399; border: 1px solid rgba(52,211,153,0.2); margin: 0; height: 100%; box-sizing: border-box; max-width: 100%;"><code>$iyzico = new \Service\Iyzico();
|
|
1353
|
-
|
|
1354
1356
|
$response = $iyzico->cancel('dummy_data');
|
|
1355
|
-
|
|
1356
1357
|
if ($response['status'] === 'success') {
|
|
1357
1358
|
// Başarılı
|
|
1358
1359
|
}</code></pre>
|
|
@@ -1388,9 +1389,7 @@ if ($response['status'] === 'success') {
|
|
|
1388
1389
|
<div style="flex: 1; min-width: 250px; max-width: 100%; box-sizing: border-box; overflow: hidden;">
|
|
1389
1390
|
<h4 style="margin-bottom: 8px; font-size: 0.9em; color: #9ca3af;">Uso de ejemplo:</h4>
|
|
1390
1391
|
<pre style="background: rgba(15,23,42,0.6); padding: 10px; border-radius: 4px; font-size: 0.85em; overflow-x: auto; color: #34d399; border: 1px solid rgba(52,211,153,0.2); margin: 0; height: 100%; box-sizing: border-box; max-width: 100%;"><code>$iyzico = new \Service\Iyzico();
|
|
1391
|
-
|
|
1392
1392
|
$response = $iyzico->saveCard($cardData, $email);
|
|
1393
|
-
|
|
1394
1393
|
if ($response['status'] === 'success') {
|
|
1395
1394
|
// Başarılı
|
|
1396
1395
|
}</code></pre>
|
|
@@ -1421,9 +1420,7 @@ if ($response['status'] === 'success') {
|
|
|
1421
1420
|
<div style="flex: 1; min-width: 250px; max-width: 100%; box-sizing: border-box; overflow: hidden;">
|
|
1422
1421
|
<h4 style="margin-bottom: 8px; font-size: 0.9em; color: #9ca3af;">Uso de ejemplo:</h4>
|
|
1423
1422
|
<pre style="background: rgba(15,23,42,0.6); padding: 10px; border-radius: 4px; font-size: 0.85em; overflow-x: auto; color: #34d399; border: 1px solid rgba(52,211,153,0.2); margin: 0; height: 100%; box-sizing: border-box; max-width: 100%;"><code>$iyzico = new \Service\Iyzico();
|
|
1424
|
-
|
|
1425
1423
|
$response = $iyzico->listCards($cardUserKey);
|
|
1426
|
-
|
|
1427
1424
|
if ($response['status'] === 'success') {
|
|
1428
1425
|
// Başarılı
|
|
1429
1426
|
}</code></pre>
|
|
@@ -1452,9 +1449,7 @@ if ($response['status'] === 'success') {
|
|
|
1452
1449
|
<div style="flex: 1; min-width: 250px; max-width: 100%; box-sizing: border-box; overflow: hidden;">
|
|
1453
1450
|
<h4 style="margin-bottom: 8px; font-size: 0.9em; color: #9ca3af;">Uso de ejemplo:</h4>
|
|
1454
1451
|
<pre style="background: rgba(15,23,42,0.6); padding: 10px; border-radius: 4px; font-size: 0.85em; overflow-x: auto; color: #34d399; border: 1px solid rgba(52,211,153,0.2); margin: 0; height: 100%; box-sizing: border-box; max-width: 100%;"><code>$iyzico = new \Service\Iyzico();
|
|
1455
|
-
|
|
1456
1452
|
$response = $iyzico->checkPayment('dummy_data');
|
|
1457
|
-
|
|
1458
1453
|
if ($response['status'] === 'success') {
|
|
1459
1454
|
// Başarılı
|
|
1460
1455
|
}</code></pre>
|
|
@@ -1495,9 +1490,7 @@ if ($response['status'] === 'success') {
|
|
|
1495
1490
|
<div style="flex: 1; min-width: 250px; max-width: 100%; box-sizing: border-box; overflow: hidden;">
|
|
1496
1491
|
<h4 style="margin-bottom: 8px; font-size: 0.9em; color: #9ca3af;">Uso de ejemplo:</h4>
|
|
1497
1492
|
<pre style="background: rgba(15,23,42,0.6); padding: 10px; border-radius: 4px; font-size: 0.85em; overflow-x: auto; color: #34d399; border: 1px solid rgba(52,211,153,0.2); margin: 0; height: 100%; box-sizing: border-box; max-width: 100%;"><code>$iyzico = new \Service\Iyzico();
|
|
1498
|
-
|
|
1499
1493
|
$response = $iyzico->createSubMerchant($data);
|
|
1500
|
-
|
|
1501
1494
|
if ($response['status'] === 'success') {
|
|
1502
1495
|
// Başarılı
|
|
1503
1496
|
}</code></pre>
|
|
@@ -1515,14 +1508,14 @@ if ($response['status'] === 'success') {
|
|
|
1515
1508
|
</div>
|
|
1516
1509
|
</div>
|
|
1517
1510
|
<div class="card" id="svc-stripe">
|
|
1518
|
-
<h2>
|
|
1519
|
-
<div class="alert a-info" style="margin-top: 10px; padding: 10px 15px; font-size: 0.85em;"><strong>📌 Membresía y claves API:</strong>
|
|
1511
|
+
<h2>Raya<span class="tag b-core" style="padding: 1px 5px; margin-left: 2px; font-weight: bold;" title="Servicio pago/con licencia">$</span></h2>
|
|
1512
|
+
<div class="alert a-info" style="margin-top: 10px; padding: 10px 15px; font-size: 0.85em;"><strong>📌 Membresía y claves API:</strong>Para utilizar la infraestructura de pago global de Stripe<a href="https://stripe.com" style="color: var(--green); font-weight: bold;" target="_blank">raya.com</a>Debe crear una cuenta y obtener sus claves pública y secreta desde el panel de desarrollador.</div>
|
|
1520
1513
|
<div class="code-badge" style="margin-bottom: 15px; padding: 10px; background: rgba(0,0,0,0.2); border: 1px solid rgba(255,255,255,0.05); border-radius: 6px; font-family: monospace;">
|
|
1521
1514
|
<strong>Ubicación de la clase:</strong> <code style="color: #4ade80;">src/Service/Stripe.php</code>
|
|
1522
1515
|
</div>
|
|
1523
|
-
<p style="margin-bottom: 15px; font-size: 0.95em; color: #a1a1aa;">Servicio de pago de
|
|
1516
|
+
<p style="margin-bottom: 15px; font-size: 0.95em; color: #a1a1aa;">Servicio de pago de rayas<br/>Proporciona un contenedor limpio alrededor del SDK stripe-php para el procesamiento de pagos.<br/>gestión de clientes, suscripciones, creación de productos y manejo de webhooks.<br/>Variables de entorno requeridas:<br/>STRIPE_SECRET_KEY: tu clave API secreta de Stripe<br/>STRIPE_PUBLISHABLE_KEY: tu clave publicable de Stripe (para referencia del front-end)<br/>STRIPE_WEBHOOK_SECRET — Secreto de firma del punto final del Webhook</p>
|
|
1524
1517
|
<div class="alert a-info" style="margin-bottom: 20px;">
|
|
1525
|
-
<strong>ℹ️ Devolución estándar:</strong>
|
|
1518
|
+
<strong>ℹ️ Devolución estándar:</strong>Todos los métodos<code>['status' => 'success|error', 'message' => '...', 'data' => [...]]</code>Convierte una cadena estándar en el formato (con excepciones).<strong>en la matriz devuelta en la sección "Retorno esperado" a continuación.<code>data</code>Se muestra la estructura detallada de la clave.</strong>
|
|
1526
1519
|
</div>
|
|
1527
1520
|
<h3>Métodos y ejemplos de uso</h3>
|
|
1528
1521
|
<div class="accordion-group">
|
|
@@ -1541,12 +1534,10 @@ if ($response['status'] === 'success') {
|
|
|
1541
1534
|
<div style="flex: 1; min-width: 250px; max-width: 100%; box-sizing: border-box; overflow: hidden;">
|
|
1542
1535
|
<h4 style="margin-bottom: 8px; font-size: 0.9em; color: #9ca3af;">Uso de ejemplo:</h4>
|
|
1543
1536
|
<pre style="background: rgba(15,23,42,0.6); padding: 10px; border-radius: 4px; font-size: 0.85em; overflow-x: auto; color: #34d399; border: 1px solid rgba(52,211,153,0.2); margin: 0; height: 100%; box-sizing: border-box; max-width: 100%;"><code>$stripe = new \Service\Stripe();
|
|
1544
|
-
|
|
1545
1537
|
$response = $stripe->createPaymentIntent(199.50, 'usd', [
|
|
1546
1538
|
'order_id' => 'ORD-54321',
|
|
1547
1539
|
'customer_email' => 'utku@artilingo.com'
|
|
1548
1540
|
]);
|
|
1549
|
-
|
|
1550
1541
|
if ($response['status'] === 'success') {
|
|
1551
1542
|
$clientSecret = $response['data']['clientSecret'];
|
|
1552
1543
|
echo json_encode(['clientSecret' => $clientSecret]);
|
|
@@ -1576,9 +1567,7 @@ if ($response['status'] === 'success') {
|
|
|
1576
1567
|
<div style="flex: 1; min-width: 250px; max-width: 100%; box-sizing: border-box; overflow: hidden;">
|
|
1577
1568
|
<h4 style="margin-bottom: 8px; font-size: 0.9em; color: #9ca3af;">Uso de ejemplo:</h4>
|
|
1578
1569
|
<pre style="background: rgba(15,23,42,0.6); padding: 10px; border-radius: 4px; font-size: 0.85em; overflow-x: auto; color: #34d399; border: 1px solid rgba(52,211,153,0.2); margin: 0; height: 100%; box-sizing: border-box; max-width: 100%;"><code>$stripe = new \Service\Stripe();
|
|
1579
|
-
|
|
1580
1570
|
$response = $stripe->confirmPayment('dummy_data');
|
|
1581
|
-
|
|
1582
1571
|
if ($response['status'] === 'success') {
|
|
1583
1572
|
// Başarılı
|
|
1584
1573
|
}</code></pre>
|
|
@@ -1597,7 +1586,7 @@ if ($response['status'] === 'success') {
|
|
|
1597
1586
|
<details class="accordion" style="margin-bottom: 10px; border: 1px solid rgba(255,255,255,0.1); border-radius: 6px; padding: 5px; background: rgba(0,0,0,0.1); box-sizing: border-box; max-width: 100%;">
|
|
1598
1587
|
<summary style="cursor: pointer; padding: 10px; font-weight: bold; background: rgba(255,255,255,0.05); color: #fff; border-radius: 4px; box-sizing: border-box; max-width: 100%; word-break: break-all;"><code style="background: transparent; color: #60a5fa; font-size: 1.1em; white-space: pre-wrap; word-break: break-all;">charge(float $amount, string $source, string $currency = 'usd', string $description = '')</code></summary>
|
|
1599
1588
|
<div class="accordion-content" style="padding: 15px; border-top: 1px solid rgba(255,255,255,0.05); box-sizing: border-box; max-width: 100%; overflow-x: hidden;">
|
|
1600
|
-
<p style="color: #d1d5db; margin-bottom: 15px; word-wrap: break-word;">Crear un cargo directo (flujo heredado). Utilice createPaymentIntent() para nuevas integraciones. Este método se proporciona para compatibilidad con versiones anteriores de flujos basados en
|
|
1589
|
+
<p style="color: #d1d5db; margin-bottom: 15px; word-wrap: break-word;">Crear un cargo directo (flujo heredado). Utilice createPaymentIntent() para nuevas integraciones. Este método se proporciona para compatibilidad con versiones anteriores de flujos basados en tokens/fuentes.</p>
|
|
1601
1590
|
<div style="display: flex; flex-direction: column; gap: 15px; box-sizing: border-box; width: 100%; max-width: 100%;">
|
|
1602
1591
|
<div style="flex: 1; max-width: 100%; box-sizing: border-box; overflow: hidden;">
|
|
1603
1592
|
<h4 style="margin-bottom: 8px; font-size: 0.9em; color: #9ca3af;">Estructura de parámetros:</h4>
|
|
@@ -1610,9 +1599,7 @@ if ($response['status'] === 'success') {
|
|
|
1610
1599
|
<div style="flex: 1; min-width: 250px; max-width: 100%; box-sizing: border-box; overflow: hidden;">
|
|
1611
1600
|
<h4 style="margin-bottom: 8px; font-size: 0.9em; color: #9ca3af;">Uso de ejemplo:</h4>
|
|
1612
1601
|
<pre style="background: rgba(15,23,42,0.6); padding: 10px; border-radius: 4px; font-size: 0.85em; overflow-x: auto; color: #34d399; border: 1px solid rgba(52,211,153,0.2); margin: 0; height: 100%; box-sizing: border-box; max-width: 100%;"><code>$stripe = new \Service\Stripe();
|
|
1613
|
-
|
|
1614
1602
|
$response = $stripe->charge($amount, $source);
|
|
1615
|
-
|
|
1616
1603
|
if ($response['status'] === 'success') {
|
|
1617
1604
|
// Başarılı
|
|
1618
1605
|
}</code></pre>
|
|
@@ -1642,9 +1629,7 @@ if ($response['status'] === 'success') {
|
|
|
1642
1629
|
<div style="flex: 1; min-width: 250px; max-width: 100%; box-sizing: border-box; overflow: hidden;">
|
|
1643
1630
|
<h4 style="margin-bottom: 8px; font-size: 0.9em; color: #9ca3af;">Uso de ejemplo:</h4>
|
|
1644
1631
|
<pre style="background: rgba(15,23,42,0.6); padding: 10px; border-radius: 4px; font-size: 0.85em; overflow-x: auto; color: #34d399; border: 1px solid rgba(52,211,153,0.2); margin: 0; height: 100%; box-sizing: border-box; max-width: 100%;"><code>$stripe = new \Service\Stripe();
|
|
1645
|
-
|
|
1646
1632
|
$response = $stripe->refund('dummy_data');
|
|
1647
|
-
|
|
1648
1633
|
if ($response['status'] === 'success') {
|
|
1649
1634
|
// Başarılı
|
|
1650
1635
|
}</code></pre>
|
|
@@ -1675,9 +1660,7 @@ if ($response['status'] === 'success') {
|
|
|
1675
1660
|
<div style="flex: 1; min-width: 250px; max-width: 100%; box-sizing: border-box; overflow: hidden;">
|
|
1676
1661
|
<h4 style="margin-bottom: 8px; font-size: 0.9em; color: #9ca3af;">Uso de ejemplo:</h4>
|
|
1677
1662
|
<pre style="background: rgba(15,23,42,0.6); padding: 10px; border-radius: 4px; font-size: 0.85em; overflow-x: auto; color: #34d399; border: 1px solid rgba(52,211,153,0.2); margin: 0; height: 100%; box-sizing: border-box; max-width: 100%;"><code>$stripe = new \Service\Stripe();
|
|
1678
|
-
|
|
1679
1663
|
$response = $stripe->createCustomer($email);
|
|
1680
|
-
|
|
1681
1664
|
if ($response['status'] === 'success') {
|
|
1682
1665
|
// Başarılı
|
|
1683
1666
|
}</code></pre>
|
|
@@ -1706,9 +1689,7 @@ if ($response['status'] === 'success') {
|
|
|
1706
1689
|
<div style="flex: 1; min-width: 250px; max-width: 100%; box-sizing: border-box; overflow: hidden;">
|
|
1707
1690
|
<h4 style="margin-bottom: 8px; font-size: 0.9em; color: #9ca3af;">Uso de ejemplo:</h4>
|
|
1708
1691
|
<pre style="background: rgba(15,23,42,0.6); padding: 10px; border-radius: 4px; font-size: 0.85em; overflow-x: auto; color: #34d399; border: 1px solid rgba(52,211,153,0.2); margin: 0; height: 100%; box-sizing: border-box; max-width: 100%;"><code>$stripe = new \Service\Stripe();
|
|
1709
|
-
|
|
1710
1692
|
$response = $stripe->subscribe('dummy_data', 'dummy_data');
|
|
1711
|
-
|
|
1712
1693
|
if ($response['status'] === 'success') {
|
|
1713
1694
|
// Başarılı
|
|
1714
1695
|
}</code></pre>
|
|
@@ -1737,9 +1718,7 @@ if ($response['status'] === 'success') {
|
|
|
1737
1718
|
<div style="flex: 1; min-width: 250px; max-width: 100%; box-sizing: border-box; overflow: hidden;">
|
|
1738
1719
|
<h4 style="margin-bottom: 8px; font-size: 0.9em; color: #9ca3af;">Uso de ejemplo:</h4>
|
|
1739
1720
|
<pre style="background: rgba(15,23,42,0.6); padding: 10px; border-radius: 4px; font-size: 0.85em; overflow-x: auto; color: #34d399; border: 1px solid rgba(52,211,153,0.2); margin: 0; height: 100%; box-sizing: border-box; max-width: 100%;"><code>$stripe = new \Service\Stripe();
|
|
1740
|
-
|
|
1741
1721
|
$response = $stripe->cancelSubscription('dummy_data');
|
|
1742
|
-
|
|
1743
1722
|
if ($response['status'] === 'success') {
|
|
1744
1723
|
// Başarılı
|
|
1745
1724
|
}</code></pre>
|
|
@@ -1770,9 +1749,7 @@ if ($response['status'] === 'success') {
|
|
|
1770
1749
|
<div style="flex: 1; min-width: 250px; max-width: 100%; box-sizing: border-box; overflow: hidden;">
|
|
1771
1750
|
<h4 style="margin-bottom: 8px; font-size: 0.9em; color: #9ca3af;">Uso de ejemplo:</h4>
|
|
1772
1751
|
<pre style="background: rgba(15,23,42,0.6); padding: 10px; border-radius: 4px; font-size: 0.85em; overflow-x: auto; color: #34d399; border: 1px solid rgba(52,211,153,0.2); margin: 0; height: 100%; box-sizing: border-box; max-width: 100%;"><code>$stripe = new \Service\Stripe();
|
|
1773
|
-
|
|
1774
1752
|
$response = $stripe->createProduct('dummy_data', $price);
|
|
1775
|
-
|
|
1776
1753
|
if ($response['status'] === 'success') {
|
|
1777
1754
|
// Başarılı
|
|
1778
1755
|
}</code></pre>
|
|
@@ -1802,9 +1779,7 @@ if ($response['status'] === 'success') {
|
|
|
1802
1779
|
<div style="flex: 1; min-width: 250px; max-width: 100%; box-sizing: border-box; overflow: hidden;">
|
|
1803
1780
|
<h4 style="margin-bottom: 8px; font-size: 0.9em; color: #9ca3af;">Uso de ejemplo:</h4>
|
|
1804
1781
|
<pre style="background: rgba(15,23,42,0.6); padding: 10px; border-radius: 4px; font-size: 0.85em; overflow-x: auto; color: #34d399; border: 1px solid rgba(52,211,153,0.2); margin: 0; height: 100%; box-sizing: border-box; max-width: 100%;"><code>$stripe = new \Service\Stripe();
|
|
1805
|
-
|
|
1806
1782
|
$response = $stripe->webhook($payload, $signature);
|
|
1807
|
-
|
|
1808
1783
|
if ($response['status'] === 'success') {
|
|
1809
1784
|
// Başarılı
|
|
1810
1785
|
}</code></pre>
|
|
@@ -1833,9 +1808,7 @@ if ($response['status'] === 'success') {
|
|
|
1833
1808
|
<div style="flex: 1; min-width: 250px; max-width: 100%; box-sizing: border-box; overflow: hidden;">
|
|
1834
1809
|
<h4 style="margin-bottom: 8px; font-size: 0.9em; color: #9ca3af;">Uso de ejemplo:</h4>
|
|
1835
1810
|
<pre style="background: rgba(15,23,42,0.6); padding: 10px; border-radius: 4px; font-size: 0.85em; overflow-x: auto; color: #34d399; border: 1px solid rgba(52,211,153,0.2); margin: 0; height: 100%; box-sizing: border-box; max-width: 100%;"><code>$stripe = new \Service\Stripe();
|
|
1836
|
-
|
|
1837
1811
|
$response = $stripe->listPayments();
|
|
1838
|
-
|
|
1839
1812
|
if ($response['status'] === 'success') {
|
|
1840
1813
|
// Başarılı
|
|
1841
1814
|
}</code></pre>
|
|
@@ -1860,7 +1833,7 @@ if ($response['status'] === 'success') {
|
|
|
1860
1833
|
</div>
|
|
1861
1834
|
<p style="margin-bottom: 15px; font-size: 0.95em; color: #a1a1aa;">Servicio de autenticación JWT<br/>Proporciona un contenedor limpio alrededor de firebase/php-jwt para la generación de tokens,<br/>verificación, actualización e integración de middleware HTTP.<br/>Variables de entorno requeridas:<br/>JWT_SECRET_KEY — Clave secreta utilizada para firmar y verificar tokens<br/>JWT_ALGORITHM: algoritmo de firma (por ejemplo, HS256, HS384, HS512)<br/>JWT_EXPIRY: duración predeterminada del token en segundos (por ejemplo, 3600)</p>
|
|
1862
1835
|
<div class="alert a-info" style="margin-bottom: 20px;">
|
|
1863
|
-
<strong>ℹ️ Devolución estándar:</strong>
|
|
1836
|
+
<strong>ℹ️ Devolución estándar:</strong>Todos los métodos<code>['status' => 'success|error', 'message' => '...', 'data' => [...]]</code>Convierte una cadena estándar en el formato (con excepciones).<strong>en la matriz devuelta en la sección "Retorno esperado" a continuación.<code>data</code>Se muestra la estructura detallada de la clave.</strong>
|
|
1864
1837
|
</div>
|
|
1865
1838
|
<h3>Métodos y ejemplos de uso</h3>
|
|
1866
1839
|
<div class="accordion-group">
|
|
@@ -1878,13 +1851,11 @@ if ($response['status'] === 'success') {
|
|
|
1878
1851
|
<div style="flex: 1; min-width: 250px; max-width: 100%; box-sizing: border-box; overflow: hidden;">
|
|
1879
1852
|
<h4 style="margin-bottom: 8px; font-size: 0.9em; color: #9ca3af;">Uso de ejemplo:</h4>
|
|
1880
1853
|
<pre style="background: rgba(15,23,42,0.6); padding: 10px; border-radius: 4px; font-size: 0.85em; overflow-x: auto; color: #34d399; border: 1px solid rgba(52,211,153,0.2); margin: 0; height: 100%; box-sizing: border-box; max-width: 100%;"><code>$jwt = new \Auth\JwtAuth();
|
|
1881
|
-
|
|
1882
1854
|
$payload = [
|
|
1883
1855
|
'user_id' => 1453,
|
|
1884
1856
|
'role' => 'admin',
|
|
1885
1857
|
'email' => 'utku@artilingo.com'
|
|
1886
1858
|
];
|
|
1887
|
-
|
|
1888
1859
|
$token = $jwt->generate($payload, 7200);
|
|
1889
1860
|
echo "Bearer " . $token;</code></pre>
|
|
1890
1861
|
</div>
|
|
@@ -1916,9 +1887,7 @@ echo "Bearer " . $token;</code></pre>
|
|
|
1916
1887
|
<div style="flex: 1; min-width: 250px; max-width: 100%; box-sizing: border-box; overflow: hidden;">
|
|
1917
1888
|
<h4 style="margin-bottom: 8px; font-size: 0.9em; color: #9ca3af;">Uso de ejemplo:</h4>
|
|
1918
1889
|
<pre style="background: rgba(15,23,42,0.6); padding: 10px; border-radius: 4px; font-size: 0.85em; overflow-x: auto; color: #34d399; border: 1px solid rgba(52,211,153,0.2); margin: 0; height: 100%; box-sizing: border-box; max-width: 100%;"><code>$jwt = new \Auth\JwtAuth();
|
|
1919
|
-
|
|
1920
1890
|
$response = $jwt->verify('dummy_data');
|
|
1921
|
-
|
|
1922
1891
|
if ($response['status'] === 'success') {
|
|
1923
1892
|
// Başarılı
|
|
1924
1893
|
}</code></pre>
|
|
@@ -1950,9 +1919,7 @@ if ($response['status'] === 'success') {
|
|
|
1950
1919
|
<div style="flex: 1; min-width: 250px; max-width: 100%; box-sizing: border-box; overflow: hidden;">
|
|
1951
1920
|
<h4 style="margin-bottom: 8px; font-size: 0.9em; color: #9ca3af;">Uso de ejemplo:</h4>
|
|
1952
1921
|
<pre style="background: rgba(15,23,42,0.6); padding: 10px; border-radius: 4px; font-size: 0.85em; overflow-x: auto; color: #34d399; border: 1px solid rgba(52,211,153,0.2); margin: 0; height: 100%; box-sizing: border-box; max-width: 100%;"><code>$jwt = new \Auth\JwtAuth();
|
|
1953
|
-
|
|
1954
1922
|
$response = $jwt->payload('dummy_data');
|
|
1955
|
-
|
|
1956
1923
|
if ($response['status'] === 'success') {
|
|
1957
1924
|
// Başarılı
|
|
1958
1925
|
}</code></pre>
|
|
@@ -1982,9 +1949,7 @@ if ($response['status'] === 'success') {
|
|
|
1982
1949
|
<div style="flex: 1; min-width: 250px; max-width: 100%; box-sizing: border-box; overflow: hidden;">
|
|
1983
1950
|
<h4 style="margin-bottom: 8px; font-size: 0.9em; color: #9ca3af;">Uso de ejemplo:</h4>
|
|
1984
1951
|
<pre style="background: rgba(15,23,42,0.6); padding: 10px; border-radius: 4px; font-size: 0.85em; overflow-x: auto; color: #34d399; border: 1px solid rgba(52,211,153,0.2); margin: 0; height: 100%; box-sizing: border-box; max-width: 100%;"><code>$jwt = new \Auth\JwtAuth();
|
|
1985
|
-
|
|
1986
1952
|
$response = $jwt->refresh('dummy_data');
|
|
1987
|
-
|
|
1988
1953
|
if ($response['status'] === 'success') {
|
|
1989
1954
|
// Başarılı
|
|
1990
1955
|
}</code></pre>
|
|
@@ -2013,9 +1978,7 @@ if ($response['status'] === 'success') {
|
|
|
2013
1978
|
<div style="flex: 1; min-width: 250px; max-width: 100%; box-sizing: border-box; overflow: hidden;">
|
|
2014
1979
|
<h4 style="margin-bottom: 8px; font-size: 0.9em; color: #9ca3af;">Uso de ejemplo:</h4>
|
|
2015
1980
|
<pre style="background: rgba(15,23,42,0.6); padding: 10px; border-radius: 4px; font-size: 0.85em; overflow-x: auto; color: #34d399; border: 1px solid rgba(52,211,153,0.2); margin: 0; height: 100%; box-sizing: border-box; max-width: 100%;"><code>$jwt = new \Auth\JwtAuth();
|
|
2016
|
-
|
|
2017
1981
|
$response = $jwt->isExpired('dummy_data');
|
|
2018
|
-
|
|
2019
1982
|
if ($response['status'] === 'success') {
|
|
2020
1983
|
// Başarılı
|
|
2021
1984
|
}</code></pre>
|
|
@@ -2042,9 +2005,7 @@ true</code></pre>
|
|
|
2042
2005
|
<div style="flex: 1; min-width: 250px; max-width: 100%; box-sizing: border-box; overflow: hidden;">
|
|
2043
2006
|
<h4 style="margin-bottom: 8px; font-size: 0.9em; color: #9ca3af;">Uso de ejemplo:</h4>
|
|
2044
2007
|
<pre style="background: rgba(15,23,42,0.6); padding: 10px; border-radius: 4px; font-size: 0.85em; overflow-x: auto; color: #34d399; border: 1px solid rgba(52,211,153,0.2); margin: 0; height: 100%; box-sizing: border-box; max-width: 100%;"><code>$jwt = new \Auth\JwtAuth();
|
|
2045
|
-
|
|
2046
2008
|
$response = $jwt->getUserId('dummy_data');
|
|
2047
|
-
|
|
2048
2009
|
if ($response['status'] === 'success') {
|
|
2049
2010
|
// Başarılı
|
|
2050
2011
|
}</code></pre>
|
|
@@ -2072,9 +2033,7 @@ if ($response['status'] === 'success') {
|
|
|
2072
2033
|
<div style="flex: 1; min-width: 250px; max-width: 100%; box-sizing: border-box; overflow: hidden;">
|
|
2073
2034
|
<h4 style="margin-bottom: 8px; font-size: 0.9em; color: #9ca3af;">Uso de ejemplo:</h4>
|
|
2074
2035
|
<pre style="background: rgba(15,23,42,0.6); padding: 10px; border-radius: 4px; font-size: 0.85em; overflow-x: auto; color: #34d399; border: 1px solid rgba(52,211,153,0.2); margin: 0; height: 100%; box-sizing: border-box; max-width: 100%;"><code>$jwt = new \Auth\JwtAuth();
|
|
2075
|
-
|
|
2076
2036
|
$response = $jwt->generateRefreshToken($payload);
|
|
2077
|
-
|
|
2078
2037
|
if ($response['status'] === 'success') {
|
|
2079
2038
|
// Başarılı
|
|
2080
2039
|
}</code></pre>
|
|
@@ -2097,9 +2056,7 @@ if ($response['status'] === 'success') {
|
|
|
2097
2056
|
<div style="flex: 1; min-width: 250px; max-width: 100%; box-sizing: border-box; overflow: hidden;">
|
|
2098
2057
|
<h4 style="margin-bottom: 8px; font-size: 0.9em; color: #9ca3af;">Uso de ejemplo:</h4>
|
|
2099
2058
|
<pre style="background: rgba(15,23,42,0.6); padding: 10px; border-radius: 4px; font-size: 0.85em; overflow-x: auto; color: #34d399; border: 1px solid rgba(52,211,153,0.2); margin: 0; height: 100%; box-sizing: border-box; max-width: 100%;"><code>$jwt = new \Auth\JwtAuth();
|
|
2100
|
-
|
|
2101
2059
|
$response = $jwt->middleware();
|
|
2102
|
-
|
|
2103
2060
|
if ($response['status'] === 'success') {
|
|
2104
2061
|
// Başarılı
|
|
2105
2062
|
}</code></pre>
|
|
@@ -2124,7 +2081,7 @@ if ($response['status'] === 'success') {
|
|
|
2124
2081
|
</div>
|
|
2125
2082
|
<p style="margin-bottom: 15px; font-size: 0.95em; color: #a1a1aa;">ImageProcessor: contenedor para la imagen de intervención v3.<br/>Proporciona métodos simples para operaciones de imágenes comunes, como<br/>cambio de tamaño, recorte, marcas de agua, conversión de formato y compresión.<br/>Variables ENV requeridas:<br/>IMAGE_DRIVER — "gd" o "imagick" (predeterminado: gd)<br/>IMAGE_QUALITY: calidad JPEG/WebP predeterminada 1-100 (predeterminada: 80)</p>
|
|
2126
2083
|
<div class="alert a-info" style="margin-bottom: 20px;">
|
|
2127
|
-
<strong>ℹ️ Devolución estándar:</strong>
|
|
2084
|
+
<strong>ℹ️ Devolución estándar:</strong>Todos los métodos<code>['status' => 'success|error', 'message' => '...', 'data' => [...]]</code>Convierte una cadena estándar en el formato (con excepciones).<strong>en la matriz devuelta en la sección "Retorno esperado" a continuación.<code>data</code>Se muestra la estructura detallada de la clave.</strong>
|
|
2128
2085
|
</div>
|
|
2129
2086
|
<h3>Métodos y ejemplos de uso</h3>
|
|
2130
2087
|
<div class="accordion-group">
|
|
@@ -2144,7 +2101,6 @@ if ($response['status'] === 'success') {
|
|
|
2144
2101
|
<div style="flex: 1; min-width: 250px; max-width: 100%; box-sizing: border-box; overflow: hidden;">
|
|
2145
2102
|
<h4 style="margin-bottom: 8px; font-size: 0.9em; color: #9ca3af;">Uso de ejemplo:</h4>
|
|
2146
2103
|
<pre style="background: rgba(15,23,42,0.6); padding: 10px; border-radius: 4px; font-size: 0.85em; overflow-x: auto; color: #34d399; border: 1px solid rgba(52,211,153,0.2); margin: 0; height: 100%; box-sizing: border-box; max-width: 100%;"><code>$img = new \Service\ImageProcessor();
|
|
2147
|
-
|
|
2148
2104
|
$success = $img->resize(
|
|
2149
2105
|
'/var/www/uploads/orijinal.jpg',
|
|
2150
2106
|
'/var/www/uploads/resized.jpg',
|
|
@@ -2179,9 +2135,7 @@ true</code></pre>
|
|
|
2179
2135
|
<div style="flex: 1; min-width: 250px; max-width: 100%; box-sizing: border-box; overflow: hidden;">
|
|
2180
2136
|
<h4 style="margin-bottom: 8px; font-size: 0.9em; color: #9ca3af;">Uso de ejemplo:</h4>
|
|
2181
2137
|
<pre style="background: rgba(15,23,42,0.6); padding: 10px; border-radius: 4px; font-size: 0.85em; overflow-x: auto; color: #34d399; border: 1px solid rgba(52,211,153,0.2); margin: 0; height: 100%; box-sizing: border-box; max-width: 100%;"><code>$image = new \Service\ImageProcessor();
|
|
2182
|
-
|
|
2183
2138
|
$response = $image->crop($inputPath, $outputPath, 'dummy_data', $height);
|
|
2184
|
-
|
|
2185
2139
|
if ($response['status'] === 'success') {
|
|
2186
2140
|
// Başarılı
|
|
2187
2141
|
}</code></pre>
|
|
@@ -2210,9 +2164,7 @@ true</code></pre>
|
|
|
2210
2164
|
<div style="flex: 1; min-width: 250px; max-width: 100%; box-sizing: border-box; overflow: hidden;">
|
|
2211
2165
|
<h4 style="margin-bottom: 8px; font-size: 0.9em; color: #9ca3af;">Uso de ejemplo:</h4>
|
|
2212
2166
|
<pre style="background: rgba(15,23,42,0.6); padding: 10px; border-radius: 4px; font-size: 0.85em; overflow-x: auto; color: #34d399; border: 1px solid rgba(52,211,153,0.2); margin: 0; height: 100%; box-sizing: border-box; max-width: 100%;"><code>$image = new \Service\ImageProcessor();
|
|
2213
|
-
|
|
2214
2167
|
$response = $image->thumbnail($inputPath, $outputPath);
|
|
2215
|
-
|
|
2216
2168
|
if ($response['status'] === 'success') {
|
|
2217
2169
|
// Başarılı
|
|
2218
2170
|
}</code></pre>
|
|
@@ -2250,9 +2202,7 @@ left, center, right, bottom-left, bottom, bottom-right.
|
|
|
2250
2202
|
<div style="flex: 1; min-width: 250px; max-width: 100%; box-sizing: border-box; overflow: hidden;">
|
|
2251
2203
|
<h4 style="margin-bottom: 8px; font-size: 0.9em; color: #9ca3af;">Uso de ejemplo:</h4>
|
|
2252
2204
|
<pre style="background: rgba(15,23,42,0.6); padding: 10px; border-radius: 4px; font-size: 0.85em; overflow-x: auto; color: #34d399; border: 1px solid rgba(52,211,153,0.2); margin: 0; height: 100%; box-sizing: border-box; max-width: 100%;"><code>$image = new \Service\ImageProcessor();
|
|
2253
|
-
|
|
2254
2205
|
$response = $image->watermark($inputPath, $outputPath, $watermarkPath);
|
|
2255
|
-
|
|
2256
2206
|
if ($response['status'] === 'success') {
|
|
2257
2207
|
// Başarılı
|
|
2258
2208
|
}</code></pre>
|
|
@@ -2281,9 +2231,7 @@ true</code></pre>
|
|
|
2281
2231
|
<div style="flex: 1; min-width: 250px; max-width: 100%; box-sizing: border-box; overflow: hidden;">
|
|
2282
2232
|
<h4 style="margin-bottom: 8px; font-size: 0.9em; color: #9ca3af;">Uso de ejemplo:</h4>
|
|
2283
2233
|
<pre style="background: rgba(15,23,42,0.6); padding: 10px; border-radius: 4px; font-size: 0.85em; overflow-x: auto; color: #34d399; border: 1px solid rgba(52,211,153,0.2); margin: 0; height: 100%; box-sizing: border-box; max-width: 100%;"><code>$image = new \Service\ImageProcessor();
|
|
2284
|
-
|
|
2285
2234
|
$response = $image->toWebp($inputPath);
|
|
2286
|
-
|
|
2287
2235
|
if ($response['status'] === 'success') {
|
|
2288
2236
|
// Başarılı
|
|
2289
2237
|
}</code></pre>
|
|
@@ -2312,9 +2260,7 @@ true</code></pre>
|
|
|
2312
2260
|
<div style="flex: 1; min-width: 250px; max-width: 100%; box-sizing: border-box; overflow: hidden;">
|
|
2313
2261
|
<h4 style="margin-bottom: 8px; font-size: 0.9em; color: #9ca3af;">Uso de ejemplo:</h4>
|
|
2314
2262
|
<pre style="background: rgba(15,23,42,0.6); padding: 10px; border-radius: 4px; font-size: 0.85em; overflow-x: auto; color: #34d399; border: 1px solid rgba(52,211,153,0.2); margin: 0; height: 100%; box-sizing: border-box; max-width: 100%;"><code>$image = new \Service\ImageProcessor();
|
|
2315
|
-
|
|
2316
2263
|
$response = $image->compress($inputPath);
|
|
2317
|
-
|
|
2318
2264
|
if ($response['status'] === 'success') {
|
|
2319
2265
|
// Başarılı
|
|
2320
2266
|
}</code></pre>
|
|
@@ -2343,9 +2289,7 @@ Returns an array with an 'error' key on failure.</code></pre>
|
|
|
2343
2289
|
<div style="flex: 1; min-width: 250px; max-width: 100%; box-sizing: border-box; overflow: hidden;">
|
|
2344
2290
|
<h4 style="margin-bottom: 8px; font-size: 0.9em; color: #9ca3af;">Uso de ejemplo:</h4>
|
|
2345
2291
|
<pre style="background: rgba(15,23,42,0.6); padding: 10px; border-radius: 4px; font-size: 0.85em; overflow-x: auto; color: #34d399; border: 1px solid rgba(52,211,153,0.2); margin: 0; height: 100%; box-sizing: border-box; max-width: 100%;"><code>$image = new \Service\ImageProcessor();
|
|
2346
|
-
|
|
2347
2292
|
$response = $image->info($path);
|
|
2348
|
-
|
|
2349
2293
|
if ($response['status'] === 'success') {
|
|
2350
2294
|
// Başarılı
|
|
2351
2295
|
}</code></pre>
|
|
@@ -2378,9 +2322,7 @@ if ($response['status'] === 'success') {
|
|
|
2378
2322
|
<div style="flex: 1; min-width: 250px; max-width: 100%; box-sizing: border-box; overflow: hidden;">
|
|
2379
2323
|
<h4 style="margin-bottom: 8px; font-size: 0.9em; color: #9ca3af;">Uso de ejemplo:</h4>
|
|
2380
2324
|
<pre style="background: rgba(15,23,42,0.6); padding: 10px; border-radius: 4px; font-size: 0.85em; overflow-x: auto; color: #34d399; border: 1px solid rgba(52,211,153,0.2); margin: 0; height: 100%; box-sizing: border-box; max-width: 100%;"><code>$image = new \Service\ImageProcessor();
|
|
2381
|
-
|
|
2382
2325
|
$response = $image->rotate($inputPath, $outputPath, $angle);
|
|
2383
|
-
|
|
2384
2326
|
if ($response['status'] === 'success') {
|
|
2385
2327
|
// Başarılı
|
|
2386
2328
|
}</code></pre>
|
|
@@ -2408,9 +2350,7 @@ true</code></pre>
|
|
|
2408
2350
|
<div style="flex: 1; min-width: 250px; max-width: 100%; box-sizing: border-box; overflow: hidden;">
|
|
2409
2351
|
<h4 style="margin-bottom: 8px; font-size: 0.9em; color: #9ca3af;">Uso de ejemplo:</h4>
|
|
2410
2352
|
<pre style="background: rgba(15,23,42,0.6); padding: 10px; border-radius: 4px; font-size: 0.85em; overflow-x: auto; color: #34d399; border: 1px solid rgba(52,211,153,0.2); margin: 0; height: 100%; box-sizing: border-box; max-width: 100%;"><code>$image = new \Service\ImageProcessor();
|
|
2411
|
-
|
|
2412
2353
|
$response = $image->greyscale($inputPath, $outputPath);
|
|
2413
|
-
|
|
2414
2354
|
if ($response['status'] === 'success') {
|
|
2415
2355
|
// Başarılı
|
|
2416
2356
|
}</code></pre>
|
|
@@ -2427,14 +2367,14 @@ true</code></pre>
|
|
|
2427
2367
|
</div>
|
|
2428
2368
|
</div>
|
|
2429
2369
|
<div class="card" id="svc-s3">
|
|
2430
|
-
<h2>AWS S3
|
|
2431
|
-
<div class="alert a-info" style="margin-top: 10px; padding: 10px 15px; font-size: 0.85em;"><strong>📌 Membresía y claves API:</strong>
|
|
2370
|
+
<h2>AWS S3<span class="tag b-core" style="padding: 1px 5px; margin-left: 2px; font-weight: bold;" title="Servicio pago/con licencia">$</span></h2>
|
|
2371
|
+
<div class="alert a-info" style="margin-top: 10px; padding: 10px 15px; font-size: 0.85em;"><strong>📌 Membresía y claves API:</strong>Para utilizar el depósito S3<a href="https://aws.amazon.com/s3/" style="color: var(--green); font-weight: bold;" target="_blank">aws.amazon.com/s3</a>Debe abrir una cuenta de AWS a través de , crear un depósito y obtener una clave de acceso y una clave secreta con permiso de acceso programático a través de IAM.</div>
|
|
2432
2372
|
<div class="code-badge" style="margin-bottom: 15px; padding: 10px; background: rgba(0,0,0,0.2); border: 1px solid rgba(255,255,255,0.05); border-radius: 6px; font-family: monospace;">
|
|
2433
2373
|
<strong>Ubicación de la clase:</strong> <code style="color: #4ade80;">src/Service/S3Storage.php</code>
|
|
2434
2374
|
</div>
|
|
2435
2375
|
<p style="margin-bottom: 15px; font-size: 0.95em; color: #a1a1aa;">S3Storage: contenedor para AWS S3 SDK.<br/>Proporciona métodos sencillos para cargar, descargar, eliminar, enumerar,<br/>y administrar archivos en Amazon S3, MinIO, DigitalOcean Spaces o cualquier<br/>Almacenamiento de objetos compatible con S3.<br/>Variables ENV requeridas:<br/>AWS_ACCESS_KEY_ID: clave de acceso de IAM<br/>AWS_SECRET_ACCESS_KEY: clave secreta de IAM<br/>AWS_DEFAULT_REGION: p.ej. "eu-central-1"<br/>AWS_BUCKET: nombre del depósito predeterminado<br/>Variables ENV opcionales:<br/>AWS_ENDPOINT: URL de punto final personalizada (MinIO, Spaces, etc.)</p>
|
|
2436
2376
|
<div class="alert a-info" style="margin-bottom: 20px;">
|
|
2437
|
-
<strong>ℹ️ Devolución estándar:</strong>
|
|
2377
|
+
<strong>ℹ️ Devolución estándar:</strong>Todos los métodos<code>['status' => 'success|error', 'message' => '...', 'data' => [...]]</code>Convierte una cadena estándar en el formato (con excepciones).<strong>en la matriz devuelta en la sección "Retorno esperado" a continuación.<code>data</code>Se muestra la estructura detallada de la clave.</strong>
|
|
2438
2378
|
</div>
|
|
2439
2379
|
<h3>Métodos y ejemplos de uso</h3>
|
|
2440
2380
|
<div class="accordion-group">
|
|
@@ -2453,9 +2393,7 @@ true</code></pre>
|
|
|
2453
2393
|
<div style="flex: 1; min-width: 250px; max-width: 100%; box-sizing: border-box; overflow: hidden;">
|
|
2454
2394
|
<h4 style="margin-bottom: 8px; font-size: 0.9em; color: #9ca3af;">Uso de ejemplo:</h4>
|
|
2455
2395
|
<pre style="background: rgba(15,23,42,0.6); padding: 10px; border-radius: 4px; font-size: 0.85em; overflow-x: auto; color: #34d399; border: 1px solid rgba(52,211,153,0.2); margin: 0; height: 100%; box-sizing: border-box; max-width: 100%;"><code>$s3 = new \Service\S3Storage();
|
|
2456
|
-
|
|
2457
2396
|
$response = $s3->upload($localPath, $remotePath);
|
|
2458
|
-
|
|
2459
2397
|
if ($response['status'] === 'success') {
|
|
2460
2398
|
// Başarılı
|
|
2461
2399
|
}</code></pre>
|
|
@@ -2487,9 +2425,7 @@ if ($response['status'] === 'success') {
|
|
|
2487
2425
|
<div style="flex: 1; min-width: 250px; max-width: 100%; box-sizing: border-box; overflow: hidden;">
|
|
2488
2426
|
<h4 style="margin-bottom: 8px; font-size: 0.9em; color: #9ca3af;">Uso de ejemplo:</h4>
|
|
2489
2427
|
<pre style="background: rgba(15,23,42,0.6); padding: 10px; border-radius: 4px; font-size: 0.85em; overflow-x: auto; color: #34d399; border: 1px solid rgba(52,211,153,0.2); margin: 0; height: 100%; box-sizing: border-box; max-width: 100%;"><code>$s3 = new \Service\S3Storage();
|
|
2490
|
-
|
|
2491
2428
|
$response = $s3->uploadFromString($content, $remotePath, $contentType);
|
|
2492
|
-
|
|
2493
2429
|
if ($response['status'] === 'success') {
|
|
2494
2430
|
// Başarılı
|
|
2495
2431
|
}</code></pre>
|
|
@@ -2519,9 +2455,7 @@ if ($response['status'] === 'success') {
|
|
|
2519
2455
|
<div style="flex: 1; min-width: 250px; max-width: 100%; box-sizing: border-box; overflow: hidden;">
|
|
2520
2456
|
<h4 style="margin-bottom: 8px; font-size: 0.9em; color: #9ca3af;">Uso de ejemplo:</h4>
|
|
2521
2457
|
<pre style="background: rgba(15,23,42,0.6); padding: 10px; border-radius: 4px; font-size: 0.85em; overflow-x: auto; color: #34d399; border: 1px solid rgba(52,211,153,0.2); margin: 0; height: 100%; box-sizing: border-box; max-width: 100%;"><code>$s3 = new \Service\S3Storage();
|
|
2522
|
-
|
|
2523
2458
|
$response = $s3->download($remotePath, $localPath);
|
|
2524
|
-
|
|
2525
2459
|
if ($response['status'] === 'success') {
|
|
2526
2460
|
// Başarılı
|
|
2527
2461
|
}</code></pre>
|
|
@@ -2548,9 +2482,7 @@ true</code></pre>
|
|
|
2548
2482
|
<div style="flex: 1; min-width: 250px; max-width: 100%; box-sizing: border-box; overflow: hidden;">
|
|
2549
2483
|
<h4 style="margin-bottom: 8px; font-size: 0.9em; color: #9ca3af;">Uso de ejemplo:</h4>
|
|
2550
2484
|
<pre style="background: rgba(15,23,42,0.6); padding: 10px; border-radius: 4px; font-size: 0.85em; overflow-x: auto; color: #34d399; border: 1px solid rgba(52,211,153,0.2); margin: 0; height: 100%; box-sizing: border-box; max-width: 100%;"><code>$s3 = new \Service\S3Storage();
|
|
2551
|
-
|
|
2552
2485
|
$response = $s3->delete($remotePath);
|
|
2553
|
-
|
|
2554
2486
|
if ($response['status'] === 'success') {
|
|
2555
2487
|
// Başarılı
|
|
2556
2488
|
}</code></pre>
|
|
@@ -2571,15 +2503,13 @@ true</code></pre>
|
|
|
2571
2503
|
<div style="display: flex; flex-direction: column; gap: 15px; box-sizing: border-box; width: 100%; max-width: 100%;">
|
|
2572
2504
|
<div style="flex: 1; max-width: 100%; box-sizing: border-box; overflow: hidden;">
|
|
2573
2505
|
<h4 style="margin-bottom: 8px; font-size: 0.9em; color: #9ca3af;">Estructura de parámetros:</h4>
|
|
2574
|
-
<pre style="background: rgba(0,0,0,0.3); padding: 10px; border-radius: 4px; font-size: 0.85em; overflow-x: auto; color: #a78bfa; border: 1px solid rgba(255,255,255,0.05); margin: 0; box-sizing: border-box; max-width: 100%;"><code>@param array<string
|
|
2506
|
+
<pre style="background: rgba(0,0,0,0.3); padding: 10px; border-radius: 4px; font-size: 0.85em; overflow-x: auto; color: #a78bfa; border: 1px solid rgba(255,255,255,0.05); margin: 0; box-sizing: border-box; max-width: 100%;"><code>@param array<string>$remotePaths Lista de claves de objetos para eliminar.</string></code></pre>
|
|
2575
2507
|
</div>
|
|
2576
2508
|
<div style="display: flex; flex-wrap: wrap; gap: 15px; box-sizing: border-box; width: 100%;">
|
|
2577
2509
|
<div style="flex: 1; min-width: 250px; max-width: 100%; box-sizing: border-box; overflow: hidden;">
|
|
2578
2510
|
<h4 style="margin-bottom: 8px; font-size: 0.9em; color: #9ca3af;">Uso de ejemplo:</h4>
|
|
2579
2511
|
<pre style="background: rgba(15,23,42,0.6); padding: 10px; border-radius: 4px; font-size: 0.85em; overflow-x: auto; color: #34d399; border: 1px solid rgba(52,211,153,0.2); margin: 0; height: 100%; box-sizing: border-box; max-width: 100%;"><code>$s3 = new \Service\S3Storage();
|
|
2580
|
-
|
|
2581
2512
|
$response = $s3->deleteMany($remotePaths);
|
|
2582
|
-
|
|
2583
2513
|
if ($response['status'] === 'success') {
|
|
2584
2514
|
// Başarılı
|
|
2585
2515
|
}</code></pre>
|
|
@@ -2606,9 +2536,7 @@ true</code></pre>
|
|
|
2606
2536
|
<div style="flex: 1; min-width: 250px; max-width: 100%; box-sizing: border-box; overflow: hidden;">
|
|
2607
2537
|
<h4 style="margin-bottom: 8px; font-size: 0.9em; color: #9ca3af;">Uso de ejemplo:</h4>
|
|
2608
2538
|
<pre style="background: rgba(15,23,42,0.6); padding: 10px; border-radius: 4px; font-size: 0.85em; overflow-x: auto; color: #34d399; border: 1px solid rgba(52,211,153,0.2); margin: 0; height: 100%; box-sizing: border-box; max-width: 100%;"><code>$s3 = new \Service\S3Storage();
|
|
2609
|
-
|
|
2610
2539
|
$response = $s3->url($remotePath);
|
|
2611
|
-
|
|
2612
2540
|
if ($response['status'] === 'success') {
|
|
2613
2541
|
// Başarılı
|
|
2614
2542
|
}</code></pre>
|
|
@@ -2636,9 +2564,7 @@ if ($response['status'] === 'success') {
|
|
|
2636
2564
|
<div style="flex: 1; min-width: 250px; max-width: 100%; box-sizing: border-box; overflow: hidden;">
|
|
2637
2565
|
<h4 style="margin-bottom: 8px; font-size: 0.9em; color: #9ca3af;">Uso de ejemplo:</h4>
|
|
2638
2566
|
<pre style="background: rgba(15,23,42,0.6); padding: 10px; border-radius: 4px; font-size: 0.85em; overflow-x: auto; color: #34d399; border: 1px solid rgba(52,211,153,0.2); margin: 0; height: 100%; box-sizing: border-box; max-width: 100%;"><code>$s3 = new \Service\S3Storage();
|
|
2639
|
-
|
|
2640
2567
|
$response = $s3->signedUrl($remotePath);
|
|
2641
|
-
|
|
2642
2568
|
if ($response['status'] === 'success') {
|
|
2643
2569
|
// Başarılı
|
|
2644
2570
|
}</code></pre>
|
|
@@ -2665,9 +2591,7 @@ if ($response['status'] === 'success') {
|
|
|
2665
2591
|
<div style="flex: 1; min-width: 250px; max-width: 100%; box-sizing: border-box; overflow: hidden;">
|
|
2666
2592
|
<h4 style="margin-bottom: 8px; font-size: 0.9em; color: #9ca3af;">Uso de ejemplo:</h4>
|
|
2667
2593
|
<pre style="background: rgba(15,23,42,0.6); padding: 10px; border-radius: 4px; font-size: 0.85em; overflow-x: auto; color: #34d399; border: 1px solid rgba(52,211,153,0.2); margin: 0; height: 100%; box-sizing: border-box; max-width: 100%;"><code>$s3 = new \Service\S3Storage();
|
|
2668
|
-
|
|
2669
2594
|
$response = $s3->exists($remotePath);
|
|
2670
|
-
|
|
2671
2595
|
if ($response['status'] === 'success') {
|
|
2672
2596
|
// Başarılı
|
|
2673
2597
|
}</code></pre>
|
|
@@ -2694,9 +2618,7 @@ true</code></pre>
|
|
|
2694
2618
|
<div style="flex: 1; min-width: 250px; max-width: 100%; box-sizing: border-box; overflow: hidden;">
|
|
2695
2619
|
<h4 style="margin-bottom: 8px; font-size: 0.9em; color: #9ca3af;">Uso de ejemplo:</h4>
|
|
2696
2620
|
<pre style="background: rgba(15,23,42,0.6); padding: 10px; border-radius: 4px; font-size: 0.85em; overflow-x: auto; color: #34d399; border: 1px solid rgba(52,211,153,0.2); margin: 0; height: 100%; box-sizing: border-box; max-width: 100%;"><code>$s3 = new \Service\S3Storage();
|
|
2697
|
-
|
|
2698
2621
|
$response = $s3->list();
|
|
2699
|
-
|
|
2700
2622
|
if ($response['status'] === 'success') {
|
|
2701
2623
|
// Başarılı
|
|
2702
2624
|
}</code></pre>
|
|
@@ -2726,9 +2648,7 @@ if ($response['status'] === 'success') {
|
|
|
2726
2648
|
<div style="flex: 1; min-width: 250px; max-width: 100%; box-sizing: border-box; overflow: hidden;">
|
|
2727
2649
|
<h4 style="margin-bottom: 8px; font-size: 0.9em; color: #9ca3af;">Uso de ejemplo:</h4>
|
|
2728
2650
|
<pre style="background: rgba(15,23,42,0.6); padding: 10px; border-radius: 4px; font-size: 0.85em; overflow-x: auto; color: #34d399; border: 1px solid rgba(52,211,153,0.2); margin: 0; height: 100%; box-sizing: border-box; max-width: 100%;"><code>$s3 = new \Service\S3Storage();
|
|
2729
|
-
|
|
2730
2651
|
$response = $s3->copy($from, $to);
|
|
2731
|
-
|
|
2732
2652
|
if ($response['status'] === 'success') {
|
|
2733
2653
|
// Başarılı
|
|
2734
2654
|
}</code></pre>
|
|
@@ -2756,9 +2676,7 @@ true</code></pre>
|
|
|
2756
2676
|
<div style="flex: 1; min-width: 250px; max-width: 100%; box-sizing: border-box; overflow: hidden;">
|
|
2757
2677
|
<h4 style="margin-bottom: 8px; font-size: 0.9em; color: #9ca3af;">Uso de ejemplo:</h4>
|
|
2758
2678
|
<pre style="background: rgba(15,23,42,0.6); padding: 10px; border-radius: 4px; font-size: 0.85em; overflow-x: auto; color: #34d399; border: 1px solid rgba(52,211,153,0.2); margin: 0; height: 100%; box-sizing: border-box; max-width: 100%;"><code>$s3 = new \Service\S3Storage();
|
|
2759
|
-
|
|
2760
2679
|
$response = $s3->move($from, $to);
|
|
2761
|
-
|
|
2762
2680
|
if ($response['status'] === 'success') {
|
|
2763
2681
|
// Başarılı
|
|
2764
2682
|
}</code></pre>
|
|
@@ -2785,9 +2703,7 @@ true</code></pre>
|
|
|
2785
2703
|
<div style="flex: 1; min-width: 250px; max-width: 100%; box-sizing: border-box; overflow: hidden;">
|
|
2786
2704
|
<h4 style="margin-bottom: 8px; font-size: 0.9em; color: #9ca3af;">Uso de ejemplo:</h4>
|
|
2787
2705
|
<pre style="background: rgba(15,23,42,0.6); padding: 10px; border-radius: 4px; font-size: 0.85em; overflow-x: auto; color: #34d399; border: 1px solid rgba(52,211,153,0.2); margin: 0; height: 100%; box-sizing: border-box; max-width: 100%;"><code>$s3 = new \Service\S3Storage();
|
|
2788
|
-
|
|
2789
2706
|
$response = $s3->size($remotePath);
|
|
2790
|
-
|
|
2791
2707
|
if ($response['status'] === 'success') {
|
|
2792
2708
|
// Başarılı
|
|
2793
2709
|
}</code></pre>
|
|
@@ -2810,7 +2726,7 @@ if ($response['status'] === 'success') {
|
|
|
2810
2726
|
</div>
|
|
2811
2727
|
<p style="margin-bottom: 15px; font-size: 0.95em; color: #a1a1aa;">Servicio de caché de Redis<br/>Proporciona una interfaz limpia y sencilla para las operaciones de almacenamiento en caché de Redis.<br/>usando el SDK de predis/predis. Toda la configuración se lee desde $_ENV.<br/>Variables de entorno requeridas:<br/>REDIS_HOST: nombre de host del servidor Redis (predeterminado: 127.0.0.1)<br/>REDIS_PORT: puerto del servidor Redis (predeterminado: 6379)<br/>REDIS_PASSWORD: contraseña de autenticación de Redis (predeterminada: nula)<br/>REDIS_DATABASE: índice de la base de datos de Redis (predeterminado: 0)</p>
|
|
2812
2728
|
<div class="alert a-info" style="margin-bottom: 20px;">
|
|
2813
|
-
<strong>ℹ️ Devolución estándar:</strong>
|
|
2729
|
+
<strong>ℹ️ Devolución estándar:</strong>Todos los métodos<code>['status' => 'success|error', 'message' => '...', 'data' => [...]]</code>Convierte una cadena estándar en el formato (con excepciones).<strong>en la matriz devuelta en la sección "Retorno esperado" a continuación.<code>data</code>Se muestra la estructura detallada de la clave.</strong>
|
|
2814
2730
|
</div>
|
|
2815
2731
|
<h3>Métodos y ejemplos de uso</h3>
|
|
2816
2732
|
<div class="accordion-group">
|
|
@@ -2828,9 +2744,7 @@ if ($response['status'] === 'success') {
|
|
|
2828
2744
|
<div style="flex: 1; min-width: 250px; max-width: 100%; box-sizing: border-box; overflow: hidden;">
|
|
2829
2745
|
<h4 style="margin-bottom: 8px; font-size: 0.9em; color: #9ca3af;">Uso de ejemplo:</h4>
|
|
2830
2746
|
<pre style="background: rgba(15,23,42,0.6); padding: 10px; border-radius: 4px; font-size: 0.85em; overflow-x: auto; color: #34d399; border: 1px solid rgba(52,211,153,0.2); margin: 0; height: 100%; box-sizing: border-box; max-width: 100%;"><code>$redis = new \Service\RedisCache();
|
|
2831
|
-
|
|
2832
2747
|
$response = $redis->get($key);
|
|
2833
|
-
|
|
2834
2748
|
if ($response['status'] === 'success') {
|
|
2835
2749
|
// Başarılı
|
|
2836
2750
|
}</code></pre>
|
|
@@ -2859,9 +2773,7 @@ if ($response['status'] === 'success') {
|
|
|
2859
2773
|
<div style="flex: 1; min-width: 250px; max-width: 100%; box-sizing: border-box; overflow: hidden;">
|
|
2860
2774
|
<h4 style="margin-bottom: 8px; font-size: 0.9em; color: #9ca3af;">Uso de ejemplo:</h4>
|
|
2861
2775
|
<pre style="background: rgba(15,23,42,0.6); padding: 10px; border-radius: 4px; font-size: 0.85em; overflow-x: auto; color: #34d399; border: 1px solid rgba(52,211,153,0.2); margin: 0; height: 100%; box-sizing: border-box; max-width: 100%;"><code>$redis = new \Service\RedisCache();
|
|
2862
|
-
|
|
2863
2776
|
$response = $redis->set($key, $value);
|
|
2864
|
-
|
|
2865
2777
|
if ($response['status'] === 'success') {
|
|
2866
2778
|
// Başarılı
|
|
2867
2779
|
}</code></pre>
|
|
@@ -2888,9 +2800,7 @@ true</code></pre>
|
|
|
2888
2800
|
<div style="flex: 1; min-width: 250px; max-width: 100%; box-sizing: border-box; overflow: hidden;">
|
|
2889
2801
|
<h4 style="margin-bottom: 8px; font-size: 0.9em; color: #9ca3af;">Uso de ejemplo:</h4>
|
|
2890
2802
|
<pre style="background: rgba(15,23,42,0.6); padding: 10px; border-radius: 4px; font-size: 0.85em; overflow-x: auto; color: #34d399; border: 1px solid rgba(52,211,153,0.2); margin: 0; height: 100%; box-sizing: border-box; max-width: 100%;"><code>$redis = new \Service\RedisCache();
|
|
2891
|
-
|
|
2892
2803
|
$response = $redis->has($key);
|
|
2893
|
-
|
|
2894
2804
|
if ($response['status'] === 'success') {
|
|
2895
2805
|
// Başarılı
|
|
2896
2806
|
}</code></pre>
|
|
@@ -2917,9 +2827,7 @@ true</code></pre>
|
|
|
2917
2827
|
<div style="flex: 1; min-width: 250px; max-width: 100%; box-sizing: border-box; overflow: hidden;">
|
|
2918
2828
|
<h4 style="margin-bottom: 8px; font-size: 0.9em; color: #9ca3af;">Uso de ejemplo:</h4>
|
|
2919
2829
|
<pre style="background: rgba(15,23,42,0.6); padding: 10px; border-radius: 4px; font-size: 0.85em; overflow-x: auto; color: #34d399; border: 1px solid rgba(52,211,153,0.2); margin: 0; height: 100%; box-sizing: border-box; max-width: 100%;"><code>$redis = new \Service\RedisCache();
|
|
2920
|
-
|
|
2921
2830
|
$response = $redis->forget($key);
|
|
2922
|
-
|
|
2923
2831
|
if ($response['status'] === 'success') {
|
|
2924
2832
|
// Başarılı
|
|
2925
2833
|
}</code></pre>
|
|
@@ -2948,9 +2856,7 @@ true</code></pre>
|
|
|
2948
2856
|
<div style="flex: 1; min-width: 250px; max-width: 100%; box-sizing: border-box; overflow: hidden;">
|
|
2949
2857
|
<h4 style="margin-bottom: 8px; font-size: 0.9em; color: #9ca3af;">Uso de ejemplo:</h4>
|
|
2950
2858
|
<pre style="background: rgba(15,23,42,0.6); padding: 10px; border-radius: 4px; font-size: 0.85em; overflow-x: auto; color: #34d399; border: 1px solid rgba(52,211,153,0.2); margin: 0; height: 100%; box-sizing: border-box; max-width: 100%;"><code>$redis = new \Service\RedisCache();
|
|
2951
|
-
|
|
2952
2859
|
$response = $redis->remember($key, $ttl, $callback);
|
|
2953
|
-
|
|
2954
2860
|
if ($response['status'] === 'success') {
|
|
2955
2861
|
// Başarılı
|
|
2956
2862
|
}</code></pre>
|
|
@@ -2980,9 +2886,7 @@ if ($response['status'] === 'success') {
|
|
|
2980
2886
|
<div style="flex: 1; min-width: 250px; max-width: 100%; box-sizing: border-box; overflow: hidden;">
|
|
2981
2887
|
<h4 style="margin-bottom: 8px; font-size: 0.9em; color: #9ca3af;">Uso de ejemplo:</h4>
|
|
2982
2888
|
<pre style="background: rgba(15,23,42,0.6); padding: 10px; border-radius: 4px; font-size: 0.85em; overflow-x: auto; color: #34d399; border: 1px solid rgba(52,211,153,0.2); margin: 0; height: 100%; box-sizing: border-box; max-width: 100%;"><code>$redis = new \Service\RedisCache();
|
|
2983
|
-
|
|
2984
2889
|
$response = $redis->increment($key);
|
|
2985
|
-
|
|
2986
2890
|
if ($response['status'] === 'success') {
|
|
2987
2891
|
// Başarılı
|
|
2988
2892
|
}</code></pre>
|
|
@@ -3010,9 +2914,7 @@ true</code></pre>
|
|
|
3010
2914
|
<div style="flex: 1; min-width: 250px; max-width: 100%; box-sizing: border-box; overflow: hidden;">
|
|
3011
2915
|
<h4 style="margin-bottom: 8px; font-size: 0.9em; color: #9ca3af;">Uso de ejemplo:</h4>
|
|
3012
2916
|
<pre style="background: rgba(15,23,42,0.6); padding: 10px; border-radius: 4px; font-size: 0.85em; overflow-x: auto; color: #34d399; border: 1px solid rgba(52,211,153,0.2); margin: 0; height: 100%; box-sizing: border-box; max-width: 100%;"><code>$redis = new \Service\RedisCache();
|
|
3013
|
-
|
|
3014
2917
|
$response = $redis->decrement($key);
|
|
3015
|
-
|
|
3016
2918
|
if ($response['status'] === 'success') {
|
|
3017
2919
|
// Başarılı
|
|
3018
2920
|
}</code></pre>
|
|
@@ -3035,9 +2937,7 @@ true</code></pre>
|
|
|
3035
2937
|
<div style="flex: 1; min-width: 250px; max-width: 100%; box-sizing: border-box; overflow: hidden;">
|
|
3036
2938
|
<h4 style="margin-bottom: 8px; font-size: 0.9em; color: #9ca3af;">Uso de ejemplo:</h4>
|
|
3037
2939
|
<pre style="background: rgba(15,23,42,0.6); padding: 10px; border-radius: 4px; font-size: 0.85em; overflow-x: auto; color: #34d399; border: 1px solid rgba(52,211,153,0.2); margin: 0; height: 100%; box-sizing: border-box; max-width: 100%;"><code>$redis = new \Service\RedisCache();
|
|
3038
|
-
|
|
3039
2940
|
$response = $redis->flush();
|
|
3040
|
-
|
|
3041
2941
|
if ($response['status'] === 'success') {
|
|
3042
2942
|
// Başarılı
|
|
3043
2943
|
}</code></pre>
|
|
@@ -3064,9 +2964,7 @@ true</code></pre>
|
|
|
3064
2964
|
<div style="flex: 1; min-width: 250px; max-width: 100%; box-sizing: border-box; overflow: hidden;">
|
|
3065
2965
|
<h4 style="margin-bottom: 8px; font-size: 0.9em; color: #9ca3af;">Uso de ejemplo:</h4>
|
|
3066
2966
|
<pre style="background: rgba(15,23,42,0.6); padding: 10px; border-radius: 4px; font-size: 0.85em; overflow-x: auto; color: #34d399; border: 1px solid rgba(52,211,153,0.2); margin: 0; height: 100%; box-sizing: border-box; max-width: 100%;"><code>$redis = new \Service\RedisCache();
|
|
3067
|
-
|
|
3068
2967
|
$response = $redis->keys();
|
|
3069
|
-
|
|
3070
2968
|
if ($response['status'] === 'success') {
|
|
3071
2969
|
// Başarılı
|
|
3072
2970
|
}</code></pre>
|
|
@@ -3095,9 +2993,7 @@ if ($response['status'] === 'success') {
|
|
|
3095
2993
|
<div style="flex: 1; min-width: 250px; max-width: 100%; box-sizing: border-box; overflow: hidden;">
|
|
3096
2994
|
<h4 style="margin-bottom: 8px; font-size: 0.9em; color: #9ca3af;">Uso de ejemplo:</h4>
|
|
3097
2995
|
<pre style="background: rgba(15,23,42,0.6); padding: 10px; border-radius: 4px; font-size: 0.85em; overflow-x: auto; color: #34d399; border: 1px solid rgba(52,211,153,0.2); margin: 0; height: 100%; box-sizing: border-box; max-width: 100%;"><code>$redis = new \Service\RedisCache();
|
|
3098
|
-
|
|
3099
2996
|
$response = $redis->ttl($key);
|
|
3100
|
-
|
|
3101
2997
|
if ($response['status'] === 'success') {
|
|
3102
2998
|
// Başarılı
|
|
3103
2999
|
}</code></pre>
|
|
@@ -3125,9 +3021,7 @@ if ($response['status'] === 'success') {
|
|
|
3125
3021
|
<div style="flex: 1; min-width: 250px; max-width: 100%; box-sizing: border-box; overflow: hidden;">
|
|
3126
3022
|
<h4 style="margin-bottom: 8px; font-size: 0.9em; color: #9ca3af;">Uso de ejemplo:</h4>
|
|
3127
3023
|
<pre style="background: rgba(15,23,42,0.6); padding: 10px; border-radius: 4px; font-size: 0.85em; overflow-x: auto; color: #34d399; border: 1px solid rgba(52,211,153,0.2); margin: 0; height: 100%; box-sizing: border-box; max-width: 100%;"><code>$redis = new \Service\RedisCache();
|
|
3128
|
-
|
|
3129
3024
|
$response = $redis->expire($key, $seconds);
|
|
3130
|
-
|
|
3131
3025
|
if ($response['status'] === 'success') {
|
|
3132
3026
|
// Başarılı
|
|
3133
3027
|
}</code></pre>
|
|
@@ -3156,9 +3050,7 @@ true</code></pre>
|
|
|
3156
3050
|
<div style="flex: 1; min-width: 250px; max-width: 100%; box-sizing: border-box; overflow: hidden;">
|
|
3157
3051
|
<h4 style="margin-bottom: 8px; font-size: 0.9em; color: #9ca3af;">Uso de ejemplo:</h4>
|
|
3158
3052
|
<pre style="background: rgba(15,23,42,0.6); padding: 10px; border-radius: 4px; font-size: 0.85em; overflow-x: auto; color: #34d399; border: 1px solid rgba(52,211,153,0.2); margin: 0; height: 100%; box-sizing: border-box; max-width: 100%;"><code>$redis = new \Service\RedisCache();
|
|
3159
|
-
|
|
3160
3053
|
$response = $redis->hSet($hash, $field, $value);
|
|
3161
|
-
|
|
3162
3054
|
if ($response['status'] === 'success') {
|
|
3163
3055
|
// Başarılı
|
|
3164
3056
|
}</code></pre>
|
|
@@ -3187,9 +3079,7 @@ true</code></pre>
|
|
|
3187
3079
|
<div style="flex: 1; min-width: 250px; max-width: 100%; box-sizing: border-box; overflow: hidden;">
|
|
3188
3080
|
<h4 style="margin-bottom: 8px; font-size: 0.9em; color: #9ca3af;">Uso de ejemplo:</h4>
|
|
3189
3081
|
<pre style="background: rgba(15,23,42,0.6); padding: 10px; border-radius: 4px; font-size: 0.85em; overflow-x: auto; color: #34d399; border: 1px solid rgba(52,211,153,0.2); margin: 0; height: 100%; box-sizing: border-box; max-width: 100%;"><code>$redis = new \Service\RedisCache();
|
|
3190
|
-
|
|
3191
3082
|
$response = $redis->hGet($hash, $field);
|
|
3192
|
-
|
|
3193
3083
|
if ($response['status'] === 'success') {
|
|
3194
3084
|
// Başarılı
|
|
3195
3085
|
}</code></pre>
|
|
@@ -3218,9 +3108,7 @@ if ($response['status'] === 'success') {
|
|
|
3218
3108
|
<div style="flex: 1; min-width: 250px; max-width: 100%; box-sizing: border-box; overflow: hidden;">
|
|
3219
3109
|
<h4 style="margin-bottom: 8px; font-size: 0.9em; color: #9ca3af;">Uso de ejemplo:</h4>
|
|
3220
3110
|
<pre style="background: rgba(15,23,42,0.6); padding: 10px; border-radius: 4px; font-size: 0.85em; overflow-x: auto; color: #34d399; border: 1px solid rgba(52,211,153,0.2); margin: 0; height: 100%; box-sizing: border-box; max-width: 100%;"><code>$redis = new \Service\RedisCache();
|
|
3221
|
-
|
|
3222
3111
|
$response = $redis->hGetAll($hash);
|
|
3223
|
-
|
|
3224
3112
|
if ($response['status'] === 'success') {
|
|
3225
3113
|
// Başarılı
|
|
3226
3114
|
}</code></pre>
|
|
@@ -3250,9 +3138,7 @@ if ($response['status'] === 'success') {
|
|
|
3250
3138
|
<div style="flex: 1; min-width: 250px; max-width: 100%; box-sizing: border-box; overflow: hidden;">
|
|
3251
3139
|
<h4 style="margin-bottom: 8px; font-size: 0.9em; color: #9ca3af;">Uso de ejemplo:</h4>
|
|
3252
3140
|
<pre style="background: rgba(15,23,42,0.6); padding: 10px; border-radius: 4px; font-size: 0.85em; overflow-x: auto; color: #34d399; border: 1px solid rgba(52,211,153,0.2); margin: 0; height: 100%; box-sizing: border-box; max-width: 100%;"><code>$redis = new \Service\RedisCache();
|
|
3253
|
-
|
|
3254
3141
|
$response = $redis->hDel($hash, $field);
|
|
3255
|
-
|
|
3256
3142
|
if ($response['status'] === 'success') {
|
|
3257
3143
|
// Başarılı
|
|
3258
3144
|
}</code></pre>
|
|
@@ -3269,14 +3155,14 @@ true</code></pre>
|
|
|
3269
3155
|
</div>
|
|
3270
3156
|
</div>
|
|
3271
3157
|
<div class="card" id="svc-pusher">
|
|
3272
|
-
<h2>arribista
|
|
3273
|
-
<div class="alert a-info" style="margin-top: 10px; padding: 10px 15px; font-size: 0.85em;"><strong>📌 Membresía y claves API:</strong>
|
|
3158
|
+
<h2>arribista<span class="tag b-core" style="padding: 1px 5px; margin-left: 2px; font-weight: bold;" title="Servicio pago/con licencia">$</span></h2>
|
|
3159
|
+
<div class="alert a-info" style="margin-top: 10px; padding: 10px 15px; font-size: 0.85em;"><strong>📌 Membresía y claves API:</strong>Para comunicarse en tiempo real a través de WebSocket<a href="https://pusher.com" style="color: var(--green); font-weight: bold;" target="_blank">empujador.com</a>Debe crear una aplicación de Canales gratuita y obtener su ID de aplicación, clave e información secreta.</div>
|
|
3274
3160
|
<div class="code-badge" style="margin-bottom: 15px; padding: 10px; background: rgba(0,0,0,0.2); border: 1px solid rgba(255,255,255,0.05); border-radius: 6px; font-family: monospace;">
|
|
3275
3161
|
<strong>Ubicación de la clase:</strong> <code style="color: #4ade80;">src/Service/Pusher.php</code>
|
|
3276
3162
|
</div>
|
|
3277
|
-
<p style="margin-bottom: 15px; font-size: 0.95em; color: #a1a1aa;">Servicio de empuje en tiempo real<br/>Proporciona una interfaz limpia para Pusher Channels: transmisión de eventos,<br/>autenticar canales privados/
|
|
3163
|
+
<p style="margin-bottom: 15px; font-size: 0.95em; color: #a1a1aa;">Servicio de empuje en tiempo real<br/>Proporciona una interfaz limpia para Pusher Channels: transmisión de eventos,<br/>autenticar canales privados/presencia y consultar el estado del canal.<br/>Utiliza el SDK pusher/pusher-php-server. Toda la configuración desde $_ENV.<br/>Variables de entorno requeridas:<br/>PUSHER_APP_ID — Su ID de aplicación Pusher<br/>PUSHER_APP_KEY — Tu clave de aplicación Pusher<br/>PUSHER_APP_SECRET — El secreto de tu aplicación Pusher<br/>PUSHER_CLUSTER — Región del clúster de impulsores (p. ej., 'eu', 'us2', 'ap1')</p>
|
|
3278
3164
|
<div class="alert a-info" style="margin-bottom: 20px;">
|
|
3279
|
-
<strong>ℹ️ Devolución estándar:</strong>
|
|
3165
|
+
<strong>ℹ️ Devolución estándar:</strong>Todos los métodos<code>['status' => 'success|error', 'message' => '...', 'data' => [...]]</code>Convierte una cadena estándar en el formato (con excepciones).<strong>en la matriz devuelta en la sección "Retorno esperado" a continuación.<code>data</code>Se muestra la estructura detallada de la clave.</strong>
|
|
3280
3166
|
</div>
|
|
3281
3167
|
<h3>Métodos y ejemplos de uso</h3>
|
|
3282
3168
|
<div class="accordion-group">
|
|
@@ -3295,9 +3181,7 @@ true</code></pre>
|
|
|
3295
3181
|
<div style="flex: 1; min-width: 250px; max-width: 100%; box-sizing: border-box; overflow: hidden;">
|
|
3296
3182
|
<h4 style="margin-bottom: 8px; font-size: 0.9em; color: #9ca3af;">Uso de ejemplo:</h4>
|
|
3297
3183
|
<pre style="background: rgba(15,23,42,0.6); padding: 10px; border-radius: 4px; font-size: 0.85em; overflow-x: auto; color: #34d399; border: 1px solid rgba(52,211,153,0.2); margin: 0; height: 100%; box-sizing: border-box; max-width: 100%;"><code>$pusher = new \Service\Pusher();
|
|
3298
|
-
|
|
3299
3184
|
$response = $pusher->broadcast($channel, $event, $data);
|
|
3300
|
-
|
|
3301
3185
|
if ($response['status'] === 'success') {
|
|
3302
3186
|
// Başarılı
|
|
3303
3187
|
}</code></pre>
|
|
@@ -3314,7 +3198,7 @@ true</code></pre>
|
|
|
3314
3198
|
<details class="accordion" style="margin-bottom: 10px; border: 1px solid rgba(255,255,255,0.1); border-radius: 6px; padding: 5px; background: rgba(0,0,0,0.1); box-sizing: border-box; max-width: 100%;">
|
|
3315
3199
|
<summary style="cursor: pointer; padding: 10px; font-weight: bold; background: rgba(255,255,255,0.05); color: #fff; border-radius: 4px; box-sizing: border-box; max-width: 100%; word-break: break-all;"><code style="background: transparent; color: #60a5fa; font-size: 1.1em; white-space: pre-wrap; word-break: break-all;">broadcastToMany(array $channels, string $event, array $data)</code></summary>
|
|
3316
3200
|
<div class="accordion-content" style="padding: 15px; border-top: 1px solid rgba(255,255,255,0.05); box-sizing: border-box; max-width: 100%; overflow-x: hidden;">
|
|
3317
|
-
<p style="color: #d1d5db; margin-bottom: 15px; word-wrap: break-word;">Transmita un evento a múltiples canales simultáneamente. Activa el mismo evento con la misma carga útil en
|
|
3201
|
+
<p style="color: #d1d5db; margin-bottom: 15px; word-wrap: break-word;">Transmita un evento a múltiples canales simultáneamente. Activa el mismo evento con la misma carga útil en varios canales en una única llamada API. Pusher limita esto a un máximo de 100 canales por llamada.</p>
|
|
3318
3202
|
<div style="display: flex; flex-direction: column; gap: 15px; box-sizing: border-box; width: 100%; max-width: 100%;">
|
|
3319
3203
|
<div style="flex: 1; max-width: 100%; box-sizing: border-box; overflow: hidden;">
|
|
3320
3204
|
<h4 style="margin-bottom: 8px; font-size: 0.9em; color: #9ca3af;">Estructura de parámetros:</h4>
|
|
@@ -3326,9 +3210,7 @@ true</code></pre>
|
|
|
3326
3210
|
<div style="flex: 1; min-width: 250px; max-width: 100%; box-sizing: border-box; overflow: hidden;">
|
|
3327
3211
|
<h4 style="margin-bottom: 8px; font-size: 0.9em; color: #9ca3af;">Uso de ejemplo:</h4>
|
|
3328
3212
|
<pre style="background: rgba(15,23,42,0.6); padding: 10px; border-radius: 4px; font-size: 0.85em; overflow-x: auto; color: #34d399; border: 1px solid rgba(52,211,153,0.2); margin: 0; height: 100%; box-sizing: border-box; max-width: 100%;"><code>$pusher = new \Service\Pusher();
|
|
3329
|
-
|
|
3330
3213
|
$response = $pusher->broadcastToMany($channels, $event, $data);
|
|
3331
|
-
|
|
3332
3214
|
if ($response['status'] === 'success') {
|
|
3333
3215
|
// Başarılı
|
|
3334
3216
|
}</code></pre>
|
|
@@ -3345,7 +3227,7 @@ true</code></pre>
|
|
|
3345
3227
|
<details class="accordion" style="margin-bottom: 10px; border: 1px solid rgba(255,255,255,0.1); border-radius: 6px; padding: 5px; background: rgba(0,0,0,0.1); box-sizing: border-box; max-width: 100%;">
|
|
3346
3228
|
<summary style="cursor: pointer; padding: 10px; font-weight: bold; background: rgba(255,255,255,0.05); color: #fff; border-radius: 4px; box-sizing: border-box; max-width: 100%; word-break: break-all;"><code style="background: transparent; color: #60a5fa; font-size: 1.1em; white-space: pre-wrap; word-break: break-all;">toUser(string $userId, string $event, array $data)</code></summary>
|
|
3347
3229
|
<div class="accordion-content" style="padding: 15px; border-top: 1px solid rgba(255,255,255,0.05); box-sizing: border-box; max-width: 100%; overflow-x: hidden;">
|
|
3348
|
-
<p style="color: #d1d5db; margin-bottom: 15px; word-wrap: break-word;">
|
|
3230
|
+
<p style="color: #d1d5db; margin-bottom: 15px; word-wrap: break-word;">Enviar un evento a un usuario específico a través de su canal de usuario. Utiliza la función de eventos de usuario de Pusher para entregar un mensaje directamente a un único usuario autenticado, independientemente de a qué canales esté suscrito. El usuario debe haber sido autenticado con un ID de usuario en el lado del cliente.</p>
|
|
3349
3231
|
<div style="display: flex; flex-direction: column; gap: 15px; box-sizing: border-box; width: 100%; max-width: 100%;">
|
|
3350
3232
|
<div style="flex: 1; max-width: 100%; box-sizing: border-box; overflow: hidden;">
|
|
3351
3233
|
<h4 style="margin-bottom: 8px; font-size: 0.9em; color: #9ca3af;">Estructura de parámetros:</h4>
|
|
@@ -3357,9 +3239,7 @@ true</code></pre>
|
|
|
3357
3239
|
<div style="flex: 1; min-width: 250px; max-width: 100%; box-sizing: border-box; overflow: hidden;">
|
|
3358
3240
|
<h4 style="margin-bottom: 8px; font-size: 0.9em; color: #9ca3af;">Uso de ejemplo:</h4>
|
|
3359
3241
|
<pre style="background: rgba(15,23,42,0.6); padding: 10px; border-radius: 4px; font-size: 0.85em; overflow-x: auto; color: #34d399; border: 1px solid rgba(52,211,153,0.2); margin: 0; height: 100%; box-sizing: border-box; max-width: 100%;"><code>$pusher = new \Service\Pusher();
|
|
3360
|
-
|
|
3361
3242
|
$response = $pusher->toUser('dummy_data', $event, $data);
|
|
3362
|
-
|
|
3363
3243
|
if ($response['status'] === 'success') {
|
|
3364
3244
|
// Başarılı
|
|
3365
3245
|
}</code></pre>
|
|
@@ -3387,9 +3267,7 @@ Returns empty array on failure</code></pre>
|
|
|
3387
3267
|
<div style="flex: 1; min-width: 250px; max-width: 100%; box-sizing: border-box; overflow: hidden;">
|
|
3388
3268
|
<h4 style="margin-bottom: 8px; font-size: 0.9em; color: #9ca3af;">Uso de ejemplo:</h4>
|
|
3389
3269
|
<pre style="background: rgba(15,23,42,0.6); padding: 10px; border-radius: 4px; font-size: 0.85em; overflow-x: auto; color: #34d399; border: 1px solid rgba(52,211,153,0.2); margin: 0; height: 100%; box-sizing: border-box; max-width: 100%;"><code>$pusher = new \Service\Pusher();
|
|
3390
|
-
|
|
3391
3270
|
$response = $pusher->channelInfo($channel);
|
|
3392
|
-
|
|
3393
3271
|
if ($response['status'] === 'success') {
|
|
3394
3272
|
// Başarılı
|
|
3395
3273
|
}</code></pre>
|
|
@@ -3419,9 +3297,7 @@ if ($response['status'] === 'success') {
|
|
|
3419
3297
|
<div style="flex: 1; min-width: 250px; max-width: 100%; box-sizing: border-box; overflow: hidden;">
|
|
3420
3298
|
<h4 style="margin-bottom: 8px; font-size: 0.9em; color: #9ca3af;">Uso de ejemplo:</h4>
|
|
3421
3299
|
<pre style="background: rgba(15,23,42,0.6); padding: 10px; border-radius: 4px; font-size: 0.85em; overflow-x: auto; color: #34d399; border: 1px solid rgba(52,211,153,0.2); margin: 0; height: 100%; box-sizing: border-box; max-width: 100%;"><code>$pusher = new \Service\Pusher();
|
|
3422
|
-
|
|
3423
3300
|
$response = $pusher->channels();
|
|
3424
|
-
|
|
3425
3301
|
if ($response['status'] === 'success') {
|
|
3426
3302
|
// Başarılı
|
|
3427
3303
|
}</code></pre>
|
|
@@ -3451,9 +3327,7 @@ if ($response['status'] === 'success') {
|
|
|
3451
3327
|
<div style="flex: 1; min-width: 250px; max-width: 100%; box-sizing: border-box; overflow: hidden;">
|
|
3452
3328
|
<h4 style="margin-bottom: 8px; font-size: 0.9em; color: #9ca3af;">Uso de ejemplo:</h4>
|
|
3453
3329
|
<pre style="background: rgba(15,23,42,0.6); padding: 10px; border-radius: 4px; font-size: 0.85em; overflow-x: auto; color: #34d399; border: 1px solid rgba(52,211,153,0.2); margin: 0; height: 100%; box-sizing: border-box; max-width: 100%;"><code>$pusher = new \Service\Pusher();
|
|
3454
|
-
|
|
3455
3330
|
$response = $pusher->auth('dummy_data', 'dummy_data');
|
|
3456
|
-
|
|
3457
3331
|
if ($response['status'] === 'success') {
|
|
3458
3332
|
// Başarılı
|
|
3459
3333
|
}</code></pre>
|
|
@@ -3483,9 +3357,7 @@ if ($response['status'] === 'success') {
|
|
|
3483
3357
|
<div style="flex: 1; min-width: 250px; max-width: 100%; box-sizing: border-box; overflow: hidden;">
|
|
3484
3358
|
<h4 style="margin-bottom: 8px; font-size: 0.9em; color: #9ca3af;">Uso de ejemplo:</h4>
|
|
3485
3359
|
<pre style="background: rgba(15,23,42,0.6); padding: 10px; border-radius: 4px; font-size: 0.85em; overflow-x: auto; color: #34d399; border: 1px solid rgba(52,211,153,0.2); margin: 0; height: 100%; box-sizing: border-box; max-width: 100%;"><code>$pusher = new \Service\Pusher();
|
|
3486
|
-
|
|
3487
3360
|
$response = $pusher->presenceAuth('dummy_data', 'dummy_data', 'dummy_data');
|
|
3488
|
-
|
|
3489
3361
|
if ($response['status'] === 'success') {
|
|
3490
3362
|
// Başarılı
|
|
3491
3363
|
}</code></pre>
|
|
@@ -3502,14 +3374,14 @@ if ($response['status'] === 'success') {
|
|
|
3502
3374
|
</div>
|
|
3503
3375
|
</div>
|
|
3504
3376
|
<div class="card" id="svc-twilio">
|
|
3505
|
-
<h2>Gorjeo
|
|
3506
|
-
<div class="alert a-info" style="margin-top: 10px; padding: 10px 15px; font-size: 0.85em;"><strong>📌 Membresía y claves API:</strong>
|
|
3377
|
+
<h2>Gorjeo<span class="tag b-core" style="padding: 1px 5px; margin-left: 2px; font-weight: bold;" title="Servicio pago/con licencia">$</span></h2>
|
|
3378
|
+
<div class="alert a-info" style="margin-top: 10px; padding: 10px 15px; font-size: 0.85em;"><strong>📌 Membresía y claves API:</strong>Para enviar mensajes SMS y WhatsApp<a href="https://www.twilio.com" style="color: var(--green); font-weight: bold;" target="_blank">twilio.com</a>Debe abrir una cuenta en , alquilar un número de teléfono disponible y obtener la información del SID de su cuenta y del token de autenticación del panel.</div>
|
|
3507
3379
|
<div class="code-badge" style="margin-bottom: 15px; padding: 10px; background: rgba(0,0,0,0.2); border: 1px solid rgba(255,255,255,0.05); border-radius: 6px; font-family: monospace;">
|
|
3508
3380
|
<strong>Ubicación de la clase:</strong> <code style="color: #4ade80;">src/Service/Twilio.php</code>
|
|
3509
3381
|
</div>
|
|
3510
3382
|
<p style="margin-bottom: 15px; font-size: 0.95em; color: #a1a1aa;">Servicio de comunicaciones de Twilio<br/>Proporciona una interfaz simplificada para mensajería, voz,<br/>y API de verificación utilizando twilio/sdk. Toda la configuración<br/>se lee desde $_ENV.<br/>Variables de entorno requeridas:<br/>TWILIO_SID: SID de su cuenta Twilio<br/>TWILIO_AUTH_TOKEN: su token de autenticación de Twilio<br/>TWILIO_FROM_NUMBER: número de teléfono predeterminado "de" (formato E.164, por ejemplo, +15551234567)<br/>Variables de entorno opcionales:<br/>TWILIO_VERIFY_SID — Verificar SID del servicio (requerido para verificarStart/verifyCheck)</p>
|
|
3511
3383
|
<div class="alert a-info" style="margin-bottom: 20px;">
|
|
3512
|
-
<strong>ℹ️ Devolución estándar:</strong>
|
|
3384
|
+
<strong>ℹ️ Devolución estándar:</strong>Todos los métodos<code>['status' => 'success|error', 'message' => '...', 'data' => [...]]</code>Convierte una cadena estándar en el formato (con excepciones).<strong>en la matriz devuelta en la sección "Retorno esperado" a continuación.<code>data</code>Se muestra la estructura detallada de la clave.</strong>
|
|
3513
3385
|
</div>
|
|
3514
3386
|
<h3>Métodos y ejemplos de uso</h3>
|
|
3515
3387
|
<div class="accordion-group">
|
|
@@ -3522,15 +3394,13 @@ if ($response['status'] === 'success') {
|
|
|
3522
3394
|
<h4 style="margin-bottom: 8px; font-size: 0.9em; color: #9ca3af;">Estructura de parámetros:</h4>
|
|
3523
3395
|
<pre style="background: rgba(0,0,0,0.3); padding: 10px; border-radius: 4px; font-size: 0.85em; overflow-x: auto; color: #a78bfa; border: 1px solid rgba(255,255,255,0.05); margin: 0; box-sizing: border-box; max-width: 100%;"><code>@param string $to Recipient phone number in E.164 format (e.g., +905551234567)
|
|
3524
3396
|
@param string $message The SMS body text (max 1600 characters)
|
|
3525
|
-
On error: 'status'
|
|
3397
|
+
On error: 'status' => 'error', 'message' => error description</code></pre>
|
|
3526
3398
|
</div>
|
|
3527
3399
|
<div style="display: flex; flex-wrap: wrap; gap: 15px; box-sizing: border-box; width: 100%;">
|
|
3528
3400
|
<div style="flex: 1; min-width: 250px; max-width: 100%; box-sizing: border-box; overflow: hidden;">
|
|
3529
3401
|
<h4 style="margin-bottom: 8px; font-size: 0.9em; color: #9ca3af;">Uso de ejemplo:</h4>
|
|
3530
3402
|
<pre style="background: rgba(15,23,42,0.6); padding: 10px; border-radius: 4px; font-size: 0.85em; overflow-x: auto; color: #34d399; border: 1px solid rgba(52,211,153,0.2); margin: 0; height: 100%; box-sizing: border-box; max-width: 100%;"><code>$twilio = new \Service\Twilio();
|
|
3531
|
-
|
|
3532
3403
|
$response = $twilio->sendSms($to, $message);
|
|
3533
|
-
|
|
3534
3404
|
if ($response['status'] === 'success') {
|
|
3535
3405
|
// Başarılı
|
|
3536
3406
|
}</code></pre>
|
|
@@ -3560,9 +3430,7 @@ if ($response['status'] === 'success') {
|
|
|
3560
3430
|
<div style="flex: 1; min-width: 250px; max-width: 100%; box-sizing: border-box; overflow: hidden;">
|
|
3561
3431
|
<h4 style="margin-bottom: 8px; font-size: 0.9em; color: #9ca3af;">Uso de ejemplo:</h4>
|
|
3562
3432
|
<pre style="background: rgba(15,23,42,0.6); padding: 10px; border-radius: 4px; font-size: 0.85em; overflow-x: auto; color: #34d399; border: 1px solid rgba(52,211,153,0.2); margin: 0; height: 100%; box-sizing: border-box; max-width: 100%;"><code>$twilio = new \Service\Twilio();
|
|
3563
|
-
|
|
3564
3433
|
$response = $twilio->sendWhatsApp($to, $message);
|
|
3565
|
-
|
|
3566
3434
|
if ($response['status'] === 'success') {
|
|
3567
3435
|
// Başarılı
|
|
3568
3436
|
}</code></pre>
|
|
@@ -3581,7 +3449,7 @@ if ($response['status'] === 'success') {
|
|
|
3581
3449
|
<details class="accordion" style="margin-bottom: 10px; border: 1px solid rgba(255,255,255,0.1); border-radius: 6px; padding: 5px; background: rgba(0,0,0,0.1); box-sizing: border-box; max-width: 100%;">
|
|
3582
3450
|
<summary style="cursor: pointer; padding: 10px; font-weight: bold; background: rgba(255,255,255,0.05); color: #fff; border-radius: 4px; box-sizing: border-box; max-width: 100%; word-break: break-all;"><code style="background: transparent; color: #60a5fa; font-size: 1.1em; white-space: pre-wrap; word-break: break-all;">call(string $to, string $twimlUrl)</code></summary>
|
|
3583
3451
|
<div class="accordion-content" style="padding: 15px; border-top: 1px solid rgba(255,255,255,0.05); box-sizing: border-box; max-width: 100%; overflow-x: hidden;">
|
|
3584
|
-
<p style="color: #d1d5db; margin-bottom: 15px; word-wrap: break-word;">Iniciar una llamada de voz. Realiza una llamada saliente al número especificado. El comportamiento de la llamada está definido por el documento TwiML en la URL proporcionada. La URL de TwiML debería devolver instrucciones como
|
|
3452
|
+
<p style="color: #d1d5db; margin-bottom: 15px; word-wrap: break-word;">Iniciar una llamada de voz. Realiza una llamada saliente al número especificado. El comportamiento de la llamada está definido por el documento TwiML en la URL proporcionada. La URL de TwiML debería devolver instrucciones como<say>, <play>, <gather>, etc.</gather></play></say></p>
|
|
3585
3453
|
<div style="display: flex; flex-direction: column; gap: 15px; box-sizing: border-box; width: 100%; max-width: 100%;">
|
|
3586
3454
|
<div style="flex: 1; max-width: 100%; box-sizing: border-box; overflow: hidden;">
|
|
3587
3455
|
<h4 style="margin-bottom: 8px; font-size: 0.9em; color: #9ca3af;">Estructura de parámetros:</h4>
|
|
@@ -3592,9 +3460,7 @@ if ($response['status'] === 'success') {
|
|
|
3592
3460
|
<div style="flex: 1; min-width: 250px; max-width: 100%; box-sizing: border-box; overflow: hidden;">
|
|
3593
3461
|
<h4 style="margin-bottom: 8px; font-size: 0.9em; color: #9ca3af;">Uso de ejemplo:</h4>
|
|
3594
3462
|
<pre style="background: rgba(15,23,42,0.6); padding: 10px; border-radius: 4px; font-size: 0.85em; overflow-x: auto; color: #34d399; border: 1px solid rgba(52,211,153,0.2); margin: 0; height: 100%; box-sizing: border-box; max-width: 100%;"><code>$twilio = new \Service\Twilio();
|
|
3595
|
-
|
|
3596
3463
|
$response = $twilio->call($to, $twimlUrl);
|
|
3597
|
-
|
|
3598
3464
|
if ($response['status'] === 'success') {
|
|
3599
3465
|
// Başarılı
|
|
3600
3466
|
}</code></pre>
|
|
@@ -3625,9 +3491,7 @@ status will be 'pending' on success</code></pre>
|
|
|
3625
3491
|
<div style="flex: 1; min-width: 250px; max-width: 100%; box-sizing: border-box; overflow: hidden;">
|
|
3626
3492
|
<h4 style="margin-bottom: 8px; font-size: 0.9em; color: #9ca3af;">Uso de ejemplo:</h4>
|
|
3627
3493
|
<pre style="background: rgba(15,23,42,0.6); padding: 10px; border-radius: 4px; font-size: 0.85em; overflow-x: auto; color: #34d399; border: 1px solid rgba(52,211,153,0.2); margin: 0; height: 100%; box-sizing: border-box; max-width: 100%;"><code>$twilio = new \Service\Twilio();
|
|
3628
|
-
|
|
3629
3494
|
$response = $twilio->verifyStart($to);
|
|
3630
|
-
|
|
3631
3495
|
if ($response['status'] === 'success') {
|
|
3632
3496
|
// Başarılı
|
|
3633
3497
|
}</code></pre>
|
|
@@ -3658,9 +3522,7 @@ status will be 'approved' on successful verification</code></pre>
|
|
|
3658
3522
|
<div style="flex: 1; min-width: 250px; max-width: 100%; box-sizing: border-box; overflow: hidden;">
|
|
3659
3523
|
<h4 style="margin-bottom: 8px; font-size: 0.9em; color: #9ca3af;">Uso de ejemplo:</h4>
|
|
3660
3524
|
<pre style="background: rgba(15,23,42,0.6); padding: 10px; border-radius: 4px; font-size: 0.85em; overflow-x: auto; color: #34d399; border: 1px solid rgba(52,211,153,0.2); margin: 0; height: 100%; box-sizing: border-box; max-width: 100%;"><code>$twilio = new \Service\Twilio();
|
|
3661
|
-
|
|
3662
3525
|
$response = $twilio->verifyCheck($to, $code);
|
|
3663
|
-
|
|
3664
3526
|
if ($response['status'] === 'success') {
|
|
3665
3527
|
// Başarılı
|
|
3666
3528
|
}</code></pre>
|
|
@@ -3679,7 +3541,7 @@ if ($response['status'] === 'success') {
|
|
|
3679
3541
|
<details class="accordion" style="margin-bottom: 10px; border: 1px solid rgba(255,255,255,0.1); border-radius: 6px; padding: 5px; background: rgba(0,0,0,0.1); box-sizing: border-box; max-width: 100%;">
|
|
3680
3542
|
<summary style="cursor: pointer; padding: 10px; font-weight: bold; background: rgba(255,255,255,0.05); color: #fff; border-radius: 4px; box-sizing: border-box; max-width: 100%; word-break: break-all;"><code style="background: transparent; color: #60a5fa; font-size: 1.1em; white-space: pre-wrap; word-break: break-all;">getMessageStatus(string $messageSid)</code></summary>
|
|
3681
3543
|
<div class="accordion-content" style="padding: 15px; border-top: 1px solid rgba(255,255,255,0.05); box-sizing: border-box; max-width: 100%; overflow-x: hidden;">
|
|
3682
|
-
<p style="color: #d1d5db; margin-bottom: 15px; word-wrap: break-word;">Obtenga el estado de entrega de un mensaje específico. Obtiene el estado actual de un mensaje enviado
|
|
3544
|
+
<p style="color: #d1d5db; margin-bottom: 15px; word-wrap: break-word;">Obtenga el estado de entrega de un mensaje específico. Obtiene el estado actual de un mensaje enviado anteriormente por su SID único. Posibles estados: en cola, enviando, enviado, entregado, no entregado, fallido</p>
|
|
3683
3545
|
<div style="display: flex; flex-direction: column; gap: 15px; box-sizing: border-box; width: 100%; max-width: 100%;">
|
|
3684
3546
|
<div style="flex: 1; max-width: 100%; box-sizing: border-box; overflow: hidden;">
|
|
3685
3547
|
<h4 style="margin-bottom: 8px; font-size: 0.9em; color: #9ca3af;">Estructura de parámetros:</h4>
|
|
@@ -3690,9 +3552,7 @@ if ($response['status'] === 'success') {
|
|
|
3690
3552
|
<div style="flex: 1; min-width: 250px; max-width: 100%; box-sizing: border-box; overflow: hidden;">
|
|
3691
3553
|
<h4 style="margin-bottom: 8px; font-size: 0.9em; color: #9ca3af;">Uso de ejemplo:</h4>
|
|
3692
3554
|
<pre style="background: rgba(15,23,42,0.6); padding: 10px; border-radius: 4px; font-size: 0.85em; overflow-x: auto; color: #34d399; border: 1px solid rgba(52,211,153,0.2); margin: 0; height: 100%; box-sizing: border-box; max-width: 100%;"><code>$twilio = new \Service\Twilio();
|
|
3693
|
-
|
|
3694
3555
|
$response = $twilio->getMessageStatus('dummy_data');
|
|
3695
|
-
|
|
3696
3556
|
if ($response['status'] === 'success') {
|
|
3697
3557
|
// Başarılı
|
|
3698
3558
|
}</code></pre>
|
|
@@ -3722,9 +3582,7 @@ if ($response['status'] === 'success') {
|
|
|
3722
3582
|
<div style="flex: 1; min-width: 250px; max-width: 100%; box-sizing: border-box; overflow: hidden;">
|
|
3723
3583
|
<h4 style="margin-bottom: 8px; font-size: 0.9em; color: #9ca3af;">Uso de ejemplo:</h4>
|
|
3724
3584
|
<pre style="background: rgba(15,23,42,0.6); padding: 10px; border-radius: 4px; font-size: 0.85em; overflow-x: auto; color: #34d399; border: 1px solid rgba(52,211,153,0.2); margin: 0; height: 100%; box-sizing: border-box; max-width: 100%;"><code>$twilio = new \Service\Twilio();
|
|
3725
|
-
|
|
3726
3585
|
$response = $twilio->listMessages();
|
|
3727
|
-
|
|
3728
3586
|
if ($response['status'] === 'success') {
|
|
3729
3587
|
// Başarılı
|
|
3730
3588
|
}</code></pre>
|
|
@@ -3755,9 +3613,7 @@ if ($response['status'] === 'success') {
|
|
|
3755
3613
|
<div style="flex: 1; min-width: 250px; max-width: 100%; box-sizing: border-box; overflow: hidden;">
|
|
3756
3614
|
<h4 style="margin-bottom: 8px; font-size: 0.9em; color: #9ca3af;">Uso de ejemplo:</h4>
|
|
3757
3615
|
<pre style="background: rgba(15,23,42,0.6); padding: 10px; border-radius: 4px; font-size: 0.85em; overflow-x: auto; color: #34d399; border: 1px solid rgba(52,211,153,0.2); margin: 0; height: 100%; box-sizing: border-box; max-width: 100%;"><code>$twilio = new \Service\Twilio();
|
|
3758
|
-
|
|
3759
3616
|
$response = $twilio->sendBulkSms($recipients, $message);
|
|
3760
|
-
|
|
3761
3617
|
if ($response['status'] === 'success') {
|
|
3762
3618
|
// Başarılı
|
|
3763
3619
|
}</code></pre>
|
|
@@ -3776,85 +3632,25 @@ if ($response['status'] === 'success') {
|
|
|
3776
3632
|
</div>
|
|
3777
3633
|
</div>
|
|
3778
3634
|
<div class="card" id="svc-sentry">
|
|
3779
|
-
<h2>
|
|
3780
|
-
<div class="alert a-info" style="margin-top: 10px; padding: 10px 15px; font-size: 0.85em;"><strong>📌 Membresía y claves API:</strong>
|
|
3635
|
+
<h2>centinela<span class="tag b-core" style="padding: 1px 5px; margin-left: 2px; font-weight: bold;" title="Servicio pago/con licencia">$</span></h2>
|
|
3636
|
+
<div class="alert a-info" style="margin-top: 10px; padding: 10px 15px; font-size: 0.85em;"><strong>📌 Membresía y claves API:</strong>Para habilitar el seguimiento de errores y rendimiento<a href="https://sentry.io" style="color: var(--green); font-weight: bold;" target="_blank">centinela.io</a>Debe crear su cuenta gratuita a través de, agregar un proyecto PHP y copiar la dirección DSN (Clave de cliente) que se le proporcionó.</div>
|
|
3781
3637
|
<div class="code-badge" style="margin-bottom: 15px; padding: 10px; background: rgba(0,0,0,0.2); border: 1px solid rgba(255,255,255,0.05); border-radius: 6px; font-family: monospace;">
|
|
3782
|
-
<strong>Ubicación de la clase:</strong> <code style="color: #4ade80;">
|
|
3638
|
+
<strong>Ubicación de la clase:</strong> <code style="color: #4ade80;">src/Service/Sentry.php</code>
|
|
3783
3639
|
</div>
|
|
3784
|
-
<p style="margin-bottom: 15px; font-size: 0.95em; color: #a1a1aa;"
|
|
3640
|
+
<p style="margin-bottom: 15px; font-size: 0.95em; color: #a1a1aa;">Le permite recopilar errores y advertencias en su proyecto en un sistema de registro central. Al inicio de su solicitud (p. ej.<code>ApiControl.php</code>o<code>ViewControl.php</code>Se recomienda comenzar en .</p>
|
|
3785
3641
|
<div class="alert a-info" style="margin-bottom: 20px;">
|
|
3786
|
-
<strong>ℹ️
|
|
3787
|
-
</div>
|
|
3642
|
+
<strong>ℹ️ Clase estática:</strong>Esta clase de servicio se usa directamente con métodos estáticos, no es necesario crear una nueva instancia.</div>
|
|
3788
3643
|
<h3>Métodos y ejemplos de uso</h3>
|
|
3789
3644
|
<div class="accordion-group">
|
|
3790
3645
|
<details class="accordion" style="margin-bottom: 10px; border: 1px solid rgba(255,255,255,0.1); border-radius: 6px; padding: 5px; background: rgba(0,0,0,0.1); box-sizing: border-box; max-width: 100%;">
|
|
3791
|
-
<summary style="cursor: pointer; padding: 10px; font-weight: bold; background: rgba(255,255,255,0.05); color: #fff; border-radius: 4px; box-sizing: border-box; max-width: 100%; word-break: break-all;"><code style="background: transparent; color: #60a5fa; font-size: 1.1em; white-space: pre-wrap; word-break: break-all;">
|
|
3646
|
+
<summary style="cursor: pointer; padding: 10px; font-weight: bold; background: rgba(255,255,255,0.05); color: #fff; border-radius: 4px; box-sizing: border-box; max-width: 100%; word-break: break-all;"><code style="background: transparent; color: #60a5fa; font-size: 1.1em; white-space: pre-wrap; word-break: break-all;">init()</code></summary>
|
|
3792
3647
|
<div class="accordion-content" style="padding: 15px; border-top: 1px solid rgba(255,255,255,0.05); box-sizing: border-box; max-width: 100%; overflow-x: hidden;">
|
|
3793
|
-
<p style="color: #d1d5db; margin-bottom: 15px; word-wrap: break-word;">
|
|
3648
|
+
<p style="color: #d1d5db; margin-bottom: 15px; word-wrap: break-word;">Inicializa el SDK de Sentry en función de las variables de entorno. Debe llamarse una vez al comienzo de la aplicación.</p>
|
|
3794
3649
|
<div style="display: flex; flex-direction: column; gap: 15px; box-sizing: border-box; width: 100%; max-width: 100%;">
|
|
3795
|
-
<div style="flex: 1; max-width: 100%; box-sizing: border-box; overflow: hidden;">
|
|
3796
|
-
<h4 style="margin-bottom: 8px; font-size: 0.9em; color: #9ca3af;">Estructura de parámetros:</h4>
|
|
3797
|
-
<pre style="background: rgba(0,0,0,0.3); padding: 10px; border-radius: 4px; font-size: 0.85em; overflow-x: auto; color: #a78bfa; border: 1px solid rgba(255,255,255,0.05); margin: 0; box-sizing: border-box; max-width: 100%;"><code>}
|
|
3798
|
-
// Capture an informational message
|
|
3799
|
-
captureMessage('Deployment completed', 'info');
|
|
3800
|
-
/
|
|
3801
|
-
// ---------------------------------------------------------------
|
|
3802
|
-
// Guard — only initialize when a DSN is available
|
|
3803
|
-
// ---------------------------------------------------------------
|
|
3804
|
-
if (empty($_ENV['SENTRY_DSN'])) {
|
|
3805
|
-
/**
|
|
3806
|
-
No-op fallback when Sentry is not configured.
|
|
3807
|
-
@param \Throwable $e The exception (ignored).</code></pre>
|
|
3808
|
-
</div>
|
|
3809
3650
|
<div style="display: flex; flex-wrap: wrap; gap: 15px; box-sizing: border-box; width: 100%;">
|
|
3810
3651
|
<div style="flex: 1; min-width: 250px; max-width: 100%; box-sizing: border-box; overflow: hidden;">
|
|
3811
3652
|
<h4 style="margin-bottom: 8px; font-size: 0.9em; color: #9ca3af;">Uso de ejemplo:</h4>
|
|
3812
|
-
<pre style="background: rgba(15,23,42,0.6); padding: 10px; border-radius: 4px; font-size: 0.85em; overflow-x: auto; color: #34d399; border: 1px solid rgba(52,211,153,0.2); margin: 0; height: 100%; box-sizing: border-box; max-width: 100%;"><code
|
|
3813
|
-
|
|
3814
|
-
$response = $sentry->captureError($e);
|
|
3815
|
-
|
|
3816
|
-
if ($response['status'] === 'success') {
|
|
3817
|
-
// Başarılı
|
|
3818
|
-
}</code></pre>
|
|
3819
|
-
</div>
|
|
3820
|
-
<div style="flex: 1; min-width: 250px; max-width: 100%; box-sizing: border-box; overflow: hidden;">
|
|
3821
|
-
<h4 style="margin-bottom: 8px; font-size: 0.9em; color: #9ca3af;">Retorno esperado ($respuesta['datos']):</h4>
|
|
3822
|
-
<pre style="background: rgba(69,26,3,0.4); padding: 10px; border-radius: 4px; font-size: 0.85em; overflow-x: auto; color: #facc15; border: 1px solid rgba(250,204,21,0.2); margin: 0; height: 100%; box-sizing: border-box; max-width: 100%;"><code>[
|
|
3823
|
-
'id' => '...',
|
|
3824
|
-
'success' => true
|
|
3825
|
-
]</code></pre>
|
|
3826
|
-
</div>
|
|
3827
|
-
</div>
|
|
3828
|
-
</div>
|
|
3829
|
-
</div>
|
|
3830
|
-
</details>
|
|
3831
|
-
<details class="accordion" style="margin-bottom: 10px; border: 1px solid rgba(255,255,255,0.1); border-radius: 6px; padding: 5px; background: rgba(0,0,0,0.1); box-sizing: border-box; max-width: 100%;">
|
|
3832
|
-
<summary style="cursor: pointer; padding: 10px; font-weight: bold; background: rgba(255,255,255,0.05); color: #fff; border-radius: 4px; box-sizing: border-box; max-width: 100%; word-break: break-all;"><code style="background: transparent; color: #60a5fa; font-size: 1.1em; white-space: pre-wrap; word-break: break-all;">captureMessage(string $message, string $level = 'info')</code></summary>
|
|
3833
|
-
<div class="accordion-content" style="padding: 15px; border-top: 1px solid rgba(255,255,255,0.05); box-sizing: border-box; max-width: 100%; overflow-x: hidden;">
|
|
3834
|
-
<p style="color: #d1d5db; margin-bottom: 15px; word-wrap: break-word;">Reserva no operativa cuando Sentry no está configurado.</p>
|
|
3835
|
-
<div style="display: flex; flex-direction: column; gap: 15px; box-sizing: border-box; width: 100%; max-width: 100%;">
|
|
3836
|
-
<div style="flex: 1; max-width: 100%; box-sizing: border-box; overflow: hidden;">
|
|
3837
|
-
<h4 style="margin-bottom: 8px; font-size: 0.9em; color: #9ca3af;">Estructura de parámetros:</h4>
|
|
3838
|
-
<pre style="background: rgba(0,0,0,0.3); padding: 10px; border-radius: 4px; font-size: 0.85em; overflow-x: auto; color: #a78bfa; border: 1px solid rgba(255,255,255,0.05); margin: 0; box-sizing: border-box; max-width: 100%;"><code>@param string $message The message (ignored).
|
|
3839
|
-
@param string $level Severity level (ignored).</code></pre>
|
|
3840
|
-
</div>
|
|
3841
|
-
<div style="display: flex; flex-wrap: wrap; gap: 15px; box-sizing: border-box; width: 100%;">
|
|
3842
|
-
<div style="flex: 1; min-width: 250px; max-width: 100%; box-sizing: border-box; overflow: hidden;">
|
|
3843
|
-
<h4 style="margin-bottom: 8px; font-size: 0.9em; color: #9ca3af;">Uso de ejemplo:</h4>
|
|
3844
|
-
<pre style="background: rgba(15,23,42,0.6); padding: 10px; border-radius: 4px; font-size: 0.85em; overflow-x: auto; color: #34d399; border: 1px solid rgba(52,211,153,0.2); margin: 0; height: 100%; box-sizing: border-box; max-width: 100%;"><code>$sentry = new \Service\sentry();
|
|
3845
|
-
|
|
3846
|
-
$response = $sentry->captureMessage($message);
|
|
3847
|
-
|
|
3848
|
-
if ($response['status'] === 'success') {
|
|
3849
|
-
// Başarılı
|
|
3850
|
-
}</code></pre>
|
|
3851
|
-
</div>
|
|
3852
|
-
<div style="flex: 1; min-width: 250px; max-width: 100%; box-sizing: border-box; overflow: hidden;">
|
|
3853
|
-
<h4 style="margin-bottom: 8px; font-size: 0.9em; color: #9ca3af;">Retorno esperado ($respuesta['datos']):</h4>
|
|
3854
|
-
<pre style="background: rgba(69,26,3,0.4); padding: 10px; border-radius: 4px; font-size: 0.85em; overflow-x: auto; color: #facc15; border: 1px solid rgba(250,204,21,0.2); margin: 0; height: 100%; box-sizing: border-box; max-width: 100%;"><code>[
|
|
3855
|
-
'id' => '...',
|
|
3856
|
-
'success' => true
|
|
3857
|
-
]</code></pre>
|
|
3653
|
+
<pre style="background: rgba(15,23,42,0.6); padding: 10px; border-radius: 4px; font-size: 0.85em; overflow-x: auto; color: #34d399; border: 1px solid rgba(52,211,153,0.2); margin: 0; height: 100%; box-sizing: border-box; max-width: 100%;"><code>\Src\Service\Sentry::init();</code></pre>
|
|
3858
3654
|
</div>
|
|
3859
3655
|
</div>
|
|
3860
3656
|
</div>
|
|
@@ -3863,36 +3659,20 @@ if ($response['status'] === 'success') {
|
|
|
3863
3659
|
<details class="accordion" style="margin-bottom: 10px; border: 1px solid rgba(255,255,255,0.1); border-radius: 6px; padding: 5px; background: rgba(0,0,0,0.1); box-sizing: border-box; max-width: 100%;">
|
|
3864
3660
|
<summary style="cursor: pointer; padding: 10px; font-weight: bold; background: rgba(255,255,255,0.05); color: #fff; border-radius: 4px; box-sizing: border-box; max-width: 100%; word-break: break-all;"><code style="background: transparent; color: #60a5fa; font-size: 1.1em; white-space: pre-wrap; word-break: break-all;">captureError(\Throwable $e)</code></summary>
|
|
3865
3661
|
<div class="accordion-content" style="padding: 15px; border-top: 1px solid rgba(255,255,255,0.05); box-sizing: border-box; max-width: 100%; overflow-x: hidden;">
|
|
3866
|
-
<p style="color: #d1d5db; margin-bottom: 15px; word-wrap: break-word;"
|
|
3662
|
+
<p style="color: #d1d5db; margin-bottom: 15px; word-wrap: break-word;">Envía una excepción capturada o un objeto arrojable a Sentry.</p>
|
|
3867
3663
|
<div style="display: flex; flex-direction: column; gap: 15px; box-sizing: border-box; width: 100%; max-width: 100%;">
|
|
3868
|
-
<div style="flex: 1; max-width: 100%; box-sizing: border-box; overflow: hidden;">
|
|
3869
|
-
<h4 style="margin-bottom: 8px; font-size: 0.9em; color: #9ca3af;">Estructura de parámetros:</h4>
|
|
3870
|
-
<pre style="background: rgba(0,0,0,0.3); padding: 10px; border-radius: 4px; font-size: 0.85em; overflow-x: auto; color: #a78bfa; border: 1px solid rgba(255,255,255,0.05); margin: 0; box-sizing: border-box; max-width: 100%;"><code>}
|
|
3871
|
-
\Sentry\init($options);
|
|
3872
|
-
// ---------------------------------------------------------------
|
|
3873
|
-
// Helper functions
|
|
3874
|
-
// ---------------------------------------------------------------
|
|
3875
|
-
/**
|
|
3876
|
-
Capture a Throwable and send it to Sentry.
|
|
3877
|
-
@param \Throwable $e The exception or error to report.</code></pre>
|
|
3878
|
-
</div>
|
|
3879
3664
|
<div style="display: flex; flex-wrap: wrap; gap: 15px; box-sizing: border-box; width: 100%;">
|
|
3880
3665
|
<div style="flex: 1; min-width: 250px; max-width: 100%; box-sizing: border-box; overflow: hidden;">
|
|
3881
3666
|
<h4 style="margin-bottom: 8px; font-size: 0.9em; color: #9ca3af;">Uso de ejemplo:</h4>
|
|
3882
|
-
<pre style="background: rgba(15,23,42,0.6); padding: 10px; border-radius: 4px; font-size: 0.85em; overflow-x: auto; color: #34d399; border: 1px solid rgba(52,211,153,0.2); margin: 0; height: 100%; box-sizing: border-box; max-width: 100%;"><code
|
|
3883
|
-
|
|
3884
|
-
|
|
3885
|
-
|
|
3886
|
-
if ($response['status'] === 'success') {
|
|
3887
|
-
// Başarılı
|
|
3667
|
+
<pre style="background: rgba(15,23,42,0.6); padding: 10px; border-radius: 4px; font-size: 0.85em; overflow-x: auto; color: #34d399; border: 1px solid rgba(52,211,153,0.2); margin: 0; height: 100%; box-sizing: border-box; max-width: 100%;"><code>try {
|
|
3668
|
+
// Hata yapabilecek işlemler...
|
|
3669
|
+
} catch (\Throwable $e) {
|
|
3670
|
+
$eventId = \Src\Service\Sentry::captureError($e);
|
|
3888
3671
|
}</code></pre>
|
|
3889
3672
|
</div>
|
|
3890
3673
|
<div style="flex: 1; min-width: 250px; max-width: 100%; box-sizing: border-box; overflow: hidden;">
|
|
3891
|
-
<h4 style="margin-bottom: 8px; font-size: 0.9em; color: #9ca3af;">Retorno esperado (
|
|
3892
|
-
<pre style="background: rgba(69,26,3,0.4); padding: 10px; border-radius: 4px; font-size: 0.85em; overflow-x: auto; color: #facc15; border: 1px solid rgba(250,204,21,0.2); margin: 0; height: 100%; box-sizing: border-box; max-width: 100%;"><code>
|
|
3893
|
-
'id' => '...',
|
|
3894
|
-
'success' => true
|
|
3895
|
-
]</code></pre>
|
|
3674
|
+
<h4 style="margin-bottom: 8px; font-size: 0.9em; color: #9ca3af;">Retorno esperado (cadena|nulo):</h4>
|
|
3675
|
+
<pre style="background: rgba(69,26,3,0.4); padding: 10px; border-radius: 4px; font-size: 0.85em; overflow-x: auto; color: #facc15; border: 1px solid rgba(250,204,21,0.2); margin: 0; height: 100%; box-sizing: border-box; max-width: 100%;"><code>"dfb9370...b86" // Sentry Olay ID'si</code></pre>
|
|
3896
3676
|
</div>
|
|
3897
3677
|
</div>
|
|
3898
3678
|
</div>
|
|
@@ -3901,30 +3681,12 @@ if ($response['status'] === 'success') {
|
|
|
3901
3681
|
<details class="accordion" style="margin-bottom: 10px; border: 1px solid rgba(255,255,255,0.1); border-radius: 6px; padding: 5px; background: rgba(0,0,0,0.1); box-sizing: border-box; max-width: 100%;">
|
|
3902
3682
|
<summary style="cursor: pointer; padding: 10px; font-weight: bold; background: rgba(255,255,255,0.05); color: #fff; border-radius: 4px; box-sizing: border-box; max-width: 100%; word-break: break-all;"><code style="background: transparent; color: #60a5fa; font-size: 1.1em; white-space: pre-wrap; word-break: break-all;">captureMessage(string $message, string $level = 'info')</code></summary>
|
|
3903
3683
|
<div class="accordion-content" style="padding: 15px; border-top: 1px solid rgba(255,255,255,0.05); box-sizing: border-box; max-width: 100%; overflow-x: hidden;">
|
|
3904
|
-
<p style="color: #d1d5db; margin-bottom: 15px; word-wrap: break-word;">
|
|
3684
|
+
<p style="color: #d1d5db; margin-bottom: 15px; word-wrap: break-word;">Envía un texto específico a Sentry como mensaje de información/advertencia. Niveles válidos:<code>fatal</code>, <code>error</code>, <code>warning</code>, <code>info</code>, <code>debug</code>.</p>
|
|
3905
3685
|
<div style="display: flex; flex-direction: column; gap: 15px; box-sizing: border-box; width: 100%; max-width: 100%;">
|
|
3906
|
-
<div style="flex: 1; max-width: 100%; box-sizing: border-box; overflow: hidden;">
|
|
3907
|
-
<h4 style="margin-bottom: 8px; font-size: 0.9em; color: #9ca3af;">Estructura de parámetros:</h4>
|
|
3908
|
-
<pre style="background: rgba(0,0,0,0.3); padding: 10px; border-radius: 4px; font-size: 0.85em; overflow-x: auto; color: #a78bfa; border: 1px solid rgba(255,255,255,0.05); margin: 0; box-sizing: border-box; max-width: 100%;"><code>@param string $message Human-readable message to log.
|
|
3909
|
-
@param string $level Sentry severity level (default: info).</code></pre>
|
|
3910
|
-
</div>
|
|
3911
3686
|
<div style="display: flex; flex-wrap: wrap; gap: 15px; box-sizing: border-box; width: 100%;">
|
|
3912
3687
|
<div style="flex: 1; min-width: 250px; max-width: 100%; box-sizing: border-box; overflow: hidden;">
|
|
3913
3688
|
<h4 style="margin-bottom: 8px; font-size: 0.9em; color: #9ca3af;">Uso de ejemplo:</h4>
|
|
3914
|
-
<pre style="background: rgba(15,23,42,0.6); padding: 10px; border-radius: 4px; font-size: 0.85em; overflow-x: auto; color: #34d399; border: 1px solid rgba(52,211,153,0.2); margin: 0; height: 100%; box-sizing: border-box; max-width: 100%;"><code>$
|
|
3915
|
-
|
|
3916
|
-
$response = $sentry->captureMessage($message);
|
|
3917
|
-
|
|
3918
|
-
if ($response['status'] === 'success') {
|
|
3919
|
-
// Başarılı
|
|
3920
|
-
}</code></pre>
|
|
3921
|
-
</div>
|
|
3922
|
-
<div style="flex: 1; min-width: 250px; max-width: 100%; box-sizing: border-box; overflow: hidden;">
|
|
3923
|
-
<h4 style="margin-bottom: 8px; font-size: 0.9em; color: #9ca3af;">Retorno esperado ($respuesta['datos']):</h4>
|
|
3924
|
-
<pre style="background: rgba(69,26,3,0.4); padding: 10px; border-radius: 4px; font-size: 0.85em; overflow-x: auto; color: #facc15; border: 1px solid rgba(250,204,21,0.2); margin: 0; height: 100%; box-sizing: border-box; max-width: 100%;"><code>[
|
|
3925
|
-
'id' => '...',
|
|
3926
|
-
'success' => true
|
|
3927
|
-
]</code></pre>
|
|
3689
|
+
<pre style="background: rgba(15,23,42,0.6); padding: 10px; border-radius: 4px; font-size: 0.85em; overflow-x: auto; color: #34d399; border: 1px solid rgba(52,211,153,0.2); margin: 0; height: 100%; box-sizing: border-box; max-width: 100%;"><code>$eventId = \Src\Service\Sentry::captureMessage('Sipariş başarıyla tamamlandı.', 'info');</code></pre>
|
|
3928
3690
|
</div>
|
|
3929
3691
|
</div>
|
|
3930
3692
|
</div>
|
|
@@ -3933,63 +3695,55 @@ if ($response['status'] === 'success') {
|
|
|
3933
3695
|
</div>
|
|
3934
3696
|
</div>
|
|
3935
3697
|
</section>
|
|
3936
|
-
|
|
3698
|
+
====== VER AYUDANTES ======
|
|
3937
3699
|
<section id="vh-display">
|
|
3938
|
-
<h2>Ver ayudantes
|
|
3939
|
-
<p>Al imprimir datos desde la base de datos o la entrada del usuario al DOM
|
|
3940
|
-
<span class="ret">
|
|
3700
|
+
<h2>Ver ayudantes—<code>display()</code> <span class="tag b-view">Ver método</span></h2>
|
|
3701
|
+
<p>Al imprimir datos desde la base de datos o la entrada del usuario al DOM<strong>protección XSS obligatoria</strong>implementos. En lugar de generar un error en valores nulos o vacíos, se devuelve el valor predeterminado.</p>
|
|
3702
|
+
<span class="ret">visualización de cadena ($datos mixtos, cadena $predeterminado = '')</span>
|
|
3941
3703
|
<div class="alert a-info" style="margin-top: 10px; margin-bottom: 24px; padding: 12px 20px;">
|
|
3942
|
-
<strong>💡 Consejo
|
|
3943
|
-
|
|
3944
|
-
|
|
3945
|
-
<
|
|
3946
|
-
<h1><?= <span class="var">$
|
|
3947
|
-
|
|
3948
|
-
<span class="cm"><!-- ✅ ArtiFrame Güvenli Kullanımı --></span>
|
|
3949
|
-
<h1><?= <span class="fn">display</span>(<span class="var">$user</span>[<span class="st">'isim'</span>], <span class="st">'İsimsiz Kullanıcı'</span>) ?></h1></code></pre>
|
|
3704
|
+
<strong>💡 Consejo:<code>$default</code>Uso</strong><br/>Segundo parámetro (<code>$default</code>) es el texto de rescate que se imprimirá en pantalla cuando los datos provenientes de la base de datos estén vacíos (nulo, falso, cadena vacía). Por ejemplo, para un usuario cuyos datos de nombre no se ingresan<code>display($isim, 'İsimsiz')</code>Si lo usa, su página presentará contenido significativo en lugar de feos espacios en blanco.</div>
|
|
3705
|
+
<pre><code><span class="cm"><!-- ❌ Inseguro: crea una vulnerabilidad XSS --></span>
|
|
3706
|
+
<h1><?= <span class="var">$usuario</span>[<span class="st">'nombre'</span>] ?></h1>
|
|
3707
|
+
<span class="cm"><!-- ✅ Uso seguro de ArtiFrame --></span>
|
|
3708
|
+
<h1><?= <span class="fn">mostrar</span>(<span class="var">$usuario</span>[<span class="st">'nombre'</span>], <span class="st">'Usuario anónimo'</span>) ?></h1></code></pre>
|
|
3950
3709
|
</section>
|
|
3951
3710
|
<section id="vh-escapeurl">
|
|
3952
|
-
<h2>Ver ayudantes
|
|
3953
|
-
<p>Enlaces recibidos de los usuarios (por ejemplo, sitios web de perfiles)
|
|
3954
|
-
<span class="ret">
|
|
3955
|
-
<pre><code><span class="cm"><!-- ❌
|
|
3956
|
-
<a href="<?= <span class="var">$
|
|
3957
|
-
|
|
3958
|
-
<span class="
|
|
3959
|
-
<a href="<?= <span class="fn">escapeUrl</span>(<span class="var">$user</span>[<span class="st">'website'</span>]) ?>">Siteyi Ziyaret Et</a></code></pre>
|
|
3711
|
+
<h2>Ver ayudantes—<code>escapeUrl()</code> <span class="tag b-view">Ver método</span></h2>
|
|
3712
|
+
<p>Enlaces recibidos de los usuarios (por ejemplo, sitios web de perfiles)<code><a href="..."></code>o<code><img src="..."></code>Se utiliza al presionar hacia adentro.<code>javascript:alert(1)</code>Previene la ejecución de código a través de la conexión al hacer que cargas útiles peligrosas como (Stored XSS) sean inofensivas.</p>
|
|
3713
|
+
<span class="ret">cadena URL de escape(cadena $url)</span>
|
|
3714
|
+
<pre><code><span class="cm"><!-- ❌ Inseguro: el código JS puede filtrarse a través de una URL --></span>
|
|
3715
|
+
<a href="<?= <span class="var">$usuario</span>[<span class="st">'sitio web'</span>] ?>">Siteyi Ziyaret Et</a>
|
|
3716
|
+
<span class="cm"><!-- ✅ Uso seguro de ArtiFrame --></span>
|
|
3717
|
+
<a href="<?= <span class="fn">URL de escape</span>(<span class="var">$usuario</span>[<span class="st">'sitio web'</span>]) ?>">Siteyi Ziyaret Et</a></code></pre>
|
|
3960
3718
|
</section>
|
|
3961
3719
|
<section id="vh-csrf">
|
|
3962
|
-
<h2>Ver ayudantes
|
|
3963
|
-
<p>Agrega un campo de token oculto a los formularios HTML contra ataques CSRF
|
|
3964
|
-
<span class="ret">
|
|
3965
|
-
<p>Este método imprime automáticamente el siguiente resultado HTML en su formulario
|
|
3966
|
-
<pre><code><span class="cm"><!--
|
|
3720
|
+
<h2>Ver ayudantes—<code>csrfField()</code> <span class="tag b-view">Ver método</span></h2>
|
|
3721
|
+
<p>Agrega un campo de token oculto a los formularios HTML contra ataques CSRF.<strong>Es obligatorio usarlo en cada página que contenga un formulario POST.</strong></p>
|
|
3722
|
+
<span class="ret">cadena csrfField()</span>
|
|
3723
|
+
<p>Este método imprime automáticamente el siguiente resultado HTML en su formulario:<code><input type="hidden" name="csrf_token" value="..."></code>. Si no desea utilizar el método, puede utilizar esta entrada oculta como valor.<code>display()</code>También puedes agregarlo manualmente envolviéndolo con .</p>
|
|
3724
|
+
<pre><code><span class="cm"><!-- Interfaz (HTML) --></span>
|
|
3967
3725
|
<form data-js="kaydet-form">
|
|
3968
|
-
<?= <span class="fn">
|
|
3969
|
-
|
|
3970
|
-
|
|
3971
|
-
<input type="hidden" name="csrf_token" value="<?= display($_SESSION['csrf_token'] ?? '') ?>">
|
|
3726
|
+
<?= <span class="fn">campocsrf</span>() ?> <span class="cm"><!-- Genera automáticamente entradas ocultas --></span>
|
|
3727
|
+
<span class="cm"><!-- O Uso manual:
|
|
3728
|
+
<tipo de entrada="hidden" nombre="csrf_token" valor="<?= display($_SESSION['csrf_token'] ?? '') ?>">
|
|
3972
3729
|
--></span>
|
|
3973
|
-
|
|
3974
3730
|
<input type="text" name="ad" placeholder="Adınız">
|
|
3975
3731
|
<button type="submit">Kaydet</button>
|
|
3976
3732
|
</form>
|
|
3977
|
-
|
|
3978
|
-
<span class="
|
|
3979
|
-
|
|
3980
|
-
|
|
3981
|
-
<span class="
|
|
3982
|
-
|
|
3983
|
-
|
|
3984
|
-
|
|
3985
|
-
<span class="kw">method</span>: <span class="st">'POST'</span>,
|
|
3986
|
-
<span class="kw">body</span>: <span class="var">formData</span>
|
|
3733
|
+
<span class="cm">// Frontend (JavaScript): captura y envío de datos</span>
|
|
3734
|
+
<span class="fn">documento</span>.<span class="fn">selector de consulta</span>(<span class="st">'[datos-js="guardar-formulario"]'</span>).<span class="fn">agregarEventListener</span>(<span class="st">'entregar'</span>, (e) => {
|
|
3735
|
+
e.<span class="fn">prevenir valor predeterminado</span>();
|
|
3736
|
+
<span class="kw">constante</span> <span class="var">formularioDatos</span> = <span class="kw">nuevo</span> <span class="fn">Datos de formulario</span>(e.target);
|
|
3737
|
+
<span class="cm">// csrf_token se incluye automáticamente en formData</span>
|
|
3738
|
+
<span class="fn">buscar</span>(<span class="st">'/api/save.php'</span>, {
|
|
3739
|
+
<span class="kw">método</span>: <span class="st">'CORREO'</span>,
|
|
3740
|
+
<span class="kw">cuerpo</span>: <span class="var">formularioDatos</span>
|
|
3987
3741
|
});
|
|
3988
3742
|
});</code></pre>
|
|
3989
3743
|
</section>
|
|
3990
3744
|
<section id="vh-dates">
|
|
3991
|
-
<h2>Ver ayudantes: funciones de fecha
|
|
3992
|
-
<p>en la base de datos
|
|
3745
|
+
<h2>Ver ayudantes: funciones de fecha<span class="tag b-view">Ver método</span></h2>
|
|
3746
|
+
<p>en la base de datos<code class="ic">Y-m-d H:i:s</code>Procesa cadenas de fecha o valores de marca de tiempo UNIX en formato. Toda la producción textual por idioma (<code class="ic">tr</code>, <code class="ic">en</code>, <code class="ic">de</code>, <code class="ic">fr</code>, <code class="ic">es</code>) está localizado.</p>
|
|
3993
3747
|
<table class="sig-table">
|
|
3994
3748
|
<thead><tr><th>Función</th><th>Ejemplo de salida</th><th>Explicación</th></tr></thead>
|
|
3995
3749
|
<tbody>
|
|
@@ -4005,66 +3759,63 @@ if ($response['status'] === 'success') {
|
|
|
4005
3759
|
</tbody>
|
|
4006
3760
|
</table>
|
|
4007
3761
|
<div class="alert a-info" style="margin-top: 0; margin-bottom: 24px;">
|
|
4008
|
-
<strong>💡 Comprensión de los parámetros
|
|
3762
|
+
<strong>💡 Comprensión de los parámetros:<code>$format</code>Y<code>$lang</code></strong>
|
|
4009
3763
|
<ul style="margin-top: 10px; margin-bottom: 0;">
|
|
4010
|
-
<li style="margin-bottom: 8px;"><strong><code>$format</code>
|
|
4011
|
-
<li style="margin-bottom: 0;"><strong><code>$lang</code>
|
|
3764
|
+
<li style="margin-bottom: 8px;"><strong><code>$format</code>(Formato):</strong>Solo<code>formatDate()</code>Se utiliza con la función. Acepta letras de fecha PHP estándar. (Por ejemplo:<code>'d/m/Y'</code>➔ 24/07/2026, o<code>'H:i'</code>➔ 15:30). Le permite crear su propio patrón de fechas cuando otras funciones ya preparadas (día, año, etc.) son insuficientes.</li>
|
|
3765
|
+
<li style="margin-bottom: 0;"><strong><code>$lang</code>(Idioma):</strong>Se utiliza en funciones que contienen texto (nombre del mes, palabra "antes") en su salida. Si deja este parámetro vacío, el sistema<strong>por defecto<code>'tr'</code>(Turco)</strong>funciona. Si está realizando un proyecto multilingüe, ingrese el código de idioma (<code>tr, en, de, fr, es</code>) es suficiente para entrar. (Ex:<code>timeAgo($tarih, 'en')</code>➔ Hace 5 minutos)</li>
|
|
4012
3766
|
</ul>
|
|
4013
3767
|
</div>
|
|
4014
|
-
<pre><code><span class="cm"><!--
|
|
4015
|
-
<span class="kw"><?php</span> <span class="var">$
|
|
4016
|
-
|
|
4017
|
-
<span class="
|
|
4018
|
-
|
|
4019
|
-
<span class="cm"><!--
|
|
4020
|
-
|
|
4021
|
-
<span class="cm"><!--
|
|
4022
|
-
<span><?= <span class="fn">
|
|
4023
|
-
<span class="cm"><!--
|
|
4024
|
-
|
|
4025
|
-
<span><?= <span class="fn">timeAgo</span>(<span class="var">$tarih</span>, <span class="st">'de'</span>) ?></span>
|
|
4026
|
-
<span class="cm"><!-- Çıktı: vor 5 Minuten --></span></code></pre>
|
|
3768
|
+
<pre><code><span class="cm"><!-- Supongamos que es una marca de tiempo UNIX recuperada con la función time() --></span>
|
|
3769
|
+
<span class="kw"><?php</span> <span class="var">$fecha</span> = <span class="fn">tiempo</span>(); <span class="kw">?></span>
|
|
3770
|
+
<span class="cm"><!-- Fecha exacta por idioma --></span>
|
|
3771
|
+
<span><?= <span class="fn">nombrefechacompleta</span>(<span class="var">$fecha</span>, <span class="st">'tr'</span>) ?></span>
|
|
3772
|
+
<span class="cm"><!-- Publicado: 24 de julio de 2026 --></span>
|
|
3773
|
+
<span class="cm"><!-- Visualización de la hora al estilo de las redes sociales --></span>
|
|
3774
|
+
<span><?= <span class="fn">hace tiempo</span>(<span class="var">$fecha</span>, <span class="st">'mayoría'</span>) ?></span>
|
|
3775
|
+
<span class="cm"><!-- Publicado: hace 5 minutos --></span>
|
|
3776
|
+
<span><?= <span class="fn">hace tiempo</span>(<span class="var">$fecha</span>, <span class="st">'también'</span>) ?></span>
|
|
3777
|
+
<span class="cm"><!-- Salida: durante 5 minutos --></span></code></pre>
|
|
4027
3778
|
</section>
|
|
4028
3779
|
<section id="vh-truncate">
|
|
4029
|
-
<h2>Ver ayudantes
|
|
4030
|
-
<span class="ret">
|
|
3780
|
+
<h2>Ver ayudantes—<code>truncate()</code> <span class="tag b-view">Ver método</span></h2>
|
|
3781
|
+
<span class="ret">cadena truncada (cadena $texto, int $longitud = 100, cadena $append = '...')</span>
|
|
4031
3782
|
<p>Recorta los textos largos hasta el límite de caracteres deseado sin cortar la última palabra y agrega el sufijo especificado al final.</p>
|
|
4032
|
-
<pre><code><p><?= <span class="fn">
|
|
3783
|
+
<pre><code><p><?= <span class="fn">truncar</span>(<span class="var">$ publicación</span>[<span class="st">'contenido'</span>], <span class="nu">160</span>, <span class="st">'...'</span>) ?></p></code></pre>
|
|
4033
3784
|
</section>
|
|
4034
3785
|
<section id="vh-activeclass">
|
|
4035
|
-
<h2>Ver ayudantes
|
|
4036
|
-
<span class="ret">
|
|
3786
|
+
<h2>Ver ayudantes—<code>activeClass()</code> <span class="tag b-view">Ver método</span></h2>
|
|
3787
|
+
<span class="ret">cadena activeClass(cadena $currentPath, cadena $targetPath, cadena $className = 'activo')</span>
|
|
4037
3788
|
<p>Si la página actual y el enlace del menú marcado coinciden, devuelve la clase CSS. Perfecto para barra de navegación.</p>
|
|
4038
|
-
<pre><code><li class="<?= <span class="fn">
|
|
3789
|
+
<pre><code><li class="<?= <span class="fn">clase activa</span>(<span class="var">$url_actual</span>, <span class="st">'/comunicación'</span>, <span class="st">'página actual'</span>) ?>"></code></pre>
|
|
4039
3790
|
</section>
|
|
4040
3791
|
<section id="vh-formatsize">
|
|
4041
|
-
<h2>Ver ayudantes
|
|
4042
|
-
<span class="ret">
|
|
3792
|
+
<h2>Ver ayudantes—<code>formatSize()</code> <span class="tag b-view">Ver método</span></h2>
|
|
3793
|
+
<span class="ret">formato de cadenaTamaño(int $bytes)</span>
|
|
4043
3794
|
<p>Convierte el tamaño de archivo dado en bytes a unidades B, KB, MB, GB mediante cálculo logarítmico.</p>
|
|
4044
|
-
<pre><code><span><?= <span class="fn">
|
|
3795
|
+
<pre><code><span><?= <span class="fn">formatoTamaño</span>(<span class="nu">10485760</span>) ?></span> <span class="cm"><!-- 10,00 MB --></span></code></pre>
|
|
4045
3796
|
</section>
|
|
4046
3797
|
<section id="vh-maskemail">
|
|
4047
|
-
<h2>Ver ayudantes
|
|
4048
|
-
<span class="ret">
|
|
3798
|
+
<h2>Ver ayudantes—<code>maskEmail()</code> <span class="tag b-view">Ver método</span></h2>
|
|
3799
|
+
<span class="ret">máscara de cadenaCorreo electrónico(?cadena $correo electrónico)</span>
|
|
4049
3800
|
<p>Enmascara direcciones de correo electrónico de acuerdo con el cumplimiento de KVKK/RGPD. Estrellas desde la primera letra hasta el signo @.</p>
|
|
4050
|
-
<pre><code><td><?= <span class="fn">
|
|
3801
|
+
<pre><code><td><?= <span class="fn">máscaracorreo electrónico</span>(<span class="st">'utku@artilingo.com'</span>) ?></td> <span class="cm"><!-- u***@artilingo.com --></span></code></pre>
|
|
4051
3802
|
</section>
|
|
4052
3803
|
<section id="vh-maskphone">
|
|
4053
|
-
<h2>Ver ayudantes
|
|
4054
|
-
<span class="ret">
|
|
3804
|
+
<h2>Ver ayudantes—<code>maskPhone()</code> <span class="tag b-view">Ver método</span></h2>
|
|
3805
|
+
<span class="ret">máscara de cadenaTeléfono(cadena $teléfono)</span>
|
|
4055
3806
|
<p>Enmascaramiento avanzado de números de teléfono. Previene las filtraciones de datos al ocultar completamente los dígitos críticos.</p>
|
|
4056
|
-
<pre><code><td><?= <span class="fn">
|
|
3807
|
+
<pre><code><td><?= <span class="fn">máscaraTeléfono</span>(<span class="st">'05551234567'</span>) ?></td> <span class="cm"><!-- 0555 *** ** 67 --></span></code></pre>
|
|
4057
3808
|
</section>
|
|
4058
3809
|
<section id="vh-slugify">
|
|
4059
|
-
<h2>Ver ayudantes
|
|
4060
|
-
<span class="ret">
|
|
3810
|
+
<h2>Ver ayudantes—<code>slugify()</code> <span class="tag b-view">Ver método</span></h2>
|
|
3811
|
+
<span class="ret">cadena slugify(cadena...$textos)</span>
|
|
4061
3812
|
<p>Creador de enlaces SEO compatible con URL. No hay límite de parámetros (Variadic). Puede escribir la salida directamente en href.</p>
|
|
4062
|
-
<pre><code><a href="/yazi/<?= <span class="fn">
|
|
3813
|
+
<pre><code><a href="/yazi/<?= <span class="fn">slugificar</span>(<span class="var">$kat</span>, <span class="var">$título</span>) ?>">Oku</a> <span class="cm"><!-- /texto/tecnología/inteligencia-artificial --></span></code></pre>
|
|
4063
3814
|
</section>
|
|
4064
3815
|
<section id="vh-money">
|
|
4065
|
-
<h2>Ver ayudantes
|
|
4066
|
-
<p>Formatea el monto con el símbolo de moneda. El código de moneda (ISO) determina automáticamente la ubicación del símbolo. Moneda predeterminada
|
|
4067
|
-
<span class="ret">
|
|
3816
|
+
<h2>Ver ayudantes—<code>money()</code> <span class="tag b-view">Ver método</span></h2>
|
|
3817
|
+
<p>Formatea el monto con el símbolo de moneda. El código de moneda (ISO) determina automáticamente la ubicación del símbolo. Moneda predeterminada<code class="ic">usd</code>es.</p>
|
|
3818
|
+
<span class="ret">cadena de dinero(flotante $cantidad, cadena $moneda = 'usd')</span>
|
|
4068
3819
|
<table class="sig-table">
|
|
4069
3820
|
<thead><tr><th>Código</th><th>Producción</th><th>Divisa</th></tr></thead>
|
|
4070
3821
|
<tbody>
|
|
@@ -4080,449 +3831,397 @@ if ($response['status'] === 'success') {
|
|
|
4080
3831
|
<tr><td>dea</td><td>1.250,00 د.إ</td><td>Dírham de los Emiratos Árabes Unidos</td></tr>
|
|
4081
3832
|
</tbody>
|
|
4082
3833
|
</table>
|
|
4083
|
-
<pre><code><span><?= <span class="fn">
|
|
4084
|
-
<span class="cm"><!--
|
|
4085
|
-
|
|
4086
|
-
|
|
4087
|
-
|
|
4088
|
-
|
|
4089
|
-
|
|
4090
|
-
|
|
4091
|
-
|
|
4092
|
-
|
|
4093
|
-
|
|
4094
|
-
|
|
4095
|
-
</section>
|
|
4096
|
-
|
|
4097
|
-
<!-- ====== SYSTEM HELPERS ====== -->
|
|
3834
|
+
<pre><code><span><?= <span class="fn">dinero</span>(<span class="var">$producto</span>[<span class="st">'precio'</span>], <span class="st">'intentar'</span>) ?></span>
|
|
3835
|
+
<span class="cm"><!-- Salida: ₺ 1.250,00 --></span>
|
|
3836
|
+
<span><?= <span class="fn">dinero</span>(<span class="var">$producto</span>[<span class="st">'precio'</span>], <span class="st">'Dólar estadounidense'</span>) ?></span>
|
|
3837
|
+
<span class="cm"><!-- Salida: $1,250.00 --></span></code></pre>
|
|
3838
|
+
</section>
|
|
3839
|
+
<section id="vh-uuid">
|
|
3840
|
+
<h2>Ver ayudantes -<code>uuid()</code> <span class="tag b-view">Ver método</span></h2>
|
|
3841
|
+
<p>Convierte los datos UUID binarios de 16 bytes provenientes de la base de datos al formato de 36 caracteres y los imprime en la pantalla con protección XSS.</p>
|
|
3842
|
+
<pre><code><span class="cm"><!-- Salida: 0190ed84-3f12-7a91-8bc4-91823741abcd --></span>
|
|
3843
|
+
<div><span class="kw"><?=</span> <span class="fn">UUID</span>(<span class="var">$tirar</span>[<span class="st">'IDENTIFICACIÓN'</span>]) <span class="kw">?></span></div></code></pre>
|
|
3844
|
+
</section>
|
|
3845
|
+
====== AYUDANTES DEL SISTEMA ======
|
|
4098
3846
|
<section id="sh-apiresponse">
|
|
4099
|
-
<h2>Ayudantes del sistema
|
|
4100
|
-
<p>Esta función se utiliza entre el Frontend (JS/Mobile) y el Backend (PHP) de su aplicación
|
|
4101
|
-
<span class="ret">void apiResponse(
|
|
4102
|
-
<p style="margin-top: 15px;"><strong>Código de estado (código HTTP):</strong>
|
|
4103
|
-
<p><strong>Sensibilidad del entorno en vivo/de prueba (APP_ENV):</strong>
|
|
3847
|
+
<h2>Ayudantes del sistema—<code>apiResponse()</code> <span class="tag b-api">Método del sistema</span></h2>
|
|
3848
|
+
<p>Esta función se utiliza entre el Frontend (JS/Mobile) y el Backend (PHP) de su aplicación.<strong>Es la constitución de la comunicación.</strong>Claves en los datos JSON devueltos como Respuesta<code>status</code>, <code>message</code>Y<code>data</code>aspecto<strong>está absolutamente arreglado (debe estar en inglés)</strong>.</p>
|
|
3849
|
+
<span class="ret">void apiResponse(cadena $estado, cadena $mensaje, matriz $datos = [], \Throwable $excepción = nulo)</span>
|
|
3850
|
+
<p style="margin-top: 15px;"><strong>Código de estado (código HTTP):</strong>En el lado de PHP, el primer parámetro<code>'success'</code>Si se escribe, se devuelve HTTP 200 automáticamente, para todo lo demás (por ejemplo: 'error', 'ok') se devuelve 400 Solicitud incorrecta.</p>
|
|
3851
|
+
<p><strong>Sensibilidad del entorno en vivo/de prueba (APP_ENV):</strong>Si el cuarto parámetro es<code>Exception</code>Si lo das y tu sistema está en modo Desarrollo (APP_ENV = 1), aplastará el mensaje que escribiste e imprimirá el error SQL/número de línea en la pantalla tal como está. Si está en modo en vivo (APP_ENV = 0), oculta los errores y muestra solo el mensaje claro que usted escribió.</p>
|
|
4104
3852
|
<h3>Envío PHP (backend)</h3>
|
|
4105
|
-
<pre><code><span class="cm">// 1.
|
|
4106
|
-
<span class="fn">
|
|
4107
|
-
|
|
4108
|
-
<span class="
|
|
4109
|
-
<span class="
|
|
4110
|
-
|
|
4111
|
-
|
|
4112
|
-
<span class="fn">apiResponse</span>(<span class="st">'error'</span>, <span class="st">'Bir sorun oluştu.'</span>, [], <span class="var">$e</span>);
|
|
3853
|
+
<pre><code><span class="cm">// 1. Envío estándar</span>
|
|
3854
|
+
<span class="fn">apiRespuesta</span>(<span class="st">'éxito'</span>, <span class="st">"La operación se completó con éxito".</span>, [<span class="st">'IDENTIFICACIÓN'</span> => <span class="nu">1453</span>]);
|
|
3855
|
+
<span class="cm">// 2. Envío de error (con excepción)</span>
|
|
3856
|
+
<span class="kw">intentar</span> {
|
|
3857
|
+
<span class="cm">// Consultas a la base de datos...</span>
|
|
3858
|
+
} <span class="kw">atrapar</span> (\Exception <span class="var">$e</span>) {
|
|
3859
|
+
<span class="fn">apiRespuesta</span>(<span class="st">'error'</span>, <span class="st">"Algo salió mal".</span>, [], <span class="var">$e</span>);
|
|
4113
3860
|
}</code></pre>
|
|
4114
3861
|
<h3>Captura de JavaScript (frontend)</h3>
|
|
4115
|
-
<pre><code><span class="fn">
|
|
3862
|
+
<pre><code><span class="fn">buscar</span>(<span class="st">'/api/punto final'</span>, { method: <span class="st">'CORREO'</span> })
|
|
4116
3863
|
.then(res => res.json())
|
|
4117
3864
|
.then(response => {
|
|
4118
|
-
<span class="cm">//
|
|
4119
|
-
<span class="cm">//
|
|
4120
|
-
|
|
4121
|
-
|
|
4122
|
-
console.log(<span class="st">"
|
|
4123
|
-
|
|
4124
|
-
|
|
4125
|
-
<span class="fn">alert</span>(<span class="st">"Hata oluştu: "</span> + response.message);
|
|
3865
|
+
<span class="cm">// ADVERTENCIA: respuesta.status o respuesta.message ¡NO funcionarán!</span>
|
|
3866
|
+
<span class="cm">// No importa lo que envíes desde PHP, las claves siempre son estado, mensaje y datos.</span>
|
|
3867
|
+
<span class="kw">si</span> (response.status === <span class="st">'éxito'</span>) { <span class="cm">// Lo que sea que venga de PHP ('éxito', 'ok', 'éxito', etc.)</span>
|
|
3868
|
+
console.log(<span class="st">"Mensaje:"</span>, response.message);
|
|
3869
|
+
console.log(<span class="st">"Datos entrantes:"</span>, response.data);
|
|
3870
|
+
} <span class="kw">demás</span> {
|
|
3871
|
+
<span class="fn">alerta</span>(<span class="st">"Ocurrió un error: "</span> + response.message);
|
|
4126
3872
|
}
|
|
4127
3873
|
});</code></pre>
|
|
4128
3874
|
</section>
|
|
4129
3875
|
<section id="sh-json">
|
|
4130
|
-
<h2>Ayudantes del sistema
|
|
4131
|
-
<p>Establece el encabezado JSON, devuelve el código de estado HTTP e imprime de forma segura el resultado con json_encode y luego finaliza el script
|
|
4132
|
-
<span class="ret">void jsonResponse(
|
|
4133
|
-
<pre><code><span class="cm">//
|
|
4134
|
-
<span class="fn">
|
|
4135
|
-
|
|
4136
|
-
<span class="
|
|
4137
|
-
<span class="fn">jsonResponse</span>([<span class="st">'status'</span> => <span class="st">'error'</span>, <span class="st">'message'</span> => <span class="st">'Yetkisiz erişim.'</span>], <span class="nu">401</span>);</code></pre>
|
|
3876
|
+
<h2>Ayudantes del sistema—<code>jsonResponse()</code> <span class="tag b-api">Método del sistema</span></h2>
|
|
3877
|
+
<p>Establece el encabezado JSON, devuelve el código de estado HTTP e imprime de forma segura el resultado con json_encode y luego finaliza el script.<strong>Todas las respuestas de API deben darse a través de esta función.</strong></p>
|
|
3878
|
+
<span class="ret">void jsonResponse(matriz $datos, int $statusCode = 200)</span>
|
|
3879
|
+
<pre><code><span class="cm">// respuesta exitosa</span>
|
|
3880
|
+
<span class="fn">jsonRespuesta</span>([<span class="st">'estado'</span> => <span class="st">'éxito'</span>, <span class="st">'datos'</span> => <span class="var">$usuario</span>], <span class="nu">200</span>);
|
|
3881
|
+
<span class="cm">// respuesta de error</span>
|
|
3882
|
+
<span class="fn">jsonRespuesta</span>([<span class="st">'estado'</span> => <span class="st">'error'</span>, <span class="st">'mensaje'</span> => <span class="st">'Acceso no autorizado.'</span>], <span class="nu">401</span>);</code></pre>
|
|
4138
3883
|
</section>
|
|
4139
|
-
|
|
4140
3884
|
<section id="sh-dd">
|
|
4141
|
-
<h2>Ayudantes del sistema
|
|
4142
|
-
<p>Volcar y morir. Durante la fase de desarrollo, las variables se mostraban en la pantalla en modo oscuro, legible y elegante
|
|
4143
|
-
<span class="ret">void dd(
|
|
4144
|
-
<pre><code><span class="fn">dd</span>(<span class="var">$_POST</span>, <span class="var">$
|
|
4145
|
-
<span class="cm">//
|
|
3885
|
+
<h2>Ayudantes del sistema—<code>dd()</code> <span class="tag b-api">Método del sistema</span></h2>
|
|
3886
|
+
<p>Volcar y morir. Durante la fase de desarrollo, las variables se mostraban en la pantalla en modo oscuro, legible y elegante.<code><pre></code>etiqueta y detiene la ejecución del código en esa línea (salida). Puede tomar parámetros ilimitados (Variadic).</p>
|
|
3887
|
+
<span class="ret">void dd(mixto...$vars)</span>
|
|
3888
|
+
<pre><code><span class="fn">dd</span>(<span class="var">$_POST</span>, <span class="var">$id_usuario</span>);
|
|
3889
|
+
<span class="cm">// Imprime los valores en pantalla y detiene el sistema.</span></code></pre>
|
|
4146
3890
|
</section>
|
|
4147
|
-
|
|
3891
|
+
====== GENERACIÓN DE ID Y UTILIDADES ======
|
|
4148
3892
|
<section id="id-generation-utilities">
|
|
4149
|
-
</section>
|
|
4150
|
-
|
|
4151
|
-
|
|
3893
|
+
</section>
|
|
4152
3894
|
<section id="sh-redirect">
|
|
4153
|
-
<h2>Ayudantes del sistema
|
|
4154
|
-
<span class="ret">
|
|
4155
|
-
<p>a la página deseada
|
|
4156
|
-
<pre><code><span class="kw">
|
|
4157
|
-
<span class="fn">
|
|
3895
|
+
<h2>Ayudantes del sistema—<code>redirect()</code> <span class="tag b-api">Método del sistema</span></h2>
|
|
3896
|
+
<span class="ret">redireccionamiento nulo (cadena $url)</span>
|
|
3897
|
+
<p>a la página deseada<code>header("Location: ...")</code>Instantáneamente redirige y deja de funcionar con (<code>exit</code>).</p>
|
|
3898
|
+
<pre><code><span class="kw">si</span> (!<span class="var">$ está iniciado sesión</span>) {
|
|
3899
|
+
<span class="fn">redirigir</span>(<span class="st">'/acceso'</span>);
|
|
4158
3900
|
}</code></pre>
|
|
4159
|
-
</section>
|
|
4160
|
-
|
|
4161
|
-
|
|
4162
|
-
<
|
|
4163
|
-
<
|
|
4164
|
-
<span class="
|
|
4165
|
-
<
|
|
4166
|
-
<span class="fn">generateCsrf</span>(); <span class="cm">// Oturum başlatıldığında CSRF üretilir</span>
|
|
3901
|
+
</section>
|
|
3902
|
+
<section id="sh-generatecsrf">
|
|
3903
|
+
<h2>Ayudantes del sistema—<code>generateCsrf()</code> <span class="tag b-api">Método del sistema</span></h2>
|
|
3904
|
+
<p>Genera un nuevo token CSRF seguro basado en sesión, de 32 bytes de longitud. Para agregar como entrada oculta a formularios<code>csrfField()</code>Se recomienda utilizar (Ver ayudante).</p>
|
|
3905
|
+
<span class="ret">cadena generarCsrf()</span>
|
|
3906
|
+
<pre><code><span class="kw">si</span> (<span class="var">$_SESSION</span>[<span class="st">'usuario'</span>]) {
|
|
3907
|
+
<span class="fn">generarCsrf</span>(); <span class="cm">// CSRF se genera cuando se inicia la sesión</span>
|
|
4167
3908
|
}</code></pre>
|
|
4168
3909
|
</section>
|
|
4169
3910
|
<section id="sh-csrf">
|
|
4170
|
-
<h2>Ayudantes del sistema
|
|
4171
|
-
<p>Verifica que la solicitud POST entrante proviene de un formulario legítimo. en el formulario
|
|
4172
|
-
<span class="ret">bool
|
|
4173
|
-
<pre><code><span class="kw">
|
|
4174
|
-
<span class="fn">
|
|
3911
|
+
<h2>Ayudantes del sistema—<code>verifyCsrf()</code> <span class="tag b-api">Método del sistema</span></h2>
|
|
3912
|
+
<p>Verifica que la solicitud POST entrante proviene de un formulario legítimo. en el formulario<code class="ic">csrfField()</code>Devuelve falso si no se agrega o si el token no es válido.</p>
|
|
3913
|
+
<span class="ret">bool verificarCsrf(cadena $token)</span>
|
|
3914
|
+
<pre><code><span class="kw">si</span> (!<span class="fn">verificarCsrf</span>(<span class="var">$_POST</span>[<span class="st">'csrf_token'</span>] ?? <span class="st">''</span>)) {
|
|
3915
|
+
<span class="fn">jsonRespuesta</span>([<span class="st">'estado'</span> => <span class="st">'error'</span>, <span class="st">'mensaje'</span> => <span class="st">'Token CSRF no válido.'</span>], <span class="nu">403</span>);
|
|
4175
3916
|
}</code></pre>
|
|
4176
3917
|
</section>
|
|
4177
3918
|
<section id="sh-sanitizeint">
|
|
4178
|
-
<h2>Ayudantes del sistema
|
|
4179
|
-
<span class="ret">int sanitizeInt(
|
|
4180
|
-
<p>Elimina todas las letras, símbolos y comas que contiene
|
|
4181
|
-
<pre><code><span class="var">$
|
|
3919
|
+
<h2>Ayudantes del sistema—<code>sanitizeInt()</code> <span class="tag b-api">Método del sistema</span></h2>
|
|
3920
|
+
<span class="ret">int sanitizeInt(valor $ mixto)</span>
|
|
3921
|
+
<p>Elimina todas las letras, símbolos y comas que contiene.<strong>solo entero</strong>deja los números. Se utiliza para ID o límites (valores int de base de datos).</p>
|
|
3922
|
+
<pre><code><span class="var">$identificación</span> = <span class="fn">sanitizarInt</span>(<span class="var">$_GET</span>[<span class="st">'IDENTIFICACIÓN'</span>] ?? <span class="nu">0</span>);</code></pre>
|
|
4182
3923
|
</section>
|
|
4183
3924
|
<section id="sh-sanitizefloat">
|
|
4184
|
-
<h2>Ayudantes del sistema
|
|
4185
|
-
<span class="ret">float sanitizeFloat(
|
|
4186
|
-
<p>Borra
|
|
4187
|
-
<pre><code><span class="var">$
|
|
3925
|
+
<h2>Ayudantes del sistema—<code>sanitizeFloat()</code> <span class="tag b-api">Método del sistema</span></h2>
|
|
3926
|
+
<span class="ret">float sanitizeFloat(valor $mixto)</span>
|
|
3927
|
+
<p>Borra todos excepto los números fraccionarios (decimales). Es seguro utilizarlo para cantidades monetarias, cálculos de ratios o métricas.</p>
|
|
3928
|
+
<pre><code><span class="var">$precio</span> = <span class="fn">desinfectarFlotador</span>(<span class="var">$_POST</span>[<span class="st">'precio'</span>]);</code></pre>
|
|
4188
3929
|
</section>
|
|
4189
3930
|
<section id="sh-sanitizestring">
|
|
4190
|
-
<h2>Ayudantes del sistema
|
|
4191
|
-
<span class="ret">
|
|
4192
|
-
<p>Para prevenir XSS y ataques similares, todos
|
|
4193
|
-
<pre><code><span class="var">$
|
|
3931
|
+
<h2>Ayudantes del sistema—<code>sanitizeString()</code> <span class="tag b-api">Método del sistema</span></h2>
|
|
3932
|
+
<span class="ret">cadena sanitizeString(cadena $valor)</span>
|
|
3933
|
+
<p>Para prevenir XSS y ataques similares, todos<strong>Etiquetas HTML y PHP (<code><script></code>, <code><iframe></code>etc.) destruye</strong>. Debe usarse antes de guardar String en la base de datos.</p>
|
|
3934
|
+
<pre><code><span class="var">$nombre</span> = <span class="fn">desinfectarString</span>(<span class="var">$_POST</span>[<span class="st">'nombre'</span>]);</code></pre>
|
|
4194
3935
|
</section>
|
|
4195
3936
|
<section id="sh-sanitizeemail">
|
|
4196
|
-
<h2>Ayudantes del sistema
|
|
4197
|
-
<span class="ret">
|
|
4198
|
-
<p>Filtra todos los caracteres no válidos y peligrosos que no cumplen con el formato del correo electrónico. (Atención: Sólo borra la corrección del formato
|
|
4199
|
-
<pre><code><span class="var">$
|
|
3937
|
+
<h2>Ayudantes del sistema—<code>sanitizeEmail()</code> <span class="tag b-api">Método del sistema</span></h2>
|
|
3938
|
+
<span class="ret">cadena sanitizeEmail(cadena $correo electrónico)</span>
|
|
3939
|
+
<p>Filtra todos los caracteres no válidos y peligrosos que no cumplen con el formato del correo electrónico. (Atención: Sólo borra la corrección del formato.<code>verifyEmail()</code>Deberías consultar con ).</p>
|
|
3940
|
+
<pre><code><span class="var">$correo electrónico</span> = <span class="fn">desinfectarCorreo electrónico</span>(<span class="var">$_POST</span>[<span class="st">'correo electrónico'</span>] ?? <span class="st">''</span>);</code></pre>
|
|
4200
3941
|
</section>
|
|
4201
3942
|
<section id="sh-ispost">
|
|
4202
|
-
<h2>Ayudantes del sistema
|
|
4203
|
-
<span class="ret">bool
|
|
3943
|
+
<h2>Ayudantes del sistema—<code>isPost()</code> <span class="tag b-api">Método del sistema</span></h2>
|
|
3944
|
+
<span class="ret">bool es publicación()</span>
|
|
4204
3945
|
<p>Verifica si la solicitud entrante (Solicitud HTTP) se realiza con el método POST. Se utiliza para impedir el acceso directo a la página, especialmente en el envío de formularios.</p>
|
|
4205
|
-
<pre><code><span class="kw">
|
|
4206
|
-
<span class="cm">//
|
|
3946
|
+
<pre><code><span class="kw">si</span> (<span class="fn">espublicar</span>()) {
|
|
3947
|
+
<span class="cm">// Funciona si la solicitud es POST (envío de formulario)</span>
|
|
4207
3948
|
}</code></pre>
|
|
4208
3949
|
</section>
|
|
4209
3950
|
<section id="sh-isget">
|
|
4210
|
-
<h2>Ayudantes del sistema
|
|
4211
|
-
<span class="ret">bool
|
|
3951
|
+
<h2>Ayudantes del sistema—<code>isGet()</code> <span class="tag b-api">Método del sistema</span></h2>
|
|
3952
|
+
<span class="ret">bool esGet()</span>
|
|
4212
3953
|
<p>Verifica si la solicitud entrante se realiza con el método GET. Se utiliza únicamente con fines de control al leer parámetros o visualizar páginas a través de URL.</p>
|
|
4213
|
-
<pre><code><span class="kw">
|
|
4214
|
-
<span class="cm">//
|
|
3954
|
+
<pre><code><span class="kw">si</span> (<span class="fn">es obtener</span>()) {
|
|
3955
|
+
<span class="cm">// Funciona si la página se visita normalmente</span>
|
|
4215
3956
|
}</code></pre>
|
|
4216
3957
|
</section>
|
|
4217
3958
|
<section id="sh-isput">
|
|
4218
|
-
<h2>Ayudantes del sistema
|
|
4219
|
-
<span class="ret">bool
|
|
3959
|
+
<h2>Ayudantes del sistema—<code>isPut()</code> <span class="tag b-api">Método del sistema</span></h2>
|
|
3960
|
+
<span class="ret">bool esPut()</span>
|
|
4220
3961
|
<p>Verifica que la solicitud entrante se realice con el método PUT. Generalmente se prefiere para operaciones de actualización de datos en arquitecturas API REST.</p>
|
|
4221
|
-
<pre><code><span class="kw">
|
|
4222
|
-
<span class="cm">//
|
|
3962
|
+
<pre><code><span class="kw">si</span> (<span class="fn">es poner</span>()) {
|
|
3963
|
+
<span class="cm">//Solicitud de actualización de un recurso mediante API</span>
|
|
4223
3964
|
}</code></pre>
|
|
4224
3965
|
</section>
|
|
4225
3966
|
<section id="sh-isdelete">
|
|
4226
|
-
<h2>Ayudantes del sistema
|
|
4227
|
-
<span class="ret">bool
|
|
3967
|
+
<h2>Ayudantes del sistema—<code>isDelete()</code> <span class="tag b-api">Método del sistema</span></h2>
|
|
3968
|
+
<span class="ret">bool es eliminar()</span>
|
|
4228
3969
|
<p>Verifica que la solicitud entrante se realizó con el método DELETE. Se utiliza para proteger rutas de eliminación en API REST.</p>
|
|
4229
|
-
<pre><code><span class="kw">
|
|
4230
|
-
<span class="cm">//
|
|
3970
|
+
<pre><code><span class="kw">si</span> (<span class="fn">es eliminar</span>()) {
|
|
3971
|
+
<span class="cm">// Solicitud para eliminar un recurso a través de API</span>
|
|
4231
3972
|
}</code></pre>
|
|
4232
3973
|
</section>
|
|
4233
3974
|
<section id="sh-isajax">
|
|
4234
|
-
<h2>Ayudantes del sistema
|
|
4235
|
-
<span class="ret">
|
|
4236
|
-
<p>Su solicitud entrante
|
|
4237
|
-
<pre><code><span class="kw">
|
|
4238
|
-
<span class="fn">
|
|
3975
|
+
<h2>Ayudantes del sistema—<code>isAjax()</code> <span class="tag b-api">Método del sistema</span></h2>
|
|
3976
|
+
<span class="ret">booleano esAjax()</span>
|
|
3977
|
+
<p>Su solicitud entrante<code>XMLHttpRequest</code>Comprueba si se realiza a través de (AJAX) o de la moderna Fetch API (<code>HTTP_X_REQUESTED_WITH</code>mira el valor del encabezado).</p>
|
|
3978
|
+
<pre><code><span class="kw">si</span> (!<span class="fn">esAjax</span>()) {
|
|
3979
|
+
<span class="fn">redirigir</span>(<span class="st">'/error'</span>); <span class="cm">// Sólo permite AJAX</span>
|
|
4239
3980
|
}</code></pre>
|
|
4240
3981
|
</section>
|
|
4241
3982
|
<section id="sh-getclientip">
|
|
4242
|
-
<h2>Ayudantes del sistema
|
|
4243
|
-
<span class="ret">
|
|
3983
|
+
<h2>Ayudantes del sistema—<code>getClientIp()</code> <span class="tag b-api">Método del sistema</span></h2>
|
|
3984
|
+
<span class="ret">cadena getClientIp()</span>
|
|
4244
3985
|
<p>Detecta la dirección IP real del usuario. Llamarada de nube (<code>HTTP_CF_CONNECTING_IP</code>), apoderado (<code>HTTP_X_FORWARDED_FOR</code>) y estándar (<code>REMOTE_ADDR</code>) resuelve todas las conexiones automáticamente.</p>
|
|
4245
|
-
<pre><code><span class="var">$ip</span> = <span class="fn">
|
|
3986
|
+
<pre><code><span class="var">$ip</span> = <span class="fn">obtenerIPCliente</span>(); <span class="cm">// Ej: 192.168.1.1</span></code></pre>
|
|
4246
3987
|
</section>
|
|
4247
|
-
|
|
4248
3988
|
<section id="sh-verifyemail">
|
|
4249
|
-
<h2>Ayudantes del sistema
|
|
3989
|
+
<h2>Ayudantes del sistema—<code>verifyEmail()</code> <span class="tag b-api">Método del sistema</span></h2>
|
|
4250
3990
|
<p>Verifica si la dirección de correo electrónico proporcionada es realmente una dirección de correo electrónico válida según el DNS o el formato.</p>
|
|
4251
|
-
<span class="ret">bool
|
|
4252
|
-
<pre><code><span class="kw">
|
|
4253
|
-
<span class="fn">
|
|
3991
|
+
<span class="ret">bool verificar correo electrónico (cadena $ correo electrónico)</span>
|
|
3992
|
+
<pre><code><span class="kw">si</span> (!<span class="fn">verificarCorreo electrónico</span>(<span class="var">$_POST</span>[<span class="st">'correo electrónico'</span>])) {
|
|
3993
|
+
<span class="fn">apiRespuesta</span>(<span class="st">'error'</span>, <span class="st">'Dirección de correo electrónico no válida.'</span>);
|
|
4254
3994
|
}</code></pre>
|
|
4255
3995
|
</section>
|
|
4256
3996
|
<section id="sh-generatetoken">
|
|
4257
|
-
<h2>Ayudantes del sistema
|
|
4258
|
-
<span class="ret">
|
|
4259
|
-
<p>Genera un token aleatorio criptográficamente seguro (por ejemplo, restablecimiento de contraseña, clave API)
|
|
4260
|
-
<pre><code><span class="var">$token</span> = <span class="fn">
|
|
3997
|
+
<h2>Ayudantes del sistema—<code>generateToken()</code> <span class="tag b-api">Método del sistema</span></h2>
|
|
3998
|
+
<span class="ret">cadena generarToken(int $longitud = 32)</span>
|
|
3999
|
+
<p>Genera un token aleatorio criptográficamente seguro (por ejemplo, restablecimiento de contraseña, clave API).<strong>Nota: Cada byte ingresado produce 2 caracteres (hexadecimales) de salida.</strong>La longitud predeterminada de 32 bytes devuelve una cadena que tiene exactamente 64 caracteres.</p>
|
|
4000
|
+
<pre><code><span class="var">$ token</span> = <span class="fn">generarToken</span>(<span class="nu">16</span>); <span class="cm">// ficha de 32 caracteres</span></code></pre>
|
|
4261
4001
|
</section>
|
|
4262
4002
|
<section id="sh-hashpassword">
|
|
4263
|
-
<h2>Ayudantes del sistema
|
|
4264
|
-
<span class="ret">
|
|
4265
|
-
<p>PHP integrado
|
|
4266
|
-
<pre><code><span class="var">$
|
|
4003
|
+
<h2>Ayudantes del sistema—<code>hashPassword()</code> <span class="tag b-api">Método del sistema</span></h2>
|
|
4004
|
+
<span class="ret">cadena hashContraseña(?cadena $contraseña)</span>
|
|
4005
|
+
<p>PHP integrado<code>password_hash</code>Realiza un hash de contraseñas de forma segura con el algoritmo bcrypt utilizando el método.<strong>Verificación nula:</strong>Si el parámetro está vacío o<code>null</code>Si es así, lanza una excepción para evitar violar la seguridad.</p>
|
|
4006
|
+
<pre><code><span class="var">$ hash</span> = <span class="fn">hashContraseña</span>(<span class="var">$_POST</span>[<span class="st">'contraseña'</span>]);</code></pre>
|
|
4267
4007
|
</section>
|
|
4268
4008
|
<section id="sh-verifypassword">
|
|
4269
|
-
<h2>Ayudantes del sistema
|
|
4270
|
-
<span class="ret">bool
|
|
4271
|
-
<p>Compara la contraseña en texto plano ingresada por el usuario con el hash en la base de datos
|
|
4272
|
-
<pre><code><span class="kw">
|
|
4273
|
-
<span class="cm">//
|
|
4009
|
+
<h2>Ayudantes del sistema—<code>verifyPassword()</code> <span class="tag b-api">Método del sistema</span></h2>
|
|
4010
|
+
<span class="ret">bool verificarContraseña(?cadena $contraseña, ?cadena $hash)</span>
|
|
4011
|
+
<p>Compara la contraseña en texto plano ingresada por el usuario con el hash en la base de datos.<strong>Verificación nula:</strong>O la contraseña o el hash están vacíos o<code>null</code>directamente sin ninguna acción<code>false</code>giratorio.</p>
|
|
4012
|
+
<pre><code><span class="kw">si</span> (<span class="fn">verificar contraseña</span>(<span class="var">$_POST</span>[<span class="st">'contraseña'</span>], <span class="var">$usuario</span>[<span class="st">'contraseña'</span>])) {
|
|
4013
|
+
<span class="cm">// Iniciar sesión exitosamente</span>
|
|
4274
4014
|
}</code></pre>
|
|
4275
4015
|
</section>
|
|
4276
4016
|
<section id="sh-slugify">
|
|
4277
|
-
<h2>Ayudantes del sistema
|
|
4017
|
+
<h2>Ayudantes del sistema—<code>slugify()</code> <span class="tag b-api">Método del sistema</span></h2>
|
|
4278
4018
|
<p>Al registrarse en la base de datos en el backend, genera automáticamente una URL/Slug compatible con SEO a partir de campos como el título o el nombre. Requiere parámetros ilimitados (Variadic).</p>
|
|
4279
|
-
<span class="ret">
|
|
4280
|
-
<pre><code><span class="var">$
|
|
4019
|
+
<span class="ret">cadena slugify(cadena...$textos)</span>
|
|
4020
|
+
<pre><code><span class="var">$babosa</span> = <span class="fn">slugificar</span>(<span class="var">$_POST</span>[<span class="st">'título'</span>]); <span class="cm">// 'mi-hermosa-escritura'</span></code></pre>
|
|
4281
4021
|
</section>
|
|
4282
4022
|
<section id="sh-arrayonly">
|
|
4283
|
-
<h2>Ayudantes del sistema
|
|
4284
|
-
<p>Un gran conjunto de datos (p. ej
|
|
4285
|
-
<span class="ret">
|
|
4286
|
-
<pre><code><span class="var">$postData</span> = <span class="fn">
|
|
4287
|
-
<span class="cm">//
|
|
4023
|
+
<h2>Ayudantes del sistema—<code>arrayOnly()</code> <span class="tag b-api">Método del sistema</span></h2>
|
|
4024
|
+
<p>Un gran conjunto de datos (p. ej.<code>$_POST</code>) filtra solo los datos con las claves especificadas (lista blanca). Se utiliza justo antes de las operaciones de registro de la base de datos para evitar vulnerabilidades de seguridad en asignaciones masivas.</p>
|
|
4025
|
+
<span class="ret">matriz solo matriz (matriz $matriz, matriz $claves)</span>
|
|
4026
|
+
<pre><code><span class="var">$postData</span> = <span class="fn">solo matriz</span>(<span class="var">$_POST</span>, [<span class="st">'nombre de usuario'</span>, <span class="st">'contraseña'</span>, <span class="st">'correo electrónico'</span>]);
|
|
4027
|
+
<span class="cm">// Los valores manipulados externamente, como ID y rol, se destruyen automáticamente.</span></code></pre>
|
|
4288
4028
|
</section>
|
|
4289
|
-
|
|
4290
|
-
|
|
4291
|
-
|
|
4292
|
-
|
|
4293
|
-
<div class="info-box">
|
|
4294
|
-
16 bytes sin procesar nativos, de alto rendimiento y ordenados por tiempo <strong>UUIDv7</strong> produce.
|
|
4295
|
-
</div>
|
|
4296
|
-
<p>Columnas de ID en la base de datos <code>BINARY(16)</code> Cuando desee obtener una gran indexación y un rendimiento de ÚNASE manteniéndolo como, cree nuevos registros con esta función.</p>
|
|
4029
|
+
<section id="sh-byteid">
|
|
4030
|
+
<h2>Ayudantes del sistema -<code>byteId()</code> <span class="tag b-api">Método del sistema</span></h2>
|
|
4031
|
+
<div class="info-box">16 bytes sin procesar nativos, de alto rendimiento y ordenados por tiempo<strong>UUIDv7</strong>produce.</div>
|
|
4032
|
+
<p>Columnas de ID en la base de datos<code>BINARY(16)</code>Cuando desee lograr una gran indexación y un rendimiento de ÚNASE manteniéndolo como, cree nuevos registros con esta función.</p>
|
|
4297
4033
|
<div class="code-block">
|
|
4298
4034
|
<div class="code-header">
|
|
4299
4035
|
<span class="code-lang">PHP</span>
|
|
4300
4036
|
</div>
|
|
4301
|
-
<pre><code><span class="kw">
|
|
4302
|
-
|
|
4303
|
-
<span class="
|
|
4304
|
-
<span class="
|
|
4305
|
-
|
|
4306
|
-
|
|
4307
|
-
|
|
4308
|
-
</
|
|
4309
|
-
|
|
4310
|
-
|
|
4311
|
-
<h2>Ayudantes del sistema - <code>makeId()</code> <span class="tag b-api">SystemMethod</span></h2>
|
|
4312
|
-
<div class="info-box">
|
|
4313
|
-
Nativo, estándar 36 caracteres <strong>UUIDv7</strong> produce la cuerda.
|
|
4314
|
-
</div>
|
|
4315
|
-
<p>en la base de datos <code>CHAR(36)</code> o <code>VARCHAR(36)</code> Si va a utilizarlo y no quiere tratar con datos binarios sin procesar, puede generar UUID directamente en formato de cadena con esta función.</p>
|
|
4037
|
+
<pre><code><span class="kw">usar</span> Bin\SystemMethod;
|
|
4038
|
+
<span class="var">$ ID crudo</span> = SystemMethod::<span class="fn">ID de byte</span>();
|
|
4039
|
+
<span class="cm">// O ayuda global: byteId();</span>
|
|
4040
|
+
<span class="var">$db</span>-><span class="fn">preparar</span>(<span class="st">"INSERTAR EN usuarios (id, nombre) VALORES (?,?)"</span>)-><span class="fn">ejecutar</span>([<span class="var">$ ID crudo</span>, <span class="st">'Triunfo'</span>]);</code></pre>
|
|
4041
|
+
</div>
|
|
4042
|
+
</section>
|
|
4043
|
+
<section id="sh-makeid">
|
|
4044
|
+
<h2>Ayudantes del sistema -<code>makeId()</code> <span class="tag b-api">Método del sistema</span></h2>
|
|
4045
|
+
<div class="info-box">Nativo, estándar 36 caracteres<strong>UUIDv7</strong>produce la cuerda.</div>
|
|
4046
|
+
<p>en la base de datos<code>CHAR(36)</code>o<code>VARCHAR(36)</code>Si va a utilizarlo y no quiere tratar con datos binarios sin procesar, puede generar UUID directamente en formato de cadena con esta función.</p>
|
|
4316
4047
|
<div class="code-block">
|
|
4317
4048
|
<div class="code-header">
|
|
4318
4049
|
<span class="code-lang">PHP</span>
|
|
4319
4050
|
</div>
|
|
4320
|
-
<pre><code><span class="kw">
|
|
4321
|
-
|
|
4322
|
-
<span class="
|
|
4323
|
-
|
|
4324
|
-
</
|
|
4325
|
-
|
|
4326
|
-
|
|
4327
|
-
|
|
4328
|
-
|
|
4329
|
-
<div class="info-box">
|
|
4330
|
-
Convierte UUID binarios sin formato de 16 bytes en una cadena estándar de 36 caracteres.
|
|
4331
|
-
</div>
|
|
4332
|
-
<p>Lo que sacaste de la base de datos <code>BINARY(16)</code> Pone los datos en un formato legible antes de enviarlos a la interfaz (API/JSON).</p>
|
|
4051
|
+
<pre><code><span class="kw">usar</span> Bin\SystemMethod;
|
|
4052
|
+
<span class="var">$identificador de cadena</span> = SystemMethod::<span class="fn">hacerId</span>();
|
|
4053
|
+
<span class="cm">// Salida de muestra: 0190ed84-3f12-7a91-8bc4-91823741abcd</span></code></pre>
|
|
4054
|
+
</div>
|
|
4055
|
+
</section>
|
|
4056
|
+
<section id="sh-formatid">
|
|
4057
|
+
<h2>Ayudantes del sistema -<code>formatId()</code> <span class="tag b-api">Método del sistema</span></h2>
|
|
4058
|
+
<div class="info-box">Convierte UUID binarios sin formato de 16 bytes en una cadena estándar de 36 caracteres.</div>
|
|
4059
|
+
<p>Lo que sacaste de la base de datos<code>BINARY(16)</code>Pone los datos en un formato legible antes de enviarlos a la interfaz (API/JSON).</p>
|
|
4333
4060
|
<div class="code-block">
|
|
4334
4061
|
<div class="code-header">
|
|
4335
4062
|
<span class="code-lang">PHP</span>
|
|
4336
4063
|
</div>
|
|
4337
|
-
<pre><code><span class="kw">
|
|
4338
|
-
|
|
4339
|
-
<span class="var">$
|
|
4340
|
-
<span class="
|
|
4341
|
-
|
|
4342
|
-
</
|
|
4343
|
-
|
|
4344
|
-
|
|
4345
|
-
|
|
4346
|
-
<h2>Ayudantes del sistema - <code>intId()</code> <span class="tag b-api">SystemMethod</span></h2>
|
|
4347
|
-
<div class="info-box">
|
|
4348
|
-
Seguro, aleatorio <code>INT</code> Genera identificación. (Máximo 9 dígitos)
|
|
4349
|
-
</div>
|
|
4064
|
+
<pre><code><span class="kw">usar</span> Bin\SystemMethod;
|
|
4065
|
+
<span class="var">$usuario</span> = <span class="var">$db</span>-><span class="fn">consulta</span>(<span class="st">"SELECCIONAR identificación DE usuarios LÍMITE 1"</span>)-><span class="fn">buscar</span>();
|
|
4066
|
+
<span class="var">$identificador legible</span> = SystemMethod::<span class="fn">ID de formato</span>(<span class="var">$usuario</span>[<span class="st">'IDENTIFICACIÓN'</span>]);
|
|
4067
|
+
<span class="cm">// Salida de muestra: 0190ed84-3f12-7a91-8bc4-91823741abcd</span></code></pre>
|
|
4068
|
+
</div>
|
|
4069
|
+
</section>
|
|
4070
|
+
<section id="sh-intid">
|
|
4071
|
+
<h2>Ayudantes del sistema -<code>intId()</code> <span class="tag b-api">Método del sistema</span></h2>
|
|
4072
|
+
<div class="info-box">Seguro, aleatorio<code>INT</code>Genera identificación. (Máximo 9 dígitos)</div>
|
|
4350
4073
|
<p>Es el generador de enteros tradicional que puede utilizar si no desea renunciar al rendimiento de la base de datos tradicional.</p>
|
|
4351
4074
|
<div class="code-block">
|
|
4352
4075
|
<div class="code-header">
|
|
4353
4076
|
<span class="code-lang">PHP</span>
|
|
4354
4077
|
</div>
|
|
4355
|
-
<pre><code><span class="var">$
|
|
4356
|
-
<span class="cm">//
|
|
4357
|
-
</div>
|
|
4358
|
-
</section>
|
|
4359
|
-
|
|
4360
|
-
|
|
4361
|
-
|
|
4362
|
-
<
|
|
4363
|
-
Seguro, aleatorio <code>BIGINT</code> Genera identificación. (15 dígitos predeterminados: límite seguro para JS)
|
|
4364
|
-
</div>
|
|
4365
|
-
<p>Si va a utilizar identificaciones numéricas enormes como Snowflake (Twilio), esta función le salvará la vida. Si desea tener más de 15 dígitos, puede importarlos como una cadena para evitar la pérdida de datos.</p>
|
|
4078
|
+
<pre><code><span class="var">$identificación</span> = <span class="fn">ID interno</span>(8);
|
|
4079
|
+
<span class="cm">// Salida de muestra: 49201834</span></code></pre>
|
|
4080
|
+
</div>
|
|
4081
|
+
</section>
|
|
4082
|
+
<section id="sh-bigintid">
|
|
4083
|
+
<h2>Ayudantes del sistema -<code>bigintId()</code> <span class="tag b-api">Método del sistema</span></h2>
|
|
4084
|
+
<div class="info-box">Seguro, aleatorio<code>BIGINT</code>Genera identificación. (15 dígitos predeterminados: límite seguro para JS)</div>
|
|
4085
|
+
<p>Si va a utilizar identificaciones numéricas enormes como Snowflake (Twitter), esta función le salvará la vida. Si desea tener más de 15 dígitos, puede importarlos como una cadena para evitar la pérdida de datos.</p>
|
|
4366
4086
|
<div class="code-block">
|
|
4367
4087
|
<div class="code-header">
|
|
4368
4088
|
<span class="code-lang">PHP</span>
|
|
4369
4089
|
</div>
|
|
4370
|
-
<pre><code><span class="var">$
|
|
4371
|
-
<span class="var">$
|
|
4090
|
+
<pre><code><span class="var">$identificación</span> = <span class="fn">bigintId</span>(); <span class="cm">// Devuelve INT de 15 dígitos</span>
|
|
4091
|
+
<span class="var">$Id masivo</span> = <span class="fn">bigintId</span>(18, <span class="kw">verdadero</span>); <span class="cm">// devuelve una CADENA de 18 dígitos (seguro para JS)</span></code></pre>
|
|
4372
4092
|
</div>
|
|
4373
|
-
</section>
|
|
4374
|
-
|
|
4375
|
-
|
|
4376
|
-
|
|
4377
|
-
<div class="info-box">
|
|
4378
|
-
Envuelve valores en cadenas para proteger contra la insensibilidad a los números enormes (BIGINT) de Javascript.
|
|
4379
|
-
</div>
|
|
4093
|
+
</section>
|
|
4094
|
+
<section id="sh-stringer">
|
|
4095
|
+
<h2>Ayudantes del sistema -<code>stringer()</code> <span class="tag b-api">Método del sistema</span></h2>
|
|
4096
|
+
<div class="info-box">Envuelve valores en cadenas para proteger contra la insensibilidad a los números enormes (BIGINT) de Javascript.</div>
|
|
4380
4097
|
<p>Protege las variables numéricas (BigInt, etc.) de más de 15 dígitos de los errores de redondeo de Javascript (pérdida de precisión) al imprimirlas en el DOM en la capa Ver.</p>
|
|
4381
4098
|
<div class="code-block">
|
|
4382
4099
|
<div class="code-header">
|
|
4383
4100
|
<span class="code-lang">HTML/PHP</span>
|
|
4384
4101
|
</div>
|
|
4385
|
-
<pre><code><span class="cm"><!--
|
|
4386
|
-
<button data-id=<span class="st">"<?=</span> <span class="fn">
|
|
4387
|
-
</div>
|
|
4388
|
-
|
|
4389
|
-
|
|
4390
|
-
|
|
4391
|
-
|
|
4392
|
-
|
|
4393
|
-
|
|
4394
|
-
|
|
4395
|
-
<span class="var">$
|
|
4396
|
-
|
|
4397
|
-
<span class="
|
|
4398
|
-
|
|
4399
|
-
|
|
4400
|
-
|
|
4401
|
-
|
|
4402
|
-
</div>
|
|
4403
|
-
</section>
|
|
4404
|
-
|
|
4405
|
-
|
|
4406
|
-
</section>
|
|
4407
|
-
<!-- ====== API GÜVENLİĞİ ====== -->
|
|
4102
|
+
<pre><code><span class="cm"><!-- Lo envolvemos con un larguero para evitar que JS lo corrompa --></span>
|
|
4103
|
+
<button data-id=<span class="st">"<?=</span> <span class="fn">Larguero</span>(<span class="var">$datos</span>[<span class="st">'IDENTIFICACIÓN'</span>]) <span class="st">?>"</span>>Sil</button></code></pre>
|
|
4104
|
+
</div>
|
|
4105
|
+
<section id="sh-otpcoder">
|
|
4106
|
+
<h2>Ayudantes del sistema - Codificador OTP<span class="tag b-api">Método del sistema</span></h2>
|
|
4107
|
+
<div class="info-box">Genera códigos de autenticación (OTP) aleatorios y criptográficamente seguros.</div>
|
|
4108
|
+
<div class="code-block">
|
|
4109
|
+
<pre><code><span class="cm">// número aleatorio de 6 dígitos</span>
|
|
4110
|
+
<span class="var">$código</span> = <span class="fn">otpInt</span>(<span class="nu">6</span>); <span class="cm">// 482910</span>
|
|
4111
|
+
<span class="cm">// Solo letras de 8 dígitos ('c': minúscula, 'C': mayúscula, 'cC': mixta)</span>
|
|
4112
|
+
<span class="var">$código</span> = <span class="fn">otpStr</span>(<span class="nu">8</span>, <span class="st">'DO'</span>); <span class="cm">// PKLMDZRA</span>
|
|
4113
|
+
<span class="cm">// Letra de 6 dígitos+número (Alfanumérico)</span>
|
|
4114
|
+
<span class="var">$código</span> = <span class="fn">otpMix</span>(<span class="nu">6</span>, <span class="st">'DO'</span>); <span class="cm">//9A4X2Z</span></code></pre>
|
|
4115
|
+
</div>
|
|
4116
|
+
</section>
|
|
4117
|
+
</section>
|
|
4118
|
+
====== SEGURIDAD API ======
|
|
4408
4119
|
<section id="api-methods">
|
|
4409
|
-
<h2>API: control de métodos HTTP
|
|
4410
|
-
<p><code class="ic">$allowedMethods</code>
|
|
4411
|
-
<pre><code><span class="cm">//
|
|
4412
|
-
<span class="var">$
|
|
4413
|
-
<span class="fn">
|
|
4414
|
-
|
|
4415
|
-
<span class="
|
|
4416
|
-
<span class="
|
|
4417
|
-
<
|
|
4418
|
-
<p>verificación previa <code class="ic">OPTIONS</code> solicitudes automáticas de CORS <code class="ic">200</code> regresa y el script finaliza; no se requiere intervención manual.</p>
|
|
4120
|
+
<h2>API: control de métodos HTTP<span class="tag b-sec">ApiControl</span></h2>
|
|
4121
|
+
<p><code class="ic">$allowedMethods</code>matriz de ApiControl requiere<strong>antes</strong>debe ser definido. ApiControl bloquea automáticamente las solicitudes de métodos no permitidos leyendo esta cadena.<code class="ic">405 Method Not Allowed</code>Lo rechaza con .</p>
|
|
4122
|
+
<pre><code><span class="cm">// Un punto final que acepta sólo GET y POST</span>
|
|
4123
|
+
<span class="var">$métodos permitidos</span> = [<span class="st">'CONSEGUIR'</span>, <span class="st">'CORREO'</span>];
|
|
4124
|
+
<span class="fn">requerir_una vez</span> ... . <span class="st">'/../app/ApiControl.php'</span>;
|
|
4125
|
+
<span class="cm">// Un punto final que solo acepta DELETE</span>
|
|
4126
|
+
<span class="var">$métodos permitidos</span> = [<span class="st">'BORRAR'</span>];
|
|
4127
|
+
<span class="fn">requerir_una vez</span> ... . <span class="st">'/../app/ApiControl.php'</span>;</code></pre>
|
|
4128
|
+
<p>verificación previa<code class="ic">OPTIONS</code>solicitudes automáticas de CORS<code class="ic">200</code>regresa y el script finaliza; no se requiere intervención manual.</p>
|
|
4419
4129
|
</section>
|
|
4420
4130
|
<section id="api-cors">
|
|
4421
|
-
<h2>API—CORS
|
|
4422
|
-
<p>Si desea permitir el acceso a API desde otros dominios o aplicaciones móviles
|
|
4423
|
-
<pre><code><span class="cm">// ApiControl.php
|
|
4424
|
-
header(<span class="st">"
|
|
4425
|
-
header(<span class="st">"
|
|
4426
|
-
header(<span class="st">"
|
|
4131
|
+
<h2>API—CORS<span class="tag b-api">ApiControl (línea de comentarios)</span></h2>
|
|
4132
|
+
<p>Si desea permitir el acceso a API desde otros dominios o aplicaciones móviles<code class="ic">ApiControl.php</code>Active el bloque CORS en él.</p>
|
|
4133
|
+
<pre><code><span class="cm">// En ApiControl.php – se activa eliminando el comentario</span>
|
|
4134
|
+
header(<span class="st">"Control-de-acceso-permitir-origen: https://tu-dominio.com"</span>);
|
|
4135
|
+
header(<span class="st">"Métodos de permiso de control de acceso: OBTENER, PUBLICAR, OPCIONES"</span>);
|
|
4136
|
+
header(<span class="st">"Acceso-Control-Permitir-Encabezados: Tipo de contenido, Autorización"</span>);</code></pre>
|
|
4427
4137
|
<div class="alert a-warn">
|
|
4428
|
-
<strong>⚠️</strong>
|
|
4429
|
-
</div>
|
|
4138
|
+
<strong>⚠️</strong>En ambiente de producción<code class="ic">*</code>No utilizar (todos los dominios). Especifique claramente la dirección del dominio.</div>
|
|
4430
4139
|
</section>
|
|
4431
4140
|
<section id="api-rate">
|
|
4432
|
-
<h2>API: limitación de velocidad
|
|
4433
|
-
<p>Para evitar que usuarios malintencionados o bots inunden la API
|
|
4141
|
+
<h2>API: limitación de velocidad<span class="tag b-api">ApiControl (línea de comentarios)</span></h2>
|
|
4142
|
+
<p>Para evitar que usuarios malintencionados o bots inunden la API<code class="ic">ApiControl.php</code>Puede activar el bloque de limitación de velocidad en él. Regla predeterminada:<strong>60 solicitudes/IP en 60 segundos</strong>.</p>
|
|
4434
4143
|
<div class="alert a-warn" style="margin-top: 10px; margin-bottom: 20px;">
|
|
4435
|
-
<strong>⚠️ Se requiere servidor Redis:</strong>
|
|
4436
|
-
|
|
4437
|
-
<
|
|
4438
|
-
|
|
4439
|
-
echo json_encode([<span class="st">'error'</span> => <span class="st">'Çok fazla istek. Lütfen bekleyin.'</span>]);</code></pre>
|
|
4144
|
+
<strong>⚠️ Se requiere servidor Redis:</strong>Función de limitación de velocidad<code>\Src\Service\RedisService::getInstance()</code>Funciona usando la clase Redis. Antes de abrir este bloque de código, asegúrese de haber configurado un servicio Redis en su proyecto y<code>src/Service/</code>Asegúrese de crear una clase de conexión en</div>
|
|
4145
|
+
<pre><code><span class="cm">// Si más de 60 solicitudes provienen de la misma IP en 60 segundos:</span>
|
|
4146
|
+
http_response_code(<span class="nu">429</span>); <span class="cm">//Demasiadas solicitudes</span>
|
|
4147
|
+
echo json_encode([<span class="st">'error'</span> => <span class="st">'Demasiadas solicitudes. Espere por favor.'</span>]);</code></pre>
|
|
4440
4148
|
</section>
|
|
4441
|
-
|
|
4149
|
+
====== FLUJO DE TRABAJO ======
|
|
4442
4150
|
<section id="workflow">
|
|
4443
4151
|
<h2>Flujo de trabajo completo: formulario de contacto (de principio a fin)</h2>
|
|
4444
|
-
<p>Uno
|
|
4152
|
+
<p>Uno<strong>Formulario de contacto</strong>Examinemos paso a paso cómo desarrollar la función en los estándares ArtiFrame de principio a fin.</p>
|
|
4445
4153
|
<ol class="steps">
|
|
4446
4154
|
<li>
|
|
4447
4155
|
<div>
|
|
4448
4156
|
<strong>Crear Ver Archivo</strong>
|
|
4449
|
-
<pre><code>artiframe> <span class="fn">
|
|
4450
|
-
<span class="cm">✔
|
|
4451
|
-
<span class="cm">✔
|
|
4452
|
-
<span class="cm">✔
|
|
4157
|
+
<pre><code>artiframe> <span class="fn">hacer:ver</span> <span class="st">contacto.php</span>
|
|
4158
|
+
<span class="cm">✔ público/contacto.php</span>
|
|
4159
|
+
<span class="cm">✔ público/activos/css/contact.css</span>
|
|
4160
|
+
<span class="cm">✔ público/activos/js/contact.js</span></code></pre>
|
|
4453
4161
|
</div>
|
|
4454
4162
|
</li>
|
|
4455
4163
|
<li>
|
|
4456
4164
|
<div>
|
|
4457
4165
|
<strong>Crear punto final API</strong>
|
|
4458
|
-
<pre><code>artiframe> <span class="fn">
|
|
4166
|
+
<pre><code>artiframe> <span class="fn">hacer:api</span> <span class="st">estándar</span> <span class="st">api/contacto/enviar.php</span></code></pre>
|
|
4459
4167
|
</div>
|
|
4460
4168
|
</li>
|
|
4461
4169
|
<li>
|
|
4462
4170
|
<div>
|
|
4463
4171
|
<strong>Formulario HTML de código</strong><br/>
|
|
4464
|
-
<code class="ic">public/iletisim.php</code>
|
|
4465
|
-
|
|
4466
|
-
<?= <span class="fn">csrfField</span>() ?>
|
|
4172
|
+
<code class="ic">public/iletisim.php</code>Agregue el siguiente formulario al archivo:<pre><code><form action="/api/iletisim/gonder.php" method="POST">
|
|
4173
|
+
<?= <span class="fn">campocsrf</span>() ?>
|
|
4467
4174
|
<input type="text" name="ad" placeholder="Adınız">
|
|
4468
4175
|
<input type="email" name="eposta" placeholder="E-posta">
|
|
4469
4176
|
<textarea name="mesaj" placeholder="Mesajınız"></textarea>
|
|
4470
|
-
<button type="submit" data-js="<span class="st">
|
|
4177
|
+
<button type="submit" data-js="<span class="st">contacto-enviar</span>">Gönder</button>
|
|
4471
4178
|
</form></code></pre>
|
|
4472
4179
|
</div>
|
|
4473
4180
|
</li>
|
|
4474
4181
|
<li>
|
|
4475
4182
|
<div>
|
|
4476
4183
|
<strong>Conecte Fetch API con JavaScript</strong><br/>
|
|
4477
|
-
<code class="ic">public/assets/js/iletisim.js</code>
|
|
4478
|
-
|
|
4479
|
-
e.<span class="fn">
|
|
4480
|
-
<span class="kw">
|
|
4481
|
-
|
|
4482
|
-
method: <span class="st">'POST'</span>,
|
|
4184
|
+
<code class="ic">public/assets/js/iletisim.js</code>para presentar:<pre><code>document.<span class="fn">selector de consulta</span>(<span class="st">'[datos-js="contacto-enviar"]'</span>).<span class="fn">agregarEventListener</span>(<span class="st">'hacer clic'</span>, async (e) => {
|
|
4185
|
+
e.<span class="fn">prevenir valor predeterminado</span>();
|
|
4186
|
+
<span class="kw">constante</span> formData = <span class="kw">nuevo</span> <span class="fn">Datos de formulario</span>(e.target.<span class="fn">más cercano</span>(<span class="st">'forma'</span>));
|
|
4187
|
+
<span class="kw">constante</span> res = <span class="kw">esperar</span> <span class="fn">buscar</span>(<span class="st">'/api/contacto/remitente.php'</span>, {
|
|
4188
|
+
method: <span class="st">'CORREO'</span>,
|
|
4483
4189
|
body: formData
|
|
4484
4190
|
});
|
|
4485
|
-
<span class="kw">
|
|
4486
|
-
<span class="fn">
|
|
4191
|
+
<span class="kw">constante</span> data = <span class="kw">esperar</span> res.<span class="fn">json</span>();
|
|
4192
|
+
<span class="fn">consola</span>.<span class="fn">registro</span>(data);
|
|
4487
4193
|
});</code></pre>
|
|
4488
4194
|
</div>
|
|
4489
4195
|
</li>
|
|
4490
4196
|
<li>
|
|
4491
4197
|
<div>
|
|
4492
4198
|
<strong>Lógica completa del servidor (backend)</strong><br/>
|
|
4493
|
-
<code class="ic">public/api/iletisim/gonder.php</code>
|
|
4494
|
-
|
|
4495
|
-
<span class="var">$
|
|
4496
|
-
<span class="
|
|
4497
|
-
<span class="
|
|
4498
|
-
|
|
4499
|
-
<span class="
|
|
4500
|
-
<span class="kw">if</span> (!<span class="fn">verifyCsrf</span>(<span class="var">$_POST</span>[<span class="st">'csrf_token'</span>] ?? <span class="st">''</span>)) {
|
|
4501
|
-
<span class="fn">jsonResponse</span>([<span class="st">'error'</span> => <span class="st">'Geçersiz token.'</span>], <span class="nu">403</span>);
|
|
4199
|
+
<code class="ic">public/api/iletisim/gonder.php</code>en el archivo:<pre><code><span class="kw"><?php</span>
|
|
4200
|
+
<span class="var">$métodos permitidos</span> = [<span class="st">'CORREO'</span>];
|
|
4201
|
+
<span class="fn">requerir_una vez</span> <span class="var">$_SERVIDOR</span>[<span class="st">'DOCUMENT_ROOT'</span>] . <span class="st">'/../app/ApiControl.php'</span>;
|
|
4202
|
+
<span class="kw">usar</span> Bin\SystemMethod;
|
|
4203
|
+
<span class="cm">// 1. Verificación CSRF</span>
|
|
4204
|
+
<span class="kw">si</span> (!<span class="fn">verificarCsrf</span>(<span class="var">$_POST</span>[<span class="st">'csrf_token'</span>] ?? <span class="st">''</span>)) {
|
|
4205
|
+
<span class="fn">jsonRespuesta</span>([<span class="st">'error'</span> => <span class="st">'Token no válido.'</span>], <span class="nu">403</span>);
|
|
4502
4206
|
}
|
|
4503
|
-
|
|
4504
|
-
<span class="
|
|
4505
|
-
<span class="var">$
|
|
4506
|
-
<span class="var">$
|
|
4507
|
-
<span class="
|
|
4508
|
-
|
|
4509
|
-
<span class="cm">//
|
|
4510
|
-
<span class="
|
|
4511
|
-
|
|
4512
|
-
<span class="cm">// 4. Yanıt Ver</span>
|
|
4513
|
-
<span class="fn">jsonResponse</span>([<span class="st">'status'</span> => <span class="st">'success'</span>, <span class="st">'message'</span> => <span class="st">'Mesajınız alındı.'</span>], <span class="nu">200</span>);</code></pre>
|
|
4207
|
+
<span class="cm">// 2. Borrar datos</span>
|
|
4208
|
+
<span class="var">$nombre</span> = <span class="fn">desinfectarString</span>(<span class="var">$_POST</span>[<span class="st">'nombre'</span>] ?? <span class="st">''</span>);
|
|
4209
|
+
<span class="var">$correo electrónico</span> = <span class="fn">desinfectarCorreo electrónico</span>(<span class="var">$_POST</span>[<span class="st">'correo electrónico'</span>] ?? <span class="st">''</span>);
|
|
4210
|
+
<span class="var">$mensaje</span> = <span class="fn">desinfectarString</span>(<span class="var">$_POST</span>[<span class="st">'mensaje'</span>] ?? <span class="st">''</span>);
|
|
4211
|
+
<span class="cm">// 3. Lógica empresarial (enviar correo electrónico, guardar en base de datos, etc.)</span>
|
|
4212
|
+
<span class="cm">//...</span>
|
|
4213
|
+
<span class="cm">// 4. Responder</span>
|
|
4214
|
+
<span class="fn">jsonRespuesta</span>([<span class="st">'estado'</span> => <span class="st">'éxito'</span>, <span class="st">'mensaje'</span> => <span class="st">'Su mensaje ha sido recibido.'</span>], <span class="nu">200</span>);</code></pre>
|
|
4514
4215
|
</div>
|
|
4515
4216
|
</li>
|
|
4516
4217
|
</ol>
|
|
4517
4218
|
<div class="alert a-success">
|
|
4518
|
-
<strong>✅ ¡Completado!</strong>
|
|
4519
|
-
</div>
|
|
4219
|
+
<strong>✅ ¡Completado!</strong>Ha creado un flujo de formulario totalmente seguro y compatible con los estándares con protección XSS, validación CSRF, restricción de métodos HTTP y arquitectura data-js.</div>
|
|
4520
4220
|
</section>
|
|
4521
4221
|
</main>
|
|
4522
4222
|
<script>
|
|
4523
4223
|
const sections = document.querySelectorAll('section[id], header[id], div.card[id]');
|
|
4524
4224
|
const links = document.querySelectorAll('.sidebar nav a');
|
|
4525
|
-
|
|
4526
4225
|
const observer = new IntersectionObserver((entries) => {
|
|
4527
4226
|
entries.forEach(entry => {
|
|
4528
4227
|
if (entry.isIntersecting) {
|
|
@@ -4532,7 +4231,6 @@ echo json_encode([<span class="st">'error'</span> => <span class="st">'Çok f
|
|
|
4532
4231
|
}
|
|
4533
4232
|
});
|
|
4534
4233
|
}, { rootMargin: '-20% 0px -70% 0px' });
|
|
4535
|
-
|
|
4536
4234
|
sections.forEach(s => observer.observe(s));
|
|
4537
4235
|
</script>
|
|
4538
4236
|
<script>
|
|
@@ -4541,7 +4239,6 @@ echo json_encode([<span class="st">'error'</span> => <span class="st">'Çok f
|
|
|
4541
4239
|
const ctx = canvas.getContext('2d');
|
|
4542
4240
|
const cw = canvas.width;
|
|
4543
4241
|
const ch = canvas.height;
|
|
4544
|
-
|
|
4545
4242
|
function drawRoundedRect(x, y, w, h, r, fill, stroke) {
|
|
4546
4243
|
ctx.beginPath();
|
|
4547
4244
|
ctx.moveTo(x + r, y);
|
|
@@ -4562,7 +4259,6 @@ echo json_encode([<span class="st">'error'</span> => <span class="st">'Çok f
|
|
|
4562
4259
|
ctx.stroke();
|
|
4563
4260
|
}
|
|
4564
4261
|
}
|
|
4565
|
-
|
|
4566
4262
|
function drawLine(x1, y1, x2, y2, color) {
|
|
4567
4263
|
ctx.beginPath();
|
|
4568
4264
|
ctx.moveTo(x1, y1);
|
|
@@ -4578,7 +4274,6 @@ echo json_encode([<span class="st">'error'</span> => <span class="st">'Çok f
|
|
|
4578
4274
|
ctx.fillStyle = color;
|
|
4579
4275
|
ctx.fill();
|
|
4580
4276
|
}
|
|
4581
|
-
|
|
4582
4277
|
function drawPath(points, color) {
|
|
4583
4278
|
if(points.length < 2) return;
|
|
4584
4279
|
ctx.beginPath();
|
|
@@ -4599,7 +4294,6 @@ echo json_encode([<span class="st">'error'</span> => <span class="st">'Çok f
|
|
|
4599
4294
|
ctx.fillStyle = color;
|
|
4600
4295
|
ctx.fill();
|
|
4601
4296
|
}
|
|
4602
|
-
|
|
4603
4297
|
function drawText(text, x, y, color, font = "14px Inter", align = "center") {
|
|
4604
4298
|
ctx.fillStyle = color;
|
|
4605
4299
|
ctx.font = font;
|
|
@@ -4607,40 +4301,31 @@ echo json_encode([<span class="st">'error'</span> => <span class="st">'Çok f
|
|
|
4607
4301
|
ctx.textBaseline = "middle";
|
|
4608
4302
|
ctx.fillText(text, x, y);
|
|
4609
4303
|
}
|
|
4610
|
-
|
|
4611
4304
|
const nodes = [
|
|
4612
|
-
{ id: 'n1', x: 20, y: 220, w: 170, h: 50, text: "
|
|
4613
|
-
{ id: 'n2_local', x: 250, y: 80, w: 220, h: 50, text: "
|
|
4614
|
-
{ id: 'n2_net', x: 250, y: 320, w: 200, h: 50, text: "
|
|
4615
|
-
{ id: 'n3_free', x: 550, y: 85, w: 140, h: 40, text: "✅
|
|
4616
|
-
{ id: 'n4_agpl', x: 510, y: 320, w: 180, h: 50, text: "
|
|
4617
|
-
{ id: 'n5_yes', x: 760, y: 220, w: 220, h: 50, text: "✅
|
|
4618
|
-
{ id: 'n6_no', x: 760, y: 400, w: 140, h: 40, text: "
|
|
4619
|
-
{ id: 'n7_sell', x: 960, y: 340, w: 160, h: 50, text: "❌
|
|
4620
|
-
{ id: 'n8_corp', x: 960, y: 440, w: 180, h: 50, text: "💼
|
|
4305
|
+
{ id: 'n1', x: 20, y: 220, w: 170, h: 50, text: "Proje Nerede Çalışacak?", bg: "#1c2128", border: "#58a6ff", textColor: "#e6edf3" },
|
|
4306
|
+
{ id: 'n2_local', x: 250, y: 80, w: 220, h: 50, text: "Sadece Localhost / Bireysel\n(Dış Ağ Bağlantısı Yok)", bg: "#1c2128", border: "#30363d", textColor: "#e6edf3" },
|
|
4307
|
+
{ id: 'n2_net', x: 250, y: 320, w: 200, h: 50, text: "Ağa / İnternete Açık\n(SaaS, İntranet, Web)", bg: "#1c2128", border: "#30363d", textColor: "#e6edf3" },
|
|
4308
|
+
{ id: 'n3_free', x: 550, y: 85, w: 140, h: 40, text: "✅ Özgürsün", bg: "rgba(0,157,108,0.12)", border: "#00c88c", textColor: "#00c88c" },
|
|
4309
|
+
{ id: 'n4_agpl', x: 510, y: 320, w: 180, h: 50, text: "AGPLv3 Açık Kaynak\nYayınlanacak Mı?", bg: "#1c2128", border: "#30363d", textColor: "#e6edf3" },
|
|
4310
|
+
{ id: 'n5_yes', x: 760, y: 220, w: 220, h: 50, text: "✅ Özgürsün\n(İsim & Github Reposu Şart)", bg: "rgba(0,157,108,0.12)", border: "#00c88c", textColor: "#00c88c" },
|
|
4311
|
+
{ id: 'n6_no', x: 760, y: 400, w: 140, h: 40, text: "Amacı Nedir?", bg: "#1c2128", border: "#30363d", textColor: "#e6edf3" },
|
|
4312
|
+
{ id: 'n7_sell', x: 960, y: 340, w: 160, h: 50, text: "❌ İmkansız\n(AGPLv3 İhlali)", bg: "rgba(248,81,73,0.12)", border: "#f85149", textColor: "#f85149" },
|
|
4313
|
+
{ id: 'n8_corp', x: 960, y: 440, w: 180, h: 50, text: "💼 Ticari Çift-Lisans\n(Artilingo İletişim)", bg: "rgba(227,179,65,0.12)", border: "#e3b341", textColor: "#e3b341" }
|
|
4621
4314
|
];
|
|
4622
|
-
|
|
4623
4315
|
ctx.fillStyle = "#0d1117";
|
|
4624
4316
|
ctx.fillRect(0, 0, cw, ch);
|
|
4625
|
-
|
|
4626
4317
|
drawPath([{x:190, y:245}, {x:220, y:245}, {x:220, y:105}, {x:250, y:105}], "#30363d");
|
|
4627
4318
|
drawPath([{x:190, y:245}, {x:220, y:245}, {x:220, y:345}, {x:250, y:345}], "#30363d");
|
|
4628
|
-
|
|
4629
4319
|
drawLine(470, 105, 550, 105, "#30363d");
|
|
4630
4320
|
drawLine(450, 345, 510, 345, "#30363d");
|
|
4631
|
-
|
|
4632
4321
|
drawPath([{x:690, y:345}, {x:725, y:345}, {x:725, y:245}, {x:760, y:245}], "#30363d");
|
|
4633
|
-
drawText("
|
|
4634
|
-
|
|
4322
|
+
drawText("Evet", 740, 235, "#00c88c", "12px Inter");
|
|
4635
4323
|
drawPath([{x:690, y:345}, {x:725, y:345}, {x:725, y:420}, {x:760, y:420}], "#30363d");
|
|
4636
|
-
drawText("
|
|
4637
|
-
|
|
4324
|
+
drawText("Hayır", 740, 410, "#f85149", "12px Inter");
|
|
4638
4325
|
drawPath([{x:900, y:420}, {x:930, y:420}, {x:930, y:365}, {x:960, y:365}], "#30363d");
|
|
4639
|
-
drawText("
|
|
4640
|
-
|
|
4326
|
+
drawText("Satmak/Dağıtmak", 945, 355, "#f85149", "11px Inter");
|
|
4641
4327
|
drawPath([{x:900, y:420}, {x:930, y:420}, {x:930, y:465}, {x:960, y:465}], "#30363d");
|
|
4642
|
-
drawText("
|
|
4643
|
-
|
|
4328
|
+
drawText("Kendi Projem (SaaS)", 945, 455, "#e3b341", "11px Inter");
|
|
4644
4329
|
nodes.forEach(n => {
|
|
4645
4330
|
drawRoundedRect(n.x, n.y, n.w, n.h, 6, n.bg, n.border);
|
|
4646
4331
|
const lines = n.text.split('\n');
|
|
@@ -4653,14 +4338,10 @@ echo json_encode([<span class="st">'error'</span> => <span class="st">'Çok f
|
|
|
4653
4338
|
});
|
|
4654
4339
|
}
|
|
4655
4340
|
</script>
|
|
4656
|
-
|
|
4657
|
-
|
|
4658
|
-
|
|
4659
|
-
Home
|
|
4660
|
-
</a>
|
|
4661
|
-
<style>
|
|
4341
|
+
<a class="btn-back-home" href="../../public/index.html" style="position: fixed; bottom: 20px; left: 20px; z-index: 9999; background: var(--surface, #111); color: var(--text-primary, #fff); border: 1px solid var(--border, #333); padding: 10px 15px; border-radius: 8px; text-decoration: none; font-size: 14px; font-weight: 500; display: flex; align-items: center; gap: 8px; box-shadow: 0 4px 12px rgba(0,0,0,0.5); transition: all 0.2s;">
|
|
4342
|
+
<svg fill="none" height="16" stroke="currentColor" stroke-width="2" viewbox="0 0 24 24" width="16"><path d="M19 12H5M12 19l-7-7 7-7"></path></svg>Hogar</a>
|
|
4343
|
+
<style>
|
|
4662
4344
|
.btn-back-home:hover { border-color: var(--accent, #00E599) !important; color: var(--accent, #00E599) !important; transform: translateY(-2px); }
|
|
4663
4345
|
</style>
|
|
4664
|
-
|
|
4665
4346
|
</body>
|
|
4666
4347
|
</html>
|