change gitignore
This commit is contained in:
parent
d8b89fc4fe
commit
1bcb7eb180
42
.env
Normal file
42
.env
Normal file
@ -0,0 +1,42 @@
|
||||
APP_ENV=production
|
||||
APP_DEBUG=false
|
||||
APP_KEY=base64:aj3bR0zA9I8nZ1Rm5alncE4QFTPNoHVkd8YSRJEImwY=
|
||||
APP_URL=https://yogibook.yogasoul.it
|
||||
|
||||
LOG_CHANNEL=stack
|
||||
|
||||
DB_CONNECTION=mysql
|
||||
DB_HOST="localhost"
|
||||
DB_DATABASE="yogibookaury"
|
||||
DB_USERNAME="solocla"
|
||||
DB_PASSWORD="!Massarosa2"
|
||||
DB_PREFIX="auth_"
|
||||
|
||||
BROADCAST_DRIVER=log
|
||||
CACHE_DRIVER=file
|
||||
QUEUE_DRIVER=sync
|
||||
SESSION_DRIVER=database
|
||||
SESSION_LIFETIME=120
|
||||
|
||||
REDIS_HOST=127.0.0.1
|
||||
REDIS_PASSWORD=null
|
||||
REDIS_PORT=6379
|
||||
|
||||
MAIL_MAILER=smtp
|
||||
MAIL_FROM_NAME="YogiBook"
|
||||
MAIL_FROM_ADDRESS=info@yogasoul.it
|
||||
MAIL_HOST="mail.yogasoul.it"
|
||||
MAIL_PORT=465
|
||||
MAIL_USERNAME=info@yogasoul.it
|
||||
MAIL_PASSWORD=!Testolina88
|
||||
MAIL_ENCRYPTION=ssl
|
||||
|
||||
|
||||
PUSHER_APP_ID=
|
||||
PUSHER_APP_KEY=
|
||||
PUSHER_APP_SECRET=
|
||||
PUSHER_APP_CLUSTER=mt1
|
||||
|
||||
MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
|
||||
MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"
|
||||
|
||||
23
.gitignore
vendored
23
.gitignore
vendored
@ -1,23 +1,2 @@
|
||||
.DS_Store
|
||||
/node_modules
|
||||
/public/hot
|
||||
/public/storage
|
||||
/storage/*.key
|
||||
/vendor
|
||||
/.idea
|
||||
/.fleet
|
||||
/.vscode
|
||||
/.vagrant
|
||||
Homestead.json
|
||||
Homestead.yaml
|
||||
npm-debug.log
|
||||
yarn-error.log
|
||||
.env
|
||||
.phpunit.result.cache
|
||||
.php_cs.cache
|
||||
/documentation
|
||||
/.phpunit.cache
|
||||
/public/build
|
||||
.env.backup
|
||||
.env.production
|
||||
auth.json
|
||||
|
||||
|
||||
1
.phpunit.result.cache
Normal file
1
.phpunit.result.cache
Normal file
File diff suppressed because one or more lines are too long
0
public/assets/libs/gmaps/yarn-error.log
Normal file
0
public/assets/libs/gmaps/yarn-error.log
Normal file
0
public/copiaintegra/dist/assets/libs/gmaps/yarn-error.log
vendored
Normal file
0
public/copiaintegra/dist/assets/libs/gmaps/yarn-error.log
vendored
Normal file
@ -1,11 +1,10 @@
|
||||
<?php
|
||||
|
||||
ini_set('display_errors', '1');
|
||||
ini_set('display_startup_errors', '1');
|
||||
error_reporting(E_ALL);
|
||||
// Connessione al database (assicurati di avere le tue credenziali)
|
||||
include('Connections/bkngstm.php');
|
||||
|
||||
// Connessione al database
|
||||
include('Connections/bkngstm.php');
|
||||
|
||||
// Crea una connessione al database
|
||||
$conn = new mysqli($servername, $username, $password, $dbname);
|
||||
@ -21,15 +20,16 @@ if (
|
||||
isset($_POST['surname-input']) &&
|
||||
isset($_POST['formrow-email-input']) &&
|
||||
isset($_POST['example-date-input']) &&
|
||||
isset($_POST['first-lesson-date']) &&
|
||||
isset($_POST['ticket']) &&
|
||||
isset($_POST['formrow-inputState'])
|
||||
) {
|
||||
|
||||
// Prendi i dati dal modulo
|
||||
$first_name = $_POST['formrow-firstname-input'];
|
||||
$last_name = $_POST['surname-input'];
|
||||
$order_billing_email = $_POST['formrow-email-input'];
|
||||
$order_date_created = $_POST['example-date-input'];
|
||||
$first_lesson_date = $_POST['first-lesson-date'];
|
||||
$nticket = $_POST['ticket'];
|
||||
$quantityclass = $_POST['ticket'];
|
||||
$idservice = $_POST['formrow-inputState'];
|
||||
@ -38,25 +38,22 @@ if (
|
||||
$cod = $_POST['cod'];
|
||||
$userid = isset($_POST['userid']) && !empty($_POST['userid']) ? $_POST['userid'] : NULL;
|
||||
|
||||
|
||||
// Prepara la query SQL
|
||||
$sql = "INSERT INTO orderbook (first_name, last_name, order_billing_email, order_date_created, nticket, quantityclass, idservice, quantity, status, cod, iduser)
|
||||
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
|
||||
|
||||
$sql = "INSERT INTO orderbook (first_name, last_name, order_billing_email, order_date_created, first_lesson_date, nticket, quantityclass, idservice, quantity, status, cod, iduser)
|
||||
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
|
||||
|
||||
$stmt = $conn->prepare($sql);
|
||||
$stmt->bind_param("sssssssissi", $first_name, $last_name, $order_billing_email, $order_date_created, $nticket, $quantityclass, $idservice, $quantity, $status, $cod, $userid);
|
||||
|
||||
$stmt->bind_param("sssssssisssi", $first_name, $last_name, $order_billing_email, $order_date_created, $first_lesson_date, $nticket, $quantityclass, $idservice, $quantity, $status, $cod, $userid);
|
||||
|
||||
if ($stmt->execute()) {
|
||||
echo "Ordine inserito con successo!";
|
||||
// Reindirizzamento a orderbooklist.php dopo aver inserito con successo l'ordine
|
||||
header("Location: orderbooklist.php");
|
||||
exit; // Assicurati di chiamare exit() dopo header() per fermare l'esecuzione dello script
|
||||
exit;
|
||||
} else {
|
||||
echo "Errore: " . $stmt->error;
|
||||
}
|
||||
|
||||
$stmt->close();
|
||||
} // Questa è la parentesi graffa che mancava
|
||||
?>
|
||||
}
|
||||
|
||||
$conn->close();
|
||||
|
||||
@ -6,17 +6,16 @@ if (!$conn) {
|
||||
die("Connessione al database fallita: " . mysqli_connect_error());
|
||||
}
|
||||
// Query SQL per ottenere le informazioni desiderate
|
||||
$sql = "
|
||||
SELECT * from orderbook WHERE orderbook.status ='pending'";
|
||||
$sql = "SELECT * from orderbook WHERE orderbook.status ='pending'";
|
||||
$result = mysqli_query($conn, $sql);
|
||||
// Verifica se la query ha restituito risultati
|
||||
if (!$result) {
|
||||
die("Errore nella query: " . mysqli_error($conn));
|
||||
}
|
||||
?>
|
||||
?>
|
||||
<!doctype html>
|
||||
<html lang="en">
|
||||
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<title>YogiBook - Prenotazioni YogaSoul</title>
|
||||
@ -38,26 +37,25 @@ if (!$result) {
|
||||
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
|
||||
<script>
|
||||
$(function() {
|
||||
$("#expiryDate").datepicker({
|
||||
dateFormat: "yy-mm-dd", // Formato della data
|
||||
minDate: 0, // Impedisce la selezione di date passate
|
||||
// Altre opzioni del datepicker se necessario
|
||||
$("#example-date-input, #first-lesson-date").datepicker({
|
||||
dateFormat: "yy-mm-dd",
|
||||
minDate: 0
|
||||
});
|
||||
});
|
||||
</script>
|
||||
<script>
|
||||
$(document).ready(function() {
|
||||
console.log("Script loaded and running!");
|
||||
|
||||
$(".surname").on("input", function() {
|
||||
var searchTerm = $(this).val();
|
||||
var currentForm = $(this).closest('form'); // Riferimento alla form corrente
|
||||
|
||||
var currentForm = $(this).closest('form');
|
||||
if (searchTerm.length >= 2) {
|
||||
$.ajax({
|
||||
url: "search_users.php",
|
||||
method: "POST",
|
||||
data: { searchTerm: searchTerm },
|
||||
data: {
|
||||
searchTerm: searchTerm
|
||||
},
|
||||
dataType: "json",
|
||||
success: function(data) {
|
||||
var results = data.results;
|
||||
@ -72,7 +70,6 @@ $(document).ready(function() {
|
||||
'</div>'
|
||||
);
|
||||
}
|
||||
// Qui attacchiamo il listener
|
||||
currentForm.next('.search-results').on('click', '.user-result', function() {
|
||||
var selectedEmail = $(this).data("email");
|
||||
var selectedUserId = $(this).data("userid");
|
||||
@ -96,9 +93,7 @@ $(document).ready(function() {
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
</script>
|
||||
|
||||
<style>
|
||||
.custom-card {
|
||||
margin: 10px auto;
|
||||
@ -112,9 +107,11 @@ $(document).ready(function() {
|
||||
cursor: pointer;
|
||||
transition: transform 0.2s;
|
||||
}
|
||||
|
||||
.custom-card:hover {
|
||||
transform: translateY(-5px);
|
||||
}
|
||||
|
||||
.custom-date-box {
|
||||
flex: 1;
|
||||
background-color: red;
|
||||
@ -129,12 +126,15 @@ $(document).ready(function() {
|
||||
border-top-left-radius: 8px;
|
||||
border-bottom-left-radius: 8px;
|
||||
}
|
||||
|
||||
.custom-day {
|
||||
line-height: 1;
|
||||
}
|
||||
|
||||
.custom-month {
|
||||
font-size: 28px;
|
||||
}
|
||||
|
||||
.custom-event-details {
|
||||
flex: 2;
|
||||
display: flex;
|
||||
@ -142,22 +142,27 @@ $(document).ready(function() {
|
||||
padding: 10px 20px;
|
||||
background-color: lightblue;
|
||||
}
|
||||
|
||||
.custom-heading {
|
||||
margin-top: 0;
|
||||
font-size: 24px;
|
||||
}
|
||||
|
||||
.custom-paragraph {
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
|
||||
.custom-actions {
|
||||
display: none;
|
||||
flex-direction: row;
|
||||
justify-content: space-between;
|
||||
margin-top: 10px;
|
||||
}
|
||||
|
||||
.custom-card.expanded .custom-actions {
|
||||
display: flex;
|
||||
}
|
||||
|
||||
.custom-action-button {
|
||||
background-color: #f0f0f0;
|
||||
border: none;
|
||||
@ -166,49 +171,46 @@ $(document).ready(function() {
|
||||
cursor: pointer;
|
||||
transition: background-color 0.2s;
|
||||
}
|
||||
|
||||
.custom-action-button:hover {
|
||||
background-color: #e0e0e0;
|
||||
}
|
||||
|
||||
@media (max-width: 768px) {
|
||||
.custom-card {
|
||||
flex-direction: column;
|
||||
}
|
||||
.custom-date-box, .custom-event-details {
|
||||
|
||||
.custom-date-box,
|
||||
.custom-event-details {
|
||||
width: 100%;
|
||||
border-radius: 0;
|
||||
}
|
||||
|
||||
.custom-event-time {
|
||||
font-size: 24px;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<!-- <body data-layout="horizontal"> -->
|
||||
<!-- Begin page -->
|
||||
<div id="layout-wrapper">
|
||||
<!-- Top Bar -->
|
||||
<header id="page-topbar" class="isvertical-topbar">
|
||||
<div class="navbar-header">
|
||||
<div class="d-flex">
|
||||
<!-- LOGO -->
|
||||
<?php include('include/logoarea.php'); ?>
|
||||
<button type="button" class="btn btn-sm px-3 font-size-24 header-item waves-effect vertical-menu-btn">
|
||||
<i class="bx bx-menu align-middle"></i>
|
||||
</button>
|
||||
<!-- start page title -->
|
||||
<div class="page-title-box align-self-center d-none d-md-block">
|
||||
<h4 class="page-title mb-0">Prenotazione Classi</h4>
|
||||
</div>
|
||||
<!-- end page title -->
|
||||
</div>
|
||||
<div class="d-flex">
|
||||
|
||||
<?php include('include/languageselection.php'); ?>
|
||||
<div class="dropdown d-inline-block">
|
||||
<button type="button" class="btn header-item noti-icon"
|
||||
data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
|
||||
<button type="button" class="btn header-item noti-icon" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
|
||||
<i class="bx bx-search icon-sm align-middle"></i>
|
||||
</button>
|
||||
<div class="dropdown-menu dropdown-menu-lg dropdown-menu-end p-0">
|
||||
@ -222,44 +224,28 @@ $(document).ready(function() {
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<?php include('include/profiletopbar.php'); ?>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
<?php include('include/sidebar.php'); ?>
|
||||
|
||||
<header class="ishorizontal-topbar">
|
||||
<div class="navbar-header">
|
||||
<div class="d-flex">
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
<div class="d-flex"></div>
|
||||
</div>
|
||||
<div class="topnav">
|
||||
<div class="container-fluid">
|
||||
<nav class="navbar navbar-light navbar-expand-lg topnav-menu">
|
||||
|
||||
|
||||
</nav>
|
||||
<nav class="navbar navbar-light navbar-expand-lg topnav-menu"></nav>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
<!-- ============================================================== -->
|
||||
<!-- Start right Content here -->
|
||||
<!-- ============================================================== -->
|
||||
<div class="main-content">
|
||||
<div class="page-content">
|
||||
<div class="container-fluid">
|
||||
|
||||
<div class="row">
|
||||
<div class="col-xl-12">
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
|
||||
|
||||
<h5>Benvenuta/o <?php echo $firstname; ?> </h5>
|
||||
<p>Ordini Pending</p>
|
||||
<div class="table-responsive">
|
||||
@ -278,7 +264,6 @@ $(document).ready(function() {
|
||||
</thead>
|
||||
<tbody>
|
||||
<?php
|
||||
// Loop attraverso i risultati della query
|
||||
while ($row = mysqli_fetch_assoc($result)) {
|
||||
echo "<tr>";
|
||||
echo "<td>" . $row['order_id'] . "</td>";
|
||||
@ -295,77 +280,63 @@ $(document).ready(function() {
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
<!-- sezion inserimento ordini-->
|
||||
|
||||
<div class="row">
|
||||
<div class="col-xl-12">
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
|
||||
|
||||
<h5>Inserisci nuovo Ordine</h5>
|
||||
|
||||
<form action="inserisci_ordine.php" method="post">
|
||||
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-6 mb-3"> <!-- Half width on medium screens -->
|
||||
<div class="col-md-6 mb-3">
|
||||
<label for="formrow-firstname-input" class="form-label">Enter First Name</label>
|
||||
<input type="text" class="form-control name" placeholder="First Name" id="formrow-firstname-input" name="formrow-firstname-input">
|
||||
</div>
|
||||
<div class="col-md-6 mb-3"> <!-- Half width on medium screens -->
|
||||
<div class="col-md-6 mb-3">
|
||||
<label for="surname-input" class="form-label">Cognome</label>
|
||||
<input list="users-suggestions" type="text" class="form-control surname" placeholder="Last Name" id="surname-input" name="surname-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
|
||||
<div class="col-md-6">
|
||||
<div class="mb-3">
|
||||
<label for="formrow-email-input" class="form-label">Enter Email</label>
|
||||
<input type="email" class="form-control email" placeholder="Email" id="formrow-email-input" name="formrow-email-input">
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<div class="mb-3">
|
||||
<label for="example-date-input" class="col-md-2 col-form-label">Data Ordine</label>
|
||||
|
||||
<label for="example-date-input" class="form-label">Data Ordine</label>
|
||||
<input class="form-control" type="date" value="" id="example-date-input" name="example-date-input">
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
<div class="mb-3">
|
||||
<label for="first-lesson-date" class="form-label">Data Prima Lezione</label>
|
||||
<input class="form-control" type="date" value="" id="first-lesson-date" name="first-lesson-date">
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-lg-4">
|
||||
<div class="mb-3">
|
||||
<label for="ticket" class="form-label">N. Ticket</label>
|
||||
<input type="text" class="form-control" placeholder="Ticket" id="ticket" name="ticket">
|
||||
<input type="text" name="userid" id="userid" value="" />
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-lg-4">
|
||||
<div class="mb-3">
|
||||
<label for="formrow-inputState" class="form-label">Classe</label>
|
||||
<select id="formrow-inputState" name="formrow-inputState" class="form-select">
|
||||
<?php
|
||||
// Stabilisci la connessione al database
|
||||
$conn = new mysqli($servername, $username, $password, $dbname);
|
||||
// Controlla la connessione
|
||||
if ($conn->connect_error) {
|
||||
die("Connection failed: " . $conn->connect_error);
|
||||
}
|
||||
// Esegui la query
|
||||
$sql = "SELECT idservice, servicename, day, time FROM service ORDER BY servicename";
|
||||
$result = $conn->query($sql);
|
||||
echo '<option selected="">Choose...</option>';
|
||||
@ -378,21 +349,15 @@ $(document).ready(function() {
|
||||
} else {
|
||||
echo '<option>No services available</option>';
|
||||
}
|
||||
// Chiudi la connessione
|
||||
$conn->close();
|
||||
?>
|
||||
</select>
|
||||
<input type="hidden" name="cod" id="hiddenCod">
|
||||
</div>
|
||||
|
||||
<script>
|
||||
// Seleziona l'elemento 'select' e il campo nascosto
|
||||
const selectElem = document.getElementById('formrow-inputState');
|
||||
const hiddenElem = document.getElementById('hiddenCod');
|
||||
|
||||
// Aggiungi un event listener per l'evento 'change'
|
||||
selectElem.addEventListener('change', function() {
|
||||
// Aggiorna il valore del campo nascosto con il testo dell'opzione selezionata
|
||||
hiddenElem.value = selectElem.options[selectElem.selectedIndex].text;
|
||||
});
|
||||
</script>
|
||||
@ -401,35 +366,21 @@ $(document).ready(function() {
|
||||
<div>
|
||||
<button type="submit" class="btn btn-primary w-md">Submit</button>
|
||||
</div>
|
||||
|
||||
|
||||
</form>
|
||||
<div class="search-results"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
<!-- container-fluid -->
|
||||
</div>
|
||||
|
||||
|
||||
<!-- End Page-content -->
|
||||
<?php include('include/footer.php'); ?>
|
||||
</div>
|
||||
<!-- end main content-->
|
||||
</div>
|
||||
<!-- END layout-wrapper -->
|
||||
|
||||
|
||||
|
||||
<!-- JAVASCRIPT -->
|
||||
<script src="assets/libs/bootstrap/js/bootstrap.bundle.min.js"></script>
|
||||
<script src="assets/libs/metismenujs/metismenujs.min.js"></script>
|
||||
<script src="assets/libs/simplebar/simplebar.min.js"></script>
|
||||
<script src="assets/libs/eva-icons/eva.min.js"></script>
|
||||
<script src="assets/js/app.js"></script>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
@ -1,20 +1,20 @@
|
||||
<?php
|
||||
|
||||
use PHPMailer\PHPMailer\PHPMailer;
|
||||
use PHPMailer\PHPMailer\Exception;
|
||||
?>
|
||||
<?php
|
||||
|
||||
header('Content-Type: text/html; charset=utf-8');
|
||||
ini_set('display_errors', '1');
|
||||
ini_set('display_startup_errors', '1');
|
||||
error_reporting(E_ALL);
|
||||
include('Connections/bkngstm.php');
|
||||
//require_once('include/headscript.php'); ?>
|
||||
<?php
|
||||
|
||||
// take idorder
|
||||
if (isset($_GET['idorder'])) {
|
||||
$idorder = $_GET['idorder']; }
|
||||
// Crea la connessione al database
|
||||
$idorder = $_GET['idorder'];
|
||||
}
|
||||
|
||||
// Crea la connessione al database
|
||||
$conn = new mysqli($servername, $username, $password, $dbname);
|
||||
|
||||
// Verifica la connessione
|
||||
@ -23,8 +23,11 @@ if ($conn->connect_error) {
|
||||
}
|
||||
|
||||
// Seleziona i record con status 'pending' dalla tabella orderbook
|
||||
$select_query = "SELECT * FROM orderbook WHERE orderbook.idorderbook='$idorder'";
|
||||
$result = $conn->query($select_query);
|
||||
$select_query = "SELECT * FROM orderbook WHERE idorderbook = ?";
|
||||
$stmt = $conn->prepare($select_query);
|
||||
$stmt->bind_param("i", $idorder);
|
||||
$stmt->execute();
|
||||
$result = $stmt->get_result();
|
||||
|
||||
if ($result->num_rows > 0) {
|
||||
while ($row = $result->fetch_assoc()) {
|
||||
@ -35,136 +38,125 @@ if ($result->num_rows > 0) {
|
||||
$service_id = $row["idservice"];
|
||||
$quantity_class = $row["quantityclass"];
|
||||
$ordern = $row["order_id"];
|
||||
|
||||
|
||||
$first_lesson_date = $row["first_lesson_date"];
|
||||
|
||||
echo "Elaborazione record con ID: $order_id, Service ID: $service_id\n";
|
||||
|
||||
$user_query = "SELECT id FROM auth_users WHERE email = '$billing_email'";
|
||||
$user_result = $conn->query($user_query);
|
||||
$user_query = "SELECT id FROM auth_users WHERE email = ?";
|
||||
$stmt_user = $conn->prepare($user_query);
|
||||
$stmt_user->bind_param("s", $billing_email);
|
||||
$stmt_user->execute();
|
||||
$user_result = $stmt_user->get_result();
|
||||
|
||||
if ($user_result->num_rows > 0) {
|
||||
$user_row = $user_result->fetch_assoc();
|
||||
$user_id = $user_row["id"];
|
||||
|
||||
$update_query = "UPDATE orderbook SET iduser = '$user_id' WHERE idorderbook = '$order_id'";
|
||||
$conn->query($update_query);
|
||||
$update_query = "UPDATE orderbook SET iduser = ? WHERE idorderbook = ?";
|
||||
$stmt_update = $conn->prepare($update_query);
|
||||
$stmt_update->bind_param("ii", $user_id, $order_id);
|
||||
$stmt_update->execute();
|
||||
$stmt_update->close();
|
||||
} else {
|
||||
// Genera una password casuale e crea l'hash
|
||||
$password = "YogiBook159"; // La password casuale
|
||||
$password = "YogiBook159";
|
||||
$hashed_password = password_hash($password, PASSWORD_DEFAULT);
|
||||
// Inserisci un nuovo utente in auth_users
|
||||
$todaydate = date('Y-m-d H:i:s');
|
||||
$insert_query = "INSERT INTO auth_users (email, password, first_name, last_name, role_id, status, created_at, avatar)
|
||||
VALUES ('$billing_email', '$hashed_password', '$first_name', '$last_name', 2, 'Active', '$todaydate', 'meditationb.png')";
|
||||
$conn->query($insert_query);
|
||||
|
||||
// Ottieni l'ID appena inserito
|
||||
VALUES (?, ?, ?, ?, 2, 'Active', ?, 'meditationb.png')";
|
||||
$stmt_insert = $conn->prepare($insert_query);
|
||||
$stmt_insert->bind_param("sssss", $billing_email, $hashed_password, $first_name, $last_name, $todaydate);
|
||||
$stmt_insert->execute();
|
||||
$new_user_id = $conn->insert_id;
|
||||
$stmt_insert->close();
|
||||
|
||||
// Aggiorna l'ID utente nell'ordine
|
||||
$update_query = "UPDATE orderbook SET iduser = '$new_user_id' WHERE idorderbook = '$order_id'";
|
||||
$conn->query($update_query);
|
||||
$update_query = "UPDATE orderbook SET iduser = ? WHERE idorderbook = ?";
|
||||
$stmt_update = $conn->prepare($update_query);
|
||||
$stmt_update->bind_param("ii", $new_user_id, $order_id);
|
||||
$stmt_update->execute();
|
||||
$stmt_update->close();
|
||||
}
|
||||
$stmt_user->close();
|
||||
}
|
||||
echo "Aggiornamento completato con successo.";
|
||||
} else {
|
||||
echo "Nessun record con status 'pending' trovato.";
|
||||
}
|
||||
$stmt->close();
|
||||
|
||||
|
||||
|
||||
//recupera servischedule
|
||||
|
||||
// Seleziona i primi "n" record dalla tabella serviceschedule successivi al momento attuale
|
||||
$current_datetime = date("Y-m-d H:i:s");
|
||||
$service_schedule_query = "SELECT * FROM serviceschedule WHERE idservice = '$service_id' AND dateschedule >= '$current_datetime' ORDER BY dateschedule";
|
||||
$service_schedule_result = $conn->query($service_schedule_query);
|
||||
// Recupera servischedule a partire da first_lesson_date
|
||||
$service_schedule_query = "SELECT * FROM serviceschedule WHERE idservice = ? AND dateschedule >= ? ORDER BY dateschedule";
|
||||
$stmt_schedule = $conn->prepare($service_schedule_query);
|
||||
$stmt_schedule->bind_param("is", $service_id, $first_lesson_date);
|
||||
$stmt_schedule->execute();
|
||||
$service_schedule_result = $stmt_schedule->get_result();
|
||||
|
||||
if ($service_schedule_result->num_rows > 0) {
|
||||
echo "Record per l'ordine ID: $order_id\n";
|
||||
|
||||
$inserted_count = 0; // Numero di inserimenti effettuati con successo
|
||||
|
||||
$inserted_count = 0;
|
||||
|
||||
while ($schedule_row = $service_schedule_result->fetch_assoc()) {
|
||||
|
||||
if ($inserted_count >= $quantity_class) {
|
||||
break; // Se il numero di inserimenti riusciti è sufficiente, esci dal ciclo
|
||||
break;
|
||||
}
|
||||
|
||||
$date_schedule = $schedule_row["dateschedule"];
|
||||
$selected_user_id = isset($new_user_id) ? $new_user_id : $user_id;
|
||||
|
||||
$idservice = $schedule_row["idservice"];
|
||||
|
||||
//recover number of booking
|
||||
$idserviceschedule = $schedule_row["idserviceschedule"];
|
||||
|
||||
//check if already booked
|
||||
$querychk = "SELECT * FROM bookingclass WHERE iduser = '$user_id' AND idserviceschedule = '$idserviceschedule'";
|
||||
$result = mysqli_query($conn, $querychk);
|
||||
|
||||
|
||||
if ($result) {
|
||||
// Verifica se esiste almeno una riga nella query
|
||||
if (mysqli_num_rows($result) == 0) {
|
||||
|
||||
|
||||
//recover maxcapacity
|
||||
$service_maxcapacity_query = "SELECT maxcapacity FROM service WHERE idservice = '$idservice'";
|
||||
$service_maxcapacity_result = $conn->query($service_maxcapacity_query);
|
||||
$querychk = "SELECT * FROM bookingclass WHERE iduser = ? AND idserviceschedule = ?";
|
||||
$stmt_chk = $conn->prepare($querychk);
|
||||
$stmt_chk->bind_param("ii", $selected_user_id, $idserviceschedule);
|
||||
$stmt_chk->execute();
|
||||
$result = $stmt_chk->get_result();
|
||||
|
||||
if ($result->num_rows == 0) {
|
||||
$service_maxcapacity_query = "SELECT maxcapacity FROM service WHERE idservice = ?";
|
||||
$stmt_maxcapacity = $conn->prepare($service_maxcapacity_query);
|
||||
$stmt_maxcapacity->bind_param("i", $idservice);
|
||||
$stmt_maxcapacity->execute();
|
||||
$service_maxcapacity_result = $stmt_maxcapacity->get_result();
|
||||
$row = $service_maxcapacity_result->fetch_assoc();
|
||||
$maxcapacity = $row['maxcapacity'];
|
||||
$stmt_maxcapacity->close();
|
||||
|
||||
|
||||
|
||||
$bookingclass_count_query = "SELECT COUNT(*) as total_records FROM bookingclass WHERE idserviceschedule = '$idserviceschedule'";
|
||||
$bookingclass_count_result = $conn->query($bookingclass_count_query);
|
||||
|
||||
if ($bookingclass_count_result) {
|
||||
$bookingclass_count_query = "SELECT COUNT(*) as total_records FROM bookingclass WHERE idserviceschedule = ?";
|
||||
$stmt_count = $conn->prepare($bookingclass_count_query);
|
||||
$stmt_count->bind_param("i", $idserviceschedule);
|
||||
$stmt_count->execute();
|
||||
$bookingclass_count_result = $stmt_count->get_result();
|
||||
$rowcount = $bookingclass_count_result->fetch_assoc();
|
||||
$total_records = $rowcount['total_records'];
|
||||
$stmt_count->close();
|
||||
|
||||
// Ora hai il numero totale di record con l'idserviceschedule specificato
|
||||
} else {
|
||||
$total_records='0';
|
||||
}
|
||||
|
||||
// Check if maxcapacity is greater than total_records before inserting
|
||||
if ($maxcapacity > $total_records) {
|
||||
|
||||
// Inserisci il nuovo record in bookingclass
|
||||
$insert_booking_query = "INSERT INTO bookingclass (idserviceschedule, idservice, iduser, bookingstart, idorder)
|
||||
VALUES ('{$schedule_row['idserviceschedule']}', '$service_id', '$selected_user_id', '$date_schedule', '$order_id')";
|
||||
if ($conn->query($insert_booking_query)) {
|
||||
VALUES (?, ?, ?, ?, ?)";
|
||||
$stmt_insert_booking = $conn->prepare($insert_booking_query);
|
||||
$stmt_insert_booking->bind_param("iiisi", $idserviceschedule, $service_id, $selected_user_id, $date_schedule, $order_id);
|
||||
if ($stmt_insert_booking->execute()) {
|
||||
echo "Inserito record in bookingclass per l'ordine ID: $order_id\n";
|
||||
$inserted_count++;
|
||||
} else {
|
||||
echo "Errore durante l'inserimento: " . $conn->error . "\n";
|
||||
echo "Errore durante l'inserimento: " . $stmt_insert_booking->error . "\n";
|
||||
}
|
||||
$stmt_insert_booking->close();
|
||||
} else {
|
||||
echo "La capacità massima è stata raggiunta. Impossibile effettuare la prenotazione.\n";
|
||||
}
|
||||
|
||||
}}
|
||||
//brackets of while
|
||||
}
|
||||
$stmt_chk->close();
|
||||
}
|
||||
|
||||
// Aggiorna lo status a 'booked' nella tabella orderbook
|
||||
$update_order_status_query = "UPDATE orderbook SET status = 'booked' WHERE idorderbook = '$order_id'";
|
||||
$conn->query($update_order_status_query);
|
||||
|
||||
$update_order_status_query = "UPDATE orderbook SET status = 'booked' WHERE idorderbook = ?";
|
||||
$stmt_status = $conn->prepare($update_order_status_query);
|
||||
$stmt_status->bind_param("i", $order_id);
|
||||
$stmt_status->execute();
|
||||
$stmt_status->close();
|
||||
echo "Aggiornato lo status a 'booked' per l'ordine ID: $order_id\n";
|
||||
|
||||
//send email to user
|
||||
|
||||
require 'phpmailer/src/Exception.php';
|
||||
require 'phpmailer/src/PHPMailer.php';
|
||||
require 'phpmailer/src/SMTP.php';
|
||||
$name = $first_name;
|
||||
|
||||
$messageedit = "<p style='font-size: 14px; line-height: 190%;'><span style='font-size: 18px; line-height: 34.2px;'><strong><span style='line-height: 34.2px; font-size: 18px;'> Ciao $name , </span></strong></span></p>
|
||||
<p style='font-size: 14px; line-height: 190%;'><span style='font-size: 16px; line-height: 30.4px;'>Le prenotazioni relative al tuo ultimo ordine n. $ordern sono state inserite con successo!</span></p>
|
||||
<p style='font-size: 14px; line-height: 190%;'><span style='font-size: 16px; line-height: 30.4px;'>Puoi vederle e riprogrammarle dall'indirizzo https://yogibook.yogasoul.it </span></p>
|
||||
@ -178,102 +170,93 @@ $messageedit=" <p style='font-size: 14px; line-height: 190%;'><span style='fo
|
||||
<br>
|
||||
<p style='font-size: 14px; line-height: 190%;'><span style='font-size: 16px; line-height: 30.4px;'>Ci vediamo sul tappetino!</span></p>
|
||||
<p style='font-size: 14px; line-height: 190%;'><span style='font-size: 16px; line-height: 30.4px;'>Il Team Yogasoul</span></p>";
|
||||
|
||||
$buttonedit = "<a href='https://yogibook.yogasoul.it/' target='_blank' class='v-button v-font-size' style='box-sizing: border-box;display: inline-block;text-decoration: none;-webkit-text-size-adjust: none;text-align: center;color: #FFFFFF; background-color: #3AAEE0; border-radius: 4px;-webkit-border-radius: 4px; -moz-border-radius: 4px; width:auto; max-width:100%; overflow-wrap: break-word; word-break: break-word; word-wrap:break-word; mso-border-alt: none;font-size: 14px;'>
|
||||
<span style='display:block;padding:10px 20px;line-height:120%;'><span style='line-height: 16.8px;'>YogiBook - YogaSoul</span></span>
|
||||
</a>";
|
||||
|
||||
//mail to client
|
||||
|
||||
$mail = new PHPMailer(true);
|
||||
|
||||
$mail->isSMTP(); // Set mailer to use SMTP
|
||||
$mail->Host = 'mail.yogasoul.it'; // Specify main and backup server
|
||||
$mail->SMTPAuth = true; // Enable SMTP authentication
|
||||
$mail->Username = 'info@yogasoul.it'; // SMTP username
|
||||
$mail->Password = '!Testolina88'; // SMTP password
|
||||
$mail->SMTPSecure = 'tls'; // Enable encryption, 'ssl' also accepted
|
||||
$mail->isSMTP();
|
||||
$mail->Host = 'mail.yogasoul.it';
|
||||
$mail->SMTPAuth = true;
|
||||
$mail->Username = 'info@yogasoul.it';
|
||||
$mail->Password = '!Testolina88';
|
||||
$mail->SMTPSecure = 'tls';
|
||||
$mail->Port = '587';
|
||||
|
||||
|
||||
include('mail/emailtemplate2.php');
|
||||
// Email body content
|
||||
|
||||
//$trfnmbmail=$appformn.'r'.$revnumb;
|
||||
$htmlContent = $mailmessage1;
|
||||
|
||||
|
||||
$mail->From = 'info@yogasoul.it';
|
||||
$mail->FromName = 'YogiBook [YogaSoul]';
|
||||
$mail->addAddress($billing_email); // Add a recipient
|
||||
|
||||
|
||||
|
||||
|
||||
$mail->addAddress($billing_email);
|
||||
$mail->Subject = "YogiBook - Prenotazioni effettuate per il tuo ordine $ordern";
|
||||
$mail->Body = $htmlContent;
|
||||
$mail->AltBody = 'This is the body in plain text for non-HTML mail clients';
|
||||
|
||||
$mail->send();
|
||||
|
||||
//mail sent
|
||||
|
||||
|
||||
|
||||
|
||||
// ... (il resto del codice come prima)
|
||||
} else {
|
||||
echo "Nessun record di schedule futuro trovato per l'ordine ID: $order_id\n";
|
||||
echo "Nessun record di schedule futuro trovato per l'ordine ID: $order_id a partire dalla data della prima lezione: $first_lesson_date\n";
|
||||
}
|
||||
|
||||
$stmt_schedule->close();
|
||||
|
||||
// Recupera il numero di settimane da expiryparameter
|
||||
$expiry_class_query = "SELECT quantityclass FROM orderbook WHERE idorderbook = '$order_id'";
|
||||
$expiry_class_result = $conn->query($expiry_class_query);
|
||||
$expiry_class_query = "SELECT quantityclass, first_lesson_date FROM orderbook WHERE idorderbook = ?";
|
||||
$stmt_expiry = $conn->prepare($expiry_class_query);
|
||||
$stmt_expiry->bind_param("i", $order_id);
|
||||
$stmt_expiry->execute();
|
||||
$expiry_class_result = $stmt_expiry->get_result();
|
||||
|
||||
if ($expiry_class_result && $expiry_class_result->num_rows > 0) {
|
||||
$row = $expiry_class_result->fetch_assoc();
|
||||
$quantity_class = $row['quantityclass'];
|
||||
$first_lesson_date = $row['first_lesson_date'];
|
||||
|
||||
$expiry_weeks_query = "SELECT expiryweeks FROM expiryparameter WHERE quantityclass = '$quantity_class'";
|
||||
$expiry_weeks_result = $conn->query($expiry_weeks_query);
|
||||
$expiry_weeks_query = "SELECT expiryweeks FROM expiryparameter WHERE quantityclass = ?";
|
||||
$stmt_expiry_weeks = $conn->prepare($expiry_weeks_query);
|
||||
$stmt_expiry_weeks->bind_param("i", $quantity_class);
|
||||
$stmt_expiry_weeks->execute();
|
||||
$expiry_weeks_result = $stmt_expiry_weeks->get_result();
|
||||
|
||||
if ($expiry_weeks_result && $expiry_weeks_result->num_rows > 0) {
|
||||
$expiry_row = $expiry_weeks_result->fetch_assoc();
|
||||
$expiry_weeks = $expiry_row['expiryweeks'];
|
||||
|
||||
// Aggiorna la colonna expireon in orderbook
|
||||
$update_expiry_query = "UPDATE orderbook SET expireon = DATE_ADD(order_date_created, INTERVAL $expiry_weeks WEEK) WHERE idorderbook = '$order_id'";
|
||||
$conn->query($update_expiry_query);
|
||||
// Aggiorna la colonna expireon in orderbook basandosi su first_lesson_date
|
||||
$update_expiry_query = "UPDATE orderbook SET expireon = DATE_ADD(first_lesson_date, INTERVAL ? WEEK) WHERE idorderbook = ?";
|
||||
$stmt_update_expiry = $conn->prepare($update_expiry_query);
|
||||
$stmt_update_expiry->bind_param("ii", $expiry_weeks, $order_id);
|
||||
$stmt_update_expiry->execute();
|
||||
$stmt_update_expiry->close();
|
||||
|
||||
echo "Aggiornata la colonna expireon per l'ordine ID: $order_id\n";
|
||||
} else {
|
||||
echo "Nessun record trovato in expiryparameter per quantityclass: $quantity_class\n";
|
||||
}
|
||||
$stmt_expiry_weeks->close();
|
||||
} else {
|
||||
echo "Nessun record trovato in orderbook per l'ordine ID: $order_id\n";
|
||||
}
|
||||
$stmt_expiry->close();
|
||||
|
||||
// Recupera il numero da expiryparameter per maxreschedule
|
||||
$reschedule_number_query = "SELECT reschedulenumber FROM expiryparameter WHERE quantityclass = '$quantity_class'";
|
||||
$reschedule_number_result = $conn->query($reschedule_number_query);
|
||||
$reschedule_number_query = "SELECT reschedulenumber FROM expiryparameter WHERE quantityclass = ?";
|
||||
$stmt_reschedule = $conn->prepare($reschedule_number_query);
|
||||
$stmt_reschedule->bind_param("i", $quantity_class);
|
||||
$stmt_reschedule->execute();
|
||||
$reschedule_number_result = $stmt_reschedule->get_result();
|
||||
|
||||
if ($reschedule_number_result && $reschedule_number_result->num_rows > 0) {
|
||||
$reschedule_row = $reschedule_number_result->fetch_assoc();
|
||||
$reschedule_number = $reschedule_row['reschedulenumber'];
|
||||
|
||||
// Aggiorna la colonna maxreschedule in orderbook
|
||||
$update_max_reschedule_query = "UPDATE orderbook SET maxreschedule = '$reschedule_number' WHERE idorderbook = '$order_id'";
|
||||
$conn->query($update_max_reschedule_query);
|
||||
$update_max_reschedule_query = "UPDATE orderbook SET maxreschedule = ? WHERE idorderbook = ?";
|
||||
$stmt_max_reschedule = $conn->prepare($update_max_reschedule_query);
|
||||
$stmt_max_reschedule->bind_param("ii", $reschedule_number, $order_id);
|
||||
$stmt_max_reschedule->execute();
|
||||
$stmt_max_reschedule->close();
|
||||
|
||||
echo "Aggiornata la colonna maxreschedule per l'ordine ID: $order_id\n";
|
||||
header("Location: orderbooklist.php");
|
||||
exit();
|
||||
|
||||
} else {
|
||||
echo "Nessun record trovato in expiryparameter per quantityclass: $quantity_class\n";
|
||||
}
|
||||
$stmt_reschedule->close();
|
||||
|
||||
// Chiudi la connessione al database
|
||||
$conn->close();
|
||||
?>
|
||||
|
||||
18
vendor/akaunting/laravel-setting/.editorconfig
vendored
Normal file
18
vendor/akaunting/laravel-setting/.editorconfig
vendored
Normal file
@ -0,0 +1,18 @@
|
||||
; This file is for unifying the coding style for different editors and IDEs.
|
||||
; More information at https://editorconfig.org
|
||||
|
||||
root = true
|
||||
|
||||
[*]
|
||||
charset = utf-8
|
||||
indent_size = 4
|
||||
indent_style = space
|
||||
end_of_line = lf
|
||||
insert_final_newline = true
|
||||
trim_trailing_whitespace = true
|
||||
|
||||
[*.md]
|
||||
trim_trailing_whitespace = false
|
||||
|
||||
[*.yml]
|
||||
indent_size = 2
|
||||
25
vendor/akaunting/laravel-setting/.gitattributes
vendored
Normal file
25
vendor/akaunting/laravel-setting/.gitattributes
vendored
Normal file
@ -0,0 +1,25 @@
|
||||
# Set the default behavior, in case people don't have core.autocrlf set.
|
||||
* text eol=lf
|
||||
|
||||
# Explicitly declare text files you want to always be normalized and converted
|
||||
# to native line endings on checkout.
|
||||
*.c text
|
||||
*.h text
|
||||
|
||||
# Declare files that will always have CRLF line endings on checkout.
|
||||
*.sln text eol=crlf
|
||||
|
||||
# Denote all files that are truly binary and should not be modified.
|
||||
*.png binary
|
||||
*.jpg binary
|
||||
*.otf binary
|
||||
*.eot binary
|
||||
*.svg binary
|
||||
*.ttf binary
|
||||
*.woff binary
|
||||
*.woff2 binary
|
||||
|
||||
*.css linguist-vendored
|
||||
*.scss linguist-vendored
|
||||
*.js linguist-vendored
|
||||
CHANGELOG.md export-ignore
|
||||
37
vendor/akaunting/laravel-setting/.github/workflows/tests.yml
vendored
Normal file
37
vendor/akaunting/laravel-setting/.github/workflows/tests.yml
vendored
Normal file
@ -0,0 +1,37 @@
|
||||
name: Tests
|
||||
|
||||
on: [push, pull_request]
|
||||
|
||||
jobs:
|
||||
tests:
|
||||
|
||||
name: PHP ${{ matrix.php }}
|
||||
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
strategy:
|
||||
matrix:
|
||||
php: ['7.3', '7.4', '8.0', '8.1']
|
||||
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v2
|
||||
|
||||
- name: Cache composer
|
||||
uses: actions/cache@v1
|
||||
with:
|
||||
path: ~/.composer/cache/files
|
||||
key: php-${{ matrix.php }}-composer-${{ hashFiles('composer.json') }}
|
||||
|
||||
- name: Setup PHP
|
||||
uses: shivammathur/setup-php@v2
|
||||
with:
|
||||
php-version: ${{ matrix.php }}
|
||||
extension-csv: bcmath, ctype, dom, fileinfo, intl, gd, json, mbstring, pdo, pdo_sqlite, openssl, sqlite, xml, zip
|
||||
coverage: none
|
||||
|
||||
- name: Install composer
|
||||
run: composer install --no-interaction --no-scripts --no-suggest --prefer-source
|
||||
|
||||
- name: Execute tests
|
||||
run: vendor/bin/phpunit
|
||||
9
vendor/akaunting/laravel-setting/.gitignore
vendored
Normal file
9
vendor/akaunting/laravel-setting/.gitignore
vendored
Normal file
@ -0,0 +1,9 @@
|
||||
/.idea
|
||||
/.history
|
||||
/.vscode
|
||||
/tests/databases
|
||||
/vendor
|
||||
.DS_Store
|
||||
.phpunit.result.cache
|
||||
composer.phar
|
||||
composer.lock
|
||||
4
vendor/akaunting/laravel-setting/.styleci.yml
vendored
Normal file
4
vendor/akaunting/laravel-setting/.styleci.yml
vendored
Normal file
@ -0,0 +1,4 @@
|
||||
preset: psr2
|
||||
|
||||
enabled:
|
||||
- concat_with_spaces
|
||||
23
vendor/akaunting/laravel-setting/LICENSE.md
vendored
Normal file
23
vendor/akaunting/laravel-setting/LICENSE.md
vendored
Normal file
@ -0,0 +1,23 @@
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2015 Andreas Lutro
|
||||
|
||||
Copyright (c) 2017 Akaunting
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
187
vendor/akaunting/laravel-setting/README.md
vendored
Normal file
187
vendor/akaunting/laravel-setting/README.md
vendored
Normal file
@ -0,0 +1,187 @@
|
||||
# Persistent settings package for Laravel
|
||||
|
||||
[](https://github.com/akaunting/laravel-setting)
|
||||
[](https://styleci.io/repos/101231817)
|
||||
[](https://scrutinizer-ci.com/g/akaunting/laravel-setting)
|
||||
[](LICENSE.md)
|
||||
|
||||
This package allows you to save settings in a more persistent way. You can use the database and/or json file to save your settings. You can also override the Laravel config.
|
||||
|
||||
* Driver support
|
||||
* Helper function
|
||||
* Blade directive
|
||||
* Override config values
|
||||
* Encryption
|
||||
* Custom file, table and columns
|
||||
* Auto save
|
||||
* Extra columns
|
||||
* Cache support
|
||||
|
||||
## Getting Started
|
||||
|
||||
### 1. Install
|
||||
|
||||
Run the following command:
|
||||
|
||||
```bash
|
||||
composer require akaunting/laravel-setting
|
||||
```
|
||||
|
||||
### 2. Register (for Laravel < 5.5)
|
||||
|
||||
Register the service provider in `config/app.php`
|
||||
|
||||
```php
|
||||
Akaunting\Setting\Provider::class,
|
||||
```
|
||||
|
||||
Add alias if you want to use the facade.
|
||||
|
||||
```php
|
||||
'Setting' => Akaunting\Setting\Facade::class,
|
||||
```
|
||||
|
||||
### 3. Publish
|
||||
|
||||
Publish config file.
|
||||
|
||||
```bash
|
||||
php artisan vendor:publish --tag=setting
|
||||
```
|
||||
|
||||
### 4. Database
|
||||
|
||||
Create table for database driver
|
||||
|
||||
```bash
|
||||
php artisan migrate
|
||||
```
|
||||
|
||||
### 5. Configure
|
||||
|
||||
You can change the options of your app from `config/setting.php` file
|
||||
|
||||
## Usage
|
||||
|
||||
You can either use the helper method like `setting('foo')` or the facade `Setting::get('foo')`
|
||||
|
||||
### Facade
|
||||
|
||||
```php
|
||||
Setting::get('foo', 'default');
|
||||
Setting::get('nested.element');
|
||||
Setting::set('foo', 'bar');
|
||||
Setting::forget('foo');
|
||||
$settings = Setting::all();
|
||||
```
|
||||
|
||||
### Helper
|
||||
|
||||
```php
|
||||
setting('foo', 'default');
|
||||
setting('nested.element');
|
||||
setting(['foo' => 'bar']);
|
||||
setting()->forget('foo');
|
||||
$settings = setting()->all();
|
||||
```
|
||||
|
||||
You can call the `save()` method to save the changes.
|
||||
|
||||
### Auto Save
|
||||
|
||||
If you enable the `auto_save` option in the config file, settings will be saved automatically every time the application shuts down if anything has been changed.
|
||||
|
||||
### Blade Directive
|
||||
|
||||
You can get the settings directly in your blade templates using the helper method or the blade directive like `@setting('foo')`
|
||||
|
||||
### Override Config Values
|
||||
|
||||
You can easily override default config values by adding them to the `override` option in `config/setting.php`, thereby eliminating the need to modify the default config files and also allowing you to change said values during production. Ex:
|
||||
|
||||
```php
|
||||
'override' => [
|
||||
"app.name" => "app_name",
|
||||
"app.env" => "app_env",
|
||||
"mail.driver" => "app_mail_driver",
|
||||
"mail.host" => "app_mail_host",
|
||||
],
|
||||
```
|
||||
|
||||
The values on the left corresponds to the respective config value (Ex: config('app.name')) and the value on the right is the name of the `key` in your settings table/json file.
|
||||
|
||||
### Encryption
|
||||
|
||||
If you like to encrypt the values for a given key, you can pass the key to the `encrypted_keys` option in `config/setting.php` and the rest is automatically handled by using Laravel's built-in encryption facilities. Ex:
|
||||
|
||||
```php
|
||||
'encrypted_keys' => [
|
||||
"payment.key",
|
||||
],
|
||||
```
|
||||
|
||||
### JSON Storage
|
||||
|
||||
You can modify the path used on run-time using `setting()->setPath($path)`.
|
||||
|
||||
### Database Storage
|
||||
|
||||
If you want to use the database as settings storage then you should run the `php artisan migrate`. You can modify the table fields from the `create_settings_table` file in the migrations directory.
|
||||
|
||||
#### Extra Columns
|
||||
|
||||
If you want to store settings for multiple users/clients in the same database you can do so by specifying extra columns:
|
||||
|
||||
```php
|
||||
setting()->setExtraColumns(['user_id' => Auth::user()->id]);
|
||||
```
|
||||
|
||||
where `user_id = x` will now be added to the database query when settings are retrieved, and when new settings are saved, the `user_id` will be populated.
|
||||
|
||||
If you need more fine-tuned control over which data gets queried, you can use the `setConstraint` method which takes a closure with two arguments:
|
||||
|
||||
- `$query` is the query builder instance
|
||||
- `$insert` is a boolean telling you whether the query is an insert or not. If it is an insert, you usually don't need to do anything to `$query`.
|
||||
|
||||
```php
|
||||
setting()->setConstraint(function($query, $insert) {
|
||||
if ($insert) return;
|
||||
$query->where(/* ... */);
|
||||
});
|
||||
```
|
||||
|
||||
### Custom Drivers
|
||||
|
||||
This package uses the Laravel `Manager` class under the hood, so it's easy to add your own storage driver. All you need to do is extend the abstract `Driver` class, implement the abstract methods and call `setting()->extend`.
|
||||
|
||||
```php
|
||||
class MyDriver extends Akaunting\Setting\Contracts\Driver
|
||||
{
|
||||
// ...
|
||||
}
|
||||
|
||||
app('setting.manager')->extend('mydriver', function($app) {
|
||||
return $app->make('MyDriver');
|
||||
});
|
||||
```
|
||||
|
||||
## Changelog
|
||||
|
||||
Please see [Releases](../../releases) for more information what has changed recently.
|
||||
|
||||
## Contributing
|
||||
|
||||
Pull requests are more than welcome. You must follow the PSR coding standards.
|
||||
|
||||
## Security
|
||||
|
||||
If you discover any security related issues, please email security@akaunting.com instead of using the issue tracker.
|
||||
|
||||
## Credits
|
||||
|
||||
- [Denis Duliçi](https://github.com/denisdulici)
|
||||
- [All Contributors](../../contributors)
|
||||
|
||||
## License
|
||||
|
||||
The MIT License (MIT). Please see [LICENSE](LICENSE.md) for more information.
|
||||
48
vendor/akaunting/laravel-setting/composer.json
vendored
Normal file
48
vendor/akaunting/laravel-setting/composer.json
vendored
Normal file
@ -0,0 +1,48 @@
|
||||
{
|
||||
"name": "akaunting/laravel-setting",
|
||||
"description": "Persistent settings package for Laravel",
|
||||
"keywords": [
|
||||
"laravel",
|
||||
"persistent",
|
||||
"settings",
|
||||
"config"
|
||||
],
|
||||
"license": "MIT",
|
||||
"authors": [
|
||||
{
|
||||
"name": "Denis Duliçi",
|
||||
"email": "info@akaunting.com",
|
||||
"homepage": "https://akaunting.com",
|
||||
"role": "Developer"
|
||||
}
|
||||
],
|
||||
"require": {
|
||||
"php": ">=5.5.9",
|
||||
"laravel/framework": ">=5.3"
|
||||
},
|
||||
"require-dev": {
|
||||
"phpunit/phpunit": ">=4.8",
|
||||
"mockery/mockery": "0.9.*",
|
||||
"laravel/framework": ">=5.3"
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"Akaunting\\Setting\\": "./src"
|
||||
},
|
||||
"files": [
|
||||
"src/helpers.php"
|
||||
]
|
||||
},
|
||||
"extra": {
|
||||
"laravel": {
|
||||
"providers": [
|
||||
"Akaunting\\Setting\\Provider"
|
||||
],
|
||||
"aliases": {
|
||||
"Setting": "Akaunting\\Setting\\Facade"
|
||||
}
|
||||
}
|
||||
},
|
||||
"minimum-stability": "dev",
|
||||
"prefer-stable": true
|
||||
}
|
||||
18
vendor/akaunting/laravel-setting/phpunit.xml
vendored
Normal file
18
vendor/akaunting/laravel-setting/phpunit.xml
vendored
Normal file
@ -0,0 +1,18 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<phpunit backupGlobals="false"
|
||||
backupStaticAttributes="false"
|
||||
bootstrap="vendor/autoload.php"
|
||||
colors="true"
|
||||
convertErrorsToExceptions="true"
|
||||
convertNoticesToExceptions="true"
|
||||
convertWarningsToExceptions="true"
|
||||
processIsolation="false"
|
||||
stopOnFailure="false"
|
||||
syntaxCheck="false"
|
||||
>
|
||||
<testsuites>
|
||||
<testsuite name="Package Test Suite">
|
||||
<directory suffix=".php">./tests/</directory>
|
||||
</testsuite>
|
||||
</testsuites>
|
||||
</phpunit>
|
||||
132
vendor/akaunting/laravel-setting/src/Config/setting.php
vendored
Normal file
132
vendor/akaunting/laravel-setting/src/Config/setting.php
vendored
Normal file
@ -0,0 +1,132 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Enable / Disable auto save
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Auto-save every time the application shuts down
|
||||
|
|
||||
*/
|
||||
'auto_save' => false,
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Cache
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Options for caching. Set whether to enable cache, its key, time to live
|
||||
| in seconds and whether to auto clear after save.
|
||||
|
|
||||
*/
|
||||
'cache' => [
|
||||
'enabled' => false,
|
||||
'key' => 'setting',
|
||||
'ttl' => 3600,
|
||||
'auto_clear' => true,
|
||||
],
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Setting driver
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Select where to store the settings.
|
||||
|
|
||||
| Supported: "database", "json", "memory"
|
||||
|
|
||||
*/
|
||||
'driver' => 'database',
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Database driver
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Options for database driver. Enter which connection to use, null means
|
||||
| the default connection. Set the table and column names.
|
||||
|
|
||||
*/
|
||||
'database' => [
|
||||
'connection' => null,
|
||||
'table' => 'settings',
|
||||
'key' => 'key',
|
||||
'value' => 'value',
|
||||
],
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| JSON driver
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Options for json driver. Enter the full path to the .json file.
|
||||
|
|
||||
*/
|
||||
'json' => [
|
||||
'path' => storage_path() . '/settings.json',
|
||||
],
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Override application config values
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| If defined, settings package will override these config values.
|
||||
|
|
||||
| Sample:
|
||||
| "app.locale" => "settings.locale",
|
||||
|
|
||||
*/
|
||||
'override' => [
|
||||
|
||||
],
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Fallback
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Define fallback settings to be used in case the default is null
|
||||
|
|
||||
| Sample:
|
||||
| "currency" => "USD",
|
||||
|
|
||||
*/
|
||||
'fallback' => [
|
||||
|
||||
],
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Required Extra Columns
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| The list of columns required to be set up
|
||||
|
|
||||
| Sample:
|
||||
| "user_id",
|
||||
| "tenant_id",
|
||||
|
|
||||
*/
|
||||
'required_extra_columns' => [
|
||||
|
||||
],
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Encryption
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Define the keys which should be crypt automatically.
|
||||
|
|
||||
| Sample:
|
||||
| "payment.key"
|
||||
|
|
||||
*/
|
||||
'encrypted_keys' => [
|
||||
|
||||
],
|
||||
|
||||
];
|
||||
321
vendor/akaunting/laravel-setting/src/Contracts/Driver.php
vendored
Normal file
321
vendor/akaunting/laravel-setting/src/Contracts/Driver.php
vendored
Normal file
@ -0,0 +1,321 @@
|
||||
<?php
|
||||
|
||||
namespace Akaunting\Setting\Contracts;
|
||||
|
||||
use Akaunting\Setting\Support\Arr;
|
||||
use Illuminate\Support\Facades\Cache;
|
||||
|
||||
abstract class Driver
|
||||
{
|
||||
/**
|
||||
* The settings data.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $data = [];
|
||||
|
||||
/**
|
||||
* Whether the store has changed since it was last loaded.
|
||||
*
|
||||
* @var bool
|
||||
*/
|
||||
protected $unsaved = false;
|
||||
|
||||
/**
|
||||
* Whether the settings data are loaded.
|
||||
*
|
||||
* @var bool
|
||||
*/
|
||||
protected $loaded = false;
|
||||
|
||||
/**
|
||||
* Include and merge with fallbacks
|
||||
*
|
||||
* @var bool
|
||||
*/
|
||||
protected $with_fallback = true;
|
||||
|
||||
/**
|
||||
* Excludes fallback data
|
||||
*/
|
||||
public function withoutFallback()
|
||||
{
|
||||
$this->with_fallback = false;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a specific key from the settings data.
|
||||
*
|
||||
* @param string|array $key
|
||||
* @param mixed $default Optional default value.
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
public function get($key, $default = null)
|
||||
{
|
||||
if (!$this->checkExtraColumns()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$this->load();
|
||||
|
||||
return Arr::get($this->data, $key, $default);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the fallback value if default is null.
|
||||
*
|
||||
* @param string|array $key
|
||||
* @param mixed $default
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
public function getFallback($key, $default = null)
|
||||
{
|
||||
if (($default !== null) || is_array($key)) {
|
||||
return $default;
|
||||
}
|
||||
|
||||
return Arr::get((array) config('setting.fallback'), $key);
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if the given value is same as fallback.
|
||||
*
|
||||
* @param string $key
|
||||
* @param string $value
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function isEqualToFallback($key, $value)
|
||||
{
|
||||
return (string) $this->getFallback($key) == (string) $value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine if a key exists in the settings data.
|
||||
*
|
||||
* @param string $key
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function has($key)
|
||||
{
|
||||
if (!$this->checkExtraColumns()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$this->load();
|
||||
|
||||
return Arr::has($this->data, $key);
|
||||
}
|
||||
|
||||
/**
|
||||
* Set a specific key to a value in the settings data.
|
||||
*
|
||||
* @param string|array $key Key string or associative array of key => value
|
||||
* @param mixed $value Optional only if the first argument is an array
|
||||
*/
|
||||
public function set($key, $value = null)
|
||||
{
|
||||
if (!$this->checkExtraColumns()) {
|
||||
return;
|
||||
}
|
||||
|
||||
$this->load();
|
||||
$this->unsaved = true;
|
||||
|
||||
if (is_array($key)) {
|
||||
foreach ($key as $k => $v) {
|
||||
Arr::set($this->data, $k, $v);
|
||||
}
|
||||
} else {
|
||||
Arr::set($this->data, $key, $value);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Unset a key in the settings data.
|
||||
*
|
||||
* @param string $key
|
||||
*/
|
||||
public function forget($key)
|
||||
{
|
||||
if (!$this->checkExtraColumns()) {
|
||||
return;
|
||||
}
|
||||
|
||||
$this->unsaved = true;
|
||||
|
||||
if ($this->has($key)) {
|
||||
Arr::forget($this->data, $key);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Unset all keys in the settings data.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function forgetAll()
|
||||
{
|
||||
if (!$this->checkExtraColumns()) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (config('setting.cache.enabled')) {
|
||||
Cache::forget($this->getCacheKey());
|
||||
}
|
||||
|
||||
$this->unsaved = true;
|
||||
$this->data = [];
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all settings data.
|
||||
*
|
||||
* @return array|bool
|
||||
*/
|
||||
public function all()
|
||||
{
|
||||
if (!$this->checkExtraColumns()) {
|
||||
return [];
|
||||
}
|
||||
|
||||
$this->load();
|
||||
|
||||
return $this->data;
|
||||
}
|
||||
|
||||
/**
|
||||
* Save any changes done to the settings data.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function save()
|
||||
{
|
||||
if (!$this->checkExtraColumns()) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!$this->unsaved) {
|
||||
// either nothing has been changed, or data has not been loaded, so
|
||||
// do nothing by returning early
|
||||
return;
|
||||
}
|
||||
|
||||
if (config('setting.cache.enabled') && config('setting.cache.auto_clear')) {
|
||||
Cache::forget($this->getCacheKey());
|
||||
}
|
||||
|
||||
$this->write($this->data);
|
||||
$this->unsaved = false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Make sure data is loaded.
|
||||
*
|
||||
* @param $force Force a reload of data. Default false.
|
||||
*/
|
||||
public function load($force = false)
|
||||
{
|
||||
if (!$this->checkExtraColumns()) {
|
||||
return;
|
||||
}
|
||||
|
||||
if ($this->loaded && !$force) {
|
||||
return;
|
||||
}
|
||||
|
||||
$fallback_data = $this->with_fallback ? config('setting.fallback') : [];
|
||||
$driver_data = $this->readData();
|
||||
|
||||
$this->data = Arr::merge((array) $fallback_data, (array) $driver_data);
|
||||
$this->loaded = true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Read data from driver or cache
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function readData()
|
||||
{
|
||||
if (config('setting.cache.enabled')) {
|
||||
return $this->readDataFromCache();
|
||||
}
|
||||
|
||||
return $this->read();
|
||||
}
|
||||
|
||||
/**
|
||||
* Read data from cache
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function readDataFromCache()
|
||||
{
|
||||
return Cache::remember($this->getCacheKey(), config('setting.cache.ttl'), function () {
|
||||
return $this->read();
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if extra columns are set up.
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
public function checkExtraColumns()
|
||||
{
|
||||
if (!$required_extra_columns = config('setting.required_extra_columns')) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (array_keys_exists($required_extra_columns, $this->getExtraColumns())) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get cache key based on extra columns.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getCacheKey()
|
||||
{
|
||||
$key = config('setting.cache.key');
|
||||
|
||||
foreach ($this->getExtraColumns() as $name => $value) {
|
||||
$key .= '_' . $name . '_' . $value;
|
||||
}
|
||||
|
||||
return $key;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get extra columns added to the rows.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
abstract protected function getExtraColumns();
|
||||
|
||||
/**
|
||||
* Read data from driver.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
abstract protected function read();
|
||||
|
||||
/**
|
||||
* Write data to driver.
|
||||
*
|
||||
* @param array $data
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
abstract protected function write(array $data);
|
||||
}
|
||||
372
vendor/akaunting/laravel-setting/src/Drivers/Database.php
vendored
Normal file
372
vendor/akaunting/laravel-setting/src/Drivers/Database.php
vendored
Normal file
@ -0,0 +1,372 @@
|
||||
<?php
|
||||
|
||||
namespace Akaunting\Setting\Drivers;
|
||||
|
||||
use Akaunting\Setting\Contracts\Driver;
|
||||
use Akaunting\Setting\Support\Arr;
|
||||
use Closure;
|
||||
use Illuminate\Database\Connection;
|
||||
use Illuminate\Support\Arr as LaravelArr;
|
||||
use Illuminate\Support\Facades\Crypt;
|
||||
|
||||
class Database extends Driver
|
||||
{
|
||||
/**
|
||||
* The database connection instance.
|
||||
*
|
||||
* @var \Illuminate\Database\Connection
|
||||
*/
|
||||
protected $connection;
|
||||
|
||||
/**
|
||||
* The table to query from.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $table;
|
||||
|
||||
/**
|
||||
* The key column name to query from.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $key;
|
||||
|
||||
/**
|
||||
* The value column name to query from.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $value;
|
||||
|
||||
/**
|
||||
* Keys which should be encrypt automatically.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $encrypted_keys;
|
||||
|
||||
/**
|
||||
* Any query constraints that should be applied.
|
||||
*
|
||||
* @var Closure|null
|
||||
*/
|
||||
protected $query_constraint;
|
||||
|
||||
/**
|
||||
* Any extra columns that should be added to the rows.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $extra_columns = [];
|
||||
|
||||
/**
|
||||
* @param \Illuminate\Database\Connection $connection
|
||||
* @param string $table
|
||||
*/
|
||||
public function __construct(Connection $connection, $table = null, $key = null, $value = null, $encrypted_keys = [])
|
||||
{
|
||||
$this->connection = $connection;
|
||||
$this->table = $table ?: 'settings';
|
||||
$this->key = $key ?: 'key';
|
||||
$this->value = $value ?: 'value';
|
||||
$this->encrypted_keys = $encrypted_keys ?: [];
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the table to query from.
|
||||
*
|
||||
* @param string $table
|
||||
*/
|
||||
public function setTable($table)
|
||||
{
|
||||
$this->table = $table;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the key column name to query from.
|
||||
*
|
||||
* @param string $key
|
||||
*/
|
||||
public function setKey($key)
|
||||
{
|
||||
$this->key = $key;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the value column name to query from.
|
||||
*
|
||||
* @param string $value
|
||||
*/
|
||||
public function setValue($value)
|
||||
{
|
||||
$this->value = $value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the query constraint.
|
||||
*
|
||||
* @param Closure $callback
|
||||
*/
|
||||
public function setConstraint(Closure $callback)
|
||||
{
|
||||
$this->data = [];
|
||||
$this->loaded = false;
|
||||
$this->query_constraint = $callback;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set extra columns to be added to the rows.
|
||||
*
|
||||
* @param array $columns
|
||||
*/
|
||||
public function setExtraColumns(array $columns)
|
||||
{
|
||||
$this->extra_columns = $columns;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get extra columns added to the rows.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function getExtraColumns()
|
||||
{
|
||||
return $this->extra_columns;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function forget($key)
|
||||
{
|
||||
parent::forget($key);
|
||||
|
||||
// because the database driver cannot store empty arrays, remove empty
|
||||
// arrays to keep data consistent before and after saving
|
||||
$segments = explode('.', $key);
|
||||
array_pop($segments);
|
||||
|
||||
while ($segments) {
|
||||
$segment = implode('.', $segments);
|
||||
|
||||
// non-empty array - exit out of the loop
|
||||
if ($this->get($segment)) {
|
||||
break;
|
||||
}
|
||||
|
||||
// remove the empty array and move on to the next segment
|
||||
$this->forget($segment);
|
||||
array_pop($segments);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
protected function write(array $data)
|
||||
{
|
||||
// Get current data
|
||||
$db_data = $this->newQuery()->get([$this->key, $this->value])->toArray();
|
||||
|
||||
$insert_data = LaravelArr::dot($data);
|
||||
$update_data = [];
|
||||
$delete_keys = [];
|
||||
|
||||
foreach ($db_data as $db_row) {
|
||||
$key = $db_row->{$this->key};
|
||||
$value = $db_row->{$this->value};
|
||||
|
||||
$is_in_insert = $is_different_in_db = $is_same_as_fallback = false;
|
||||
|
||||
if (isset($insert_data[$key])) {
|
||||
$is_in_insert = true;
|
||||
$is_different_in_db = (string) $insert_data[$key] != (string) $value;
|
||||
$is_same_as_fallback = $this->isEqualToFallback($key, $insert_data[$key]);
|
||||
}
|
||||
|
||||
if ($is_in_insert) {
|
||||
if ($is_same_as_fallback) {
|
||||
// Delete if new data is same as fallback
|
||||
$delete_keys[] = $key;
|
||||
} elseif ($is_different_in_db) {
|
||||
// Update if new data is different from db
|
||||
$update_data[$key] = $insert_data[$key];
|
||||
}
|
||||
} else {
|
||||
// Delete if current db not available in new data
|
||||
$delete_keys[] = $key;
|
||||
}
|
||||
|
||||
unset($insert_data[$key]);
|
||||
}
|
||||
|
||||
foreach ($update_data as $key => $value) {
|
||||
$value = $this->prepareValue($key, $value);
|
||||
|
||||
$this->newQuery()
|
||||
->where($this->key, '=', $key)
|
||||
->update([$this->value => $value]);
|
||||
}
|
||||
|
||||
if ($insert_data) {
|
||||
$this->newQuery(true)
|
||||
->insert($this->prepareInsertData($insert_data));
|
||||
}
|
||||
|
||||
if ($delete_keys) {
|
||||
$this->newQuery()
|
||||
->whereIn($this->key, $delete_keys)
|
||||
->delete();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Transforms settings data into an array ready to be insterted into the
|
||||
* database. Call array_dot on a multidimensional array before passing it
|
||||
* into this method!
|
||||
*
|
||||
* @param array $data Call array_dot on a multidimensional array before passing it into this method!
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
protected function prepareInsertData(array $data)
|
||||
{
|
||||
$db_data = [];
|
||||
|
||||
if ($this->getExtraColumns()) {
|
||||
foreach ($data as $key => $value) {
|
||||
$value = $this->prepareValue($key, $value);
|
||||
|
||||
// Don't insert if same as fallback
|
||||
if ($this->isEqualToFallback($key, $value)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$db_data[] = array_merge(
|
||||
$this->getExtraColumns(),
|
||||
[$this->key => $key, $this->value => $value]
|
||||
);
|
||||
}
|
||||
} else {
|
||||
foreach ($data as $key => $value) {
|
||||
$value = $this->prepareValue($key, $value);
|
||||
|
||||
// Don't insert if same as fallback
|
||||
if ($this->isEqualToFallback($key, $value)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$db_data[] = [$this->key => $key, $this->value => $value];
|
||||
}
|
||||
}
|
||||
|
||||
return $db_data;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if the provided key should be encrypted or not.
|
||||
* Also type casts the given value to a string so errors with booleans or integers are handeled.
|
||||
* Otherwise it returns the original value.
|
||||
*
|
||||
* @param string $key Key to check if it's inside the encryptedValues variable.
|
||||
* @param mixed $value Info: Encryption only supports strings.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function prepareValue(string $key, $value)
|
||||
{
|
||||
// Check if key should be encrypted
|
||||
if (in_array($key, $this->encrypted_keys)) {
|
||||
// Cast to string to avoid error when a user passes a boolean value
|
||||
return Crypt::encryptString((string) $value);
|
||||
}
|
||||
|
||||
return $value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if the provided key should be decrypted or not.
|
||||
* Otherwise it returns the original value.
|
||||
*
|
||||
* @param string $key Key to check if it's inside the encryptedValues variable.
|
||||
* @param mixed $value Info: Encryption only supports strings.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function unpackValue(string $key, $value)
|
||||
{
|
||||
// Check if key should be encrypted
|
||||
if (in_array($key, $this->encrypted_keys)) {
|
||||
// Cast to string to avoid error when a user passes a boolean value
|
||||
return Crypt::decryptString((string) $value);
|
||||
}
|
||||
|
||||
return $value;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
protected function read()
|
||||
{
|
||||
return $this->parseReadData($this->newQuery()->get());
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse data coming from the database.
|
||||
*
|
||||
* @param array $data
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function parseReadData($data)
|
||||
{
|
||||
$results = [];
|
||||
|
||||
foreach ($data as $row) {
|
||||
if (is_array($row)) {
|
||||
$key = $row[$this->key];
|
||||
$value = $row[$this->value];
|
||||
} elseif (is_object($row)) {
|
||||
$key = $row->{$this->key};
|
||||
$value = $row->{$this->value};
|
||||
} else {
|
||||
$msg = 'Expected array or object, got ' . gettype($row);
|
||||
throw new \UnexpectedValueException($msg);
|
||||
}
|
||||
|
||||
// Encryption
|
||||
$value = $this->unpackValue($key, $value);
|
||||
|
||||
Arr::set($results, $key, $value);
|
||||
}
|
||||
|
||||
return $results;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new query builder instance.
|
||||
*
|
||||
* @param bool $insert
|
||||
*
|
||||
* @return \Illuminate\Database\Query\Builder
|
||||
*/
|
||||
protected function newQuery($insert = false)
|
||||
{
|
||||
$query = $this->connection->table($this->table);
|
||||
|
||||
if (!$insert) {
|
||||
foreach ($this->getExtraColumns() as $key => $value) {
|
||||
$query->where($key, '=', $value);
|
||||
}
|
||||
}
|
||||
|
||||
if ($this->query_constraint !== null) {
|
||||
$callback = $this->query_constraint;
|
||||
$callback($query, $insert);
|
||||
}
|
||||
|
||||
return $query;
|
||||
}
|
||||
}
|
||||
80
vendor/akaunting/laravel-setting/src/Drivers/Json.php
vendored
Normal file
80
vendor/akaunting/laravel-setting/src/Drivers/Json.php
vendored
Normal file
@ -0,0 +1,80 @@
|
||||
<?php
|
||||
|
||||
namespace Akaunting\Setting\Drivers;
|
||||
|
||||
use Akaunting\Setting\Contracts\Driver;
|
||||
use Illuminate\Filesystem\Filesystem;
|
||||
|
||||
class Json extends Driver
|
||||
{
|
||||
/**
|
||||
* @param \Illuminate\Filesystem\Filesystem $files
|
||||
* @param string $path
|
||||
*/
|
||||
public function __construct(Filesystem $files, $path = null)
|
||||
{
|
||||
$this->files = $files;
|
||||
|
||||
$this->setPath($path ?: storage_path() . '/settings.json');
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the path for the JSON file.
|
||||
*
|
||||
* @param string $path
|
||||
*/
|
||||
public function setPath($path)
|
||||
{
|
||||
// If the file does not already exist, we will attempt to create it.
|
||||
if (!$this->files->exists($path)) {
|
||||
$result = $this->files->put($path, '{}');
|
||||
if ($result === false) {
|
||||
throw new \InvalidArgumentException("Could not write to $path.");
|
||||
}
|
||||
}
|
||||
|
||||
if (!$this->files->isWritable($path)) {
|
||||
throw new \InvalidArgumentException("$path is not writable.");
|
||||
}
|
||||
|
||||
$this->path = $path;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
protected function getExtraColumns()
|
||||
{
|
||||
return [];
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
protected function read()
|
||||
{
|
||||
$contents = $this->files->get($this->path);
|
||||
|
||||
$data = json_decode($contents, true);
|
||||
|
||||
if ($data === null) {
|
||||
throw new \RuntimeException("Invalid JSON in {$this->path}");
|
||||
}
|
||||
|
||||
return $data;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
protected function write(array $data)
|
||||
{
|
||||
if ($data) {
|
||||
$contents = json_encode($data);
|
||||
} else {
|
||||
$contents = '{}';
|
||||
}
|
||||
|
||||
$this->files->put($this->path, $contents);
|
||||
}
|
||||
}
|
||||
42
vendor/akaunting/laravel-setting/src/Drivers/Memory.php
vendored
Normal file
42
vendor/akaunting/laravel-setting/src/Drivers/Memory.php
vendored
Normal file
@ -0,0 +1,42 @@
|
||||
<?php
|
||||
|
||||
namespace Akaunting\Setting\Drivers;
|
||||
|
||||
use Akaunting\Setting\Contracts\Driver;
|
||||
|
||||
class Memory extends Driver
|
||||
{
|
||||
/**
|
||||
* @param array $data
|
||||
*/
|
||||
public function __construct(array $data = null)
|
||||
{
|
||||
if ($data) {
|
||||
$this->data = $data;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
protected function getExtraColumns()
|
||||
{
|
||||
return [];
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
protected function read()
|
||||
{
|
||||
return $this->data;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
protected function write(array $data)
|
||||
{
|
||||
// do nothing
|
||||
}
|
||||
}
|
||||
16
vendor/akaunting/laravel-setting/src/Facade.php
vendored
Normal file
16
vendor/akaunting/laravel-setting/src/Facade.php
vendored
Normal file
@ -0,0 +1,16 @@
|
||||
<?php
|
||||
|
||||
namespace Akaunting\Setting;
|
||||
|
||||
use Illuminate\Support\Facades\Facade as BaseFacade;
|
||||
|
||||
class Facade extends BaseFacade
|
||||
{
|
||||
/**
|
||||
* Get the registered name of the component.
|
||||
*/
|
||||
public static function getFacadeAccessor()
|
||||
{
|
||||
return 'setting';
|
||||
}
|
||||
}
|
||||
63
vendor/akaunting/laravel-setting/src/Manager.php
vendored
Normal file
63
vendor/akaunting/laravel-setting/src/Manager.php
vendored
Normal file
@ -0,0 +1,63 @@
|
||||
<?php
|
||||
|
||||
namespace Akaunting\Setting;
|
||||
|
||||
use Akaunting\Setting\Drivers\Database;
|
||||
use Akaunting\Setting\Drivers\Json;
|
||||
use Akaunting\Setting\Drivers\Memory;
|
||||
use Illuminate\Support\Manager as BaseManager;
|
||||
|
||||
class Manager extends BaseManager
|
||||
{
|
||||
/**
|
||||
* The container instance.
|
||||
*
|
||||
* @var \Illuminate\Contracts\Container\Container
|
||||
*/
|
||||
protected $container;
|
||||
|
||||
/**
|
||||
* The application instance.
|
||||
*
|
||||
* @param \Illuminate\Contracts\Foundation\Application $app
|
||||
*/
|
||||
public function __construct($app = null)
|
||||
{
|
||||
$this->container = $app ?? app();
|
||||
|
||||
parent::__construct($this->container);
|
||||
}
|
||||
|
||||
public function getDefaultDriver()
|
||||
{
|
||||
return config('setting.driver');
|
||||
}
|
||||
|
||||
public function createJsonDriver()
|
||||
{
|
||||
$path = config('setting.json.path');
|
||||
|
||||
return new Json($this->container['files'], $path);
|
||||
}
|
||||
|
||||
public function createDatabaseDriver()
|
||||
{
|
||||
$connection = $this->container['db']->connection(config('setting.database.connection'));
|
||||
$table = config('setting.database.table');
|
||||
$key = config('setting.database.key');
|
||||
$value = config('setting.database.value');
|
||||
$encryptedKeys = config('setting.encrypted_keys');
|
||||
|
||||
return new Database($connection, $table, $key, $value, $encryptedKeys);
|
||||
}
|
||||
|
||||
public function createMemoryDriver()
|
||||
{
|
||||
return new Memory();
|
||||
}
|
||||
|
||||
public function createArrayDriver()
|
||||
{
|
||||
return $this->createMemoryDriver();
|
||||
}
|
||||
}
|
||||
33
vendor/akaunting/laravel-setting/src/Middleware/AutoSaveSetting.php
vendored
Normal file
33
vendor/akaunting/laravel-setting/src/Middleware/AutoSaveSetting.php
vendored
Normal file
@ -0,0 +1,33 @@
|
||||
<?php
|
||||
|
||||
namespace Akaunting\Setting\Middleware;
|
||||
|
||||
use Closure;
|
||||
|
||||
class AutoSaveSetting
|
||||
{
|
||||
/**
|
||||
* Create a new save settings middleware.
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
$this->setting = app('setting');
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle an incoming request.
|
||||
*
|
||||
* @param \Illuminate\Http\Request $request
|
||||
* @param \Closure $next
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
public function handle($request, Closure $next)
|
||||
{
|
||||
$response = $next($request);
|
||||
|
||||
$this->setting->save();
|
||||
|
||||
return $response;
|
||||
}
|
||||
}
|
||||
41
vendor/akaunting/laravel-setting/src/Migrations/2017_08_24_000000_create_settings_table.php
vendored
Normal file
41
vendor/akaunting/laravel-setting/src/Migrations/2017_08_24_000000_create_settings_table.php
vendored
Normal file
@ -0,0 +1,41 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
|
||||
class CreateSettingsTable extends Migration
|
||||
{
|
||||
/**
|
||||
* Set up the options.
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
$this->table = config('setting.database.table');
|
||||
$this->key = config('setting.database.key');
|
||||
$this->value = config('setting.database.value');
|
||||
}
|
||||
|
||||
/**
|
||||
* Run the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function up()
|
||||
{
|
||||
Schema::create($this->table, function (Blueprint $table) {
|
||||
$table->increments('id');
|
||||
$table->string($this->key)->index();
|
||||
$table->text($this->value);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function down()
|
||||
{
|
||||
Schema::drop($this->table);
|
||||
}
|
||||
}
|
||||
74
vendor/akaunting/laravel-setting/src/Provider.php
vendored
Normal file
74
vendor/akaunting/laravel-setting/src/Provider.php
vendored
Normal file
@ -0,0 +1,74 @@
|
||||
<?php
|
||||
|
||||
namespace Akaunting\Setting;
|
||||
|
||||
use Akaunting\Setting\Middleware\AutoSaveSetting;
|
||||
use Illuminate\Support\ServiceProvider;
|
||||
use Illuminate\Support\Arr;
|
||||
use Illuminate\View\Compilers\BladeCompiler;
|
||||
|
||||
class Provider extends ServiceProvider
|
||||
{
|
||||
/**
|
||||
* Bootstrap the application services.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function boot()
|
||||
{
|
||||
$this->publishes([
|
||||
__DIR__ . '/Config/setting.php' => config_path('setting.php'),
|
||||
__DIR__ . '/Migrations/2017_08_24_000000_create_settings_table.php' => database_path('migrations/2017_08_24_000000_create_settings_table.php'),
|
||||
], 'setting');
|
||||
|
||||
// Auto save setting
|
||||
if (config('setting.auto_save')) {
|
||||
$kernel = $this->app['Illuminate\Contracts\Http\Kernel'];
|
||||
$kernel->pushMiddleware(AutoSaveSetting::class);
|
||||
}
|
||||
|
||||
$this->override();
|
||||
|
||||
// Register blade directive
|
||||
$this->callAfterResolving('blade.compiler', function (BladeCompiler $compiler) {
|
||||
$compiler->directive('setting', function ($expression) {
|
||||
return "<?php echo setting($expression); ?>";
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Register the application services.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function register()
|
||||
{
|
||||
$this->app->singleton('setting.manager', function ($app) {
|
||||
return new Manager($app);
|
||||
});
|
||||
|
||||
$this->app->singleton('setting', function ($app) {
|
||||
return $app['setting.manager']->driver();
|
||||
});
|
||||
|
||||
$this->mergeConfigFrom(__DIR__ . '/Config/setting.php', 'setting');
|
||||
}
|
||||
|
||||
private function override()
|
||||
{
|
||||
$override = config('setting.override', []);
|
||||
|
||||
foreach (Arr::dot($override) as $config_key => $setting_key) {
|
||||
$config_key = is_string($config_key) ? $config_key : $setting_key;
|
||||
|
||||
try {
|
||||
if (! is_null($value = setting($setting_key))) {
|
||||
config([$config_key => $value]);
|
||||
}
|
||||
} catch (\Exception $e) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
164
vendor/akaunting/laravel-setting/src/Support/Arr.php
vendored
Normal file
164
vendor/akaunting/laravel-setting/src/Support/Arr.php
vendored
Normal file
@ -0,0 +1,164 @@
|
||||
<?php
|
||||
|
||||
namespace Akaunting\Setting\Support;
|
||||
|
||||
class Arr
|
||||
{
|
||||
/**
|
||||
* This class is a static class and should not be instantiated.
|
||||
*/
|
||||
private function __construct()
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Get an element from an array.
|
||||
*
|
||||
* @param array $data
|
||||
* @param string $key Specify a nested element by separating keys with full stops.
|
||||
* @param mixed $default If the element is not found, return this.
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
public static function get(array $data, $key, $default = null)
|
||||
{
|
||||
if ($key === null) {
|
||||
return $data;
|
||||
}
|
||||
|
||||
if (is_array($key)) {
|
||||
return static::getArray($data, $key, $default);
|
||||
}
|
||||
|
||||
foreach (explode('.', $key) as $segment) {
|
||||
if (!is_array($data)) {
|
||||
return $default;
|
||||
}
|
||||
|
||||
if (!array_key_exists($segment, $data)) {
|
||||
return $default;
|
||||
}
|
||||
|
||||
$data = $data[$segment];
|
||||
}
|
||||
|
||||
return $data;
|
||||
}
|
||||
|
||||
protected static function getArray(array $input, $keys, $default = null)
|
||||
{
|
||||
$output = [];
|
||||
|
||||
foreach ($keys as $key) {
|
||||
static::set($output, $key, static::get($input, $key, $default));
|
||||
}
|
||||
|
||||
return $output;
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine if an array has a given key.
|
||||
*
|
||||
* @param array $data
|
||||
* @param string $key
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public static function has(array $data, $key)
|
||||
{
|
||||
foreach (explode('.', $key) as $segment) {
|
||||
if (!is_array($data)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!array_key_exists($segment, $data)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$data = $data[$segment];
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set an element of an array.
|
||||
*
|
||||
* @param array $data
|
||||
* @param string $key Specify a nested element by separating keys with full stops.
|
||||
* @param mixed $value
|
||||
*/
|
||||
public static function set(array &$data, $key, $value)
|
||||
{
|
||||
$segments = explode('.', $key);
|
||||
|
||||
$key = array_pop($segments);
|
||||
|
||||
// iterate through all of $segments except the last one
|
||||
foreach ($segments as $segment) {
|
||||
if (!array_key_exists($segment, $data)) {
|
||||
$data[$segment] = array();
|
||||
} elseif (!is_array($data[$segment])) {
|
||||
throw new \UnexpectedValueException('Non-array segment encountered');
|
||||
}
|
||||
|
||||
$data = &$data[$segment];
|
||||
}
|
||||
|
||||
$data[$key] = $value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Unset an element from an array.
|
||||
*
|
||||
* @param array &$data
|
||||
* @param string $key Specify a nested element by separating keys with full stops.
|
||||
*/
|
||||
public static function forget(array &$data, $key)
|
||||
{
|
||||
$segments = explode('.', $key);
|
||||
|
||||
$key = array_pop($segments);
|
||||
|
||||
// iterate through all of $segments except the last one
|
||||
foreach ($segments as $segment) {
|
||||
if (!array_key_exists($segment, $data)) {
|
||||
return;
|
||||
} elseif (!is_array($data[$segment])) {
|
||||
throw new \UnexpectedValueException('Non-array segment encountered');
|
||||
}
|
||||
|
||||
$data = &$data[$segment];
|
||||
}
|
||||
|
||||
unset($data[$key]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Merge two multidimensional arrays recursive
|
||||
*
|
||||
* @param array $array_1
|
||||
* @param array $array_2
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public static function merge(array $array_1, array $array_2)
|
||||
{
|
||||
$merged = $array_1;
|
||||
|
||||
foreach ($array_2 as $key => $value) {
|
||||
if (is_array($value) && isset($merged[$key]) && is_array($merged[$key])) {
|
||||
$merged[$key] = static::merge($merged[$key], $value);
|
||||
} elseif (is_numeric($key)) {
|
||||
if (!in_array($value, $merged)) {
|
||||
$merged[] = $value;
|
||||
}
|
||||
} else {
|
||||
$merged[$key] = $value;
|
||||
}
|
||||
}
|
||||
|
||||
return $merged;
|
||||
}
|
||||
}
|
||||
45
vendor/akaunting/laravel-setting/src/helpers.php
vendored
Normal file
45
vendor/akaunting/laravel-setting/src/helpers.php
vendored
Normal file
@ -0,0 +1,45 @@
|
||||
<?php
|
||||
|
||||
if (!function_exists('array_keys_exists')) {
|
||||
/**
|
||||
* Easily check if multiple array keys exist.
|
||||
*
|
||||
* @param array $keys
|
||||
* @param array $arr
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
function array_keys_exists(array $keys, array $arr)
|
||||
{
|
||||
return !array_diff_key(array_flip($keys), $arr);
|
||||
}
|
||||
}
|
||||
|
||||
if (!function_exists('setting')) {
|
||||
/**
|
||||
* Get / set the specified setting value.
|
||||
*
|
||||
* If an array is passed as the key, we will assume you want to set an array of values.
|
||||
*
|
||||
* @param array|string $key
|
||||
* @param mixed $default
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
function setting($key = null, $default = null)
|
||||
{
|
||||
$setting = app('setting');
|
||||
|
||||
if (is_null($key)) {
|
||||
return $setting;
|
||||
}
|
||||
|
||||
if (is_array($key)) {
|
||||
$setting->set($key);
|
||||
|
||||
return $setting;
|
||||
}
|
||||
|
||||
return $setting->get($key, $default);
|
||||
}
|
||||
}
|
||||
118
vendor/akaunting/laravel-setting/tests/functional/AbstractFunctionalTest.php
vendored
Normal file
118
vendor/akaunting/laravel-setting/tests/functional/AbstractFunctionalTest.php
vendored
Normal file
@ -0,0 +1,118 @@
|
||||
<?php
|
||||
|
||||
use Akaunting\Setting\Drivers\Database;
|
||||
|
||||
abstract class AbstractFunctionalTest extends PHPUnit_Framework_TestCase
|
||||
{
|
||||
abstract protected function createStore(array $data = []);
|
||||
|
||||
protected function assertStoreEquals($store, $expected, $message = null)
|
||||
{
|
||||
$this->assertEquals($expected, $store->all(), $message);
|
||||
$store->save();
|
||||
$store = $this->createStore();
|
||||
$this->assertEquals($expected, $store->all(), $message);
|
||||
}
|
||||
|
||||
protected function assertStoreKeyEquals($store, $key, $expected, $message = null)
|
||||
{
|
||||
$this->assertEquals($expected, $store->get($key), $message);
|
||||
$store->save();
|
||||
$store = $this->createStore();
|
||||
$this->assertEquals($expected, $store->get($key), $message);
|
||||
}
|
||||
|
||||
/** @test */
|
||||
public function store_is_initially_empty()
|
||||
{
|
||||
$store = $this->createStore();
|
||||
$this->assertEquals([], $store->all());
|
||||
}
|
||||
|
||||
/** @test */
|
||||
public function written_changes_are_saved()
|
||||
{
|
||||
$store = $this->createStore();
|
||||
$store->set('foo', 'bar');
|
||||
$this->assertStoreKeyEquals($store, 'foo', 'bar');
|
||||
}
|
||||
|
||||
/** @test */
|
||||
public function nested_keys_are_nested()
|
||||
{
|
||||
$store = $this->createStore();
|
||||
$store->set('foo.bar', 'baz');
|
||||
$this->assertStoreEquals($store, ['foo' => ['bar' => 'baz']]);
|
||||
}
|
||||
|
||||
/** @test */
|
||||
public function cannot_set_nested_key_on_non_array_member()
|
||||
{
|
||||
$store = $this->createStore();
|
||||
$store->set('foo', 'bar');
|
||||
$this->setExpectedException('UnexpectedValueException', 'Non-array segment encountered');
|
||||
$store->set('foo.bar', 'baz');
|
||||
}
|
||||
|
||||
/** @test */
|
||||
public function can_forget_key()
|
||||
{
|
||||
$store = $this->createStore();
|
||||
$store->set('foo', 'bar');
|
||||
$store->set('bar', 'baz');
|
||||
$this->assertStoreEquals($store, ['foo' => 'bar', 'bar' => 'baz']);
|
||||
|
||||
$store->forget('foo');
|
||||
$this->assertStoreEquals($store, ['bar' => 'baz']);
|
||||
}
|
||||
|
||||
/** @test */
|
||||
public function can_forget_nested_key()
|
||||
{
|
||||
$store = $this->createStore();
|
||||
$store->set('foo.bar', 'baz');
|
||||
$store->set('foo.baz', 'bar');
|
||||
$store->set('bar.foo', 'baz');
|
||||
$this->assertStoreEquals($store, [
|
||||
'foo' => [
|
||||
'bar' => 'baz',
|
||||
'baz' => 'bar',
|
||||
],
|
||||
'bar' => [
|
||||
'foo' => 'baz',
|
||||
],
|
||||
]);
|
||||
|
||||
$store->forget('foo.bar');
|
||||
$this->assertStoreEquals($store, [
|
||||
'foo' => [
|
||||
'baz' => 'bar',
|
||||
],
|
||||
'bar' => [
|
||||
'foo' => 'baz',
|
||||
],
|
||||
]);
|
||||
|
||||
$store->forget('bar.foo');
|
||||
$expected = [
|
||||
'foo' => [
|
||||
'baz' => 'bar',
|
||||
],
|
||||
'bar' => [
|
||||
],
|
||||
];
|
||||
if ($store instanceof Database) {
|
||||
unset($expected['bar']);
|
||||
}
|
||||
$this->assertStoreEquals($store, $expected);
|
||||
}
|
||||
|
||||
/** @test */
|
||||
public function can_forget_all()
|
||||
{
|
||||
$store = $this->createStore(['foo' => 'bar']);
|
||||
$this->assertStoreEquals($store, ['foo' => 'bar']);
|
||||
$store->forgetAll();
|
||||
$this->assertStoreEquals($store, []);
|
||||
}
|
||||
}
|
||||
43
vendor/akaunting/laravel-setting/tests/functional/DatabaseTest.php
vendored
Normal file
43
vendor/akaunting/laravel-setting/tests/functional/DatabaseTest.php
vendored
Normal file
@ -0,0 +1,43 @@
|
||||
<?php
|
||||
|
||||
class DatabaseTest extends AbstractFunctionalTest
|
||||
{
|
||||
public function setUp()
|
||||
{
|
||||
$this->container = new \Illuminate\Container\Container();
|
||||
$this->capsule = new \Illuminate\Database\Capsule\Manager($this->container);
|
||||
$this->capsule->setAsGlobal();
|
||||
$this->container['db'] = $this->capsule;
|
||||
$this->capsule->addConnection([
|
||||
'driver' => 'sqlite',
|
||||
'database' => ':memory:',
|
||||
'prefix' => '',
|
||||
]);
|
||||
|
||||
$this->capsule->schema()->create('settings', function ($t) {
|
||||
$t->string('key', 64)->unique();
|
||||
$t->string('value', 4096);
|
||||
});
|
||||
}
|
||||
|
||||
public function tearDown()
|
||||
{
|
||||
$this->capsule->schema()->drop('settings');
|
||||
unset($this->capsule);
|
||||
unset($this->container);
|
||||
}
|
||||
|
||||
protected function createStore(array $data = [])
|
||||
{
|
||||
if ($data) {
|
||||
$store = $this->createStore();
|
||||
$store->set($data);
|
||||
$store->save();
|
||||
unset($store);
|
||||
}
|
||||
|
||||
return new \Akaunting\Setting\Drivers\Database(
|
||||
$this->capsule->getConnection()
|
||||
);
|
||||
}
|
||||
}
|
||||
30
vendor/akaunting/laravel-setting/tests/functional/JsonTest.php
vendored
Normal file
30
vendor/akaunting/laravel-setting/tests/functional/JsonTest.php
vendored
Normal file
@ -0,0 +1,30 @@
|
||||
<?php
|
||||
|
||||
class JsonTest extends AbstractFunctionalTest
|
||||
{
|
||||
protected function createStore(array $data = null)
|
||||
{
|
||||
$path = dirname(__DIR__) . '/tmp/store.json';
|
||||
|
||||
if ($data !== null) {
|
||||
if ($data) {
|
||||
$json = json_encode($data);
|
||||
} else {
|
||||
$json = '{}';
|
||||
}
|
||||
|
||||
file_put_contents($path, $json);
|
||||
}
|
||||
|
||||
return new \Akaunting\Setting\Drivers\Json(
|
||||
new \Illuminate\Filesystem\Filesystem(),
|
||||
$path
|
||||
);
|
||||
}
|
||||
|
||||
public function tearDown()
|
||||
{
|
||||
$path = dirname(__DIR__) . '/tmp/store.json';
|
||||
unlink($path);
|
||||
}
|
||||
}
|
||||
21
vendor/akaunting/laravel-setting/tests/functional/MemoryTest.php
vendored
Normal file
21
vendor/akaunting/laravel-setting/tests/functional/MemoryTest.php
vendored
Normal file
@ -0,0 +1,21 @@
|
||||
<?php
|
||||
|
||||
class MemoryTest extends AbstractFunctionalTest
|
||||
{
|
||||
protected function assertStoreEquals($store, $expected, $message = null)
|
||||
{
|
||||
$this->assertEquals($expected, $store->all(), $message);
|
||||
// removed persistance test assertions
|
||||
}
|
||||
|
||||
protected function assertStoreKeyEquals($store, $key, $expected, $message = null)
|
||||
{
|
||||
$this->assertEquals($expected, $store->get($key), $message);
|
||||
// removed persistance test assertions
|
||||
}
|
||||
|
||||
protected function createStore(array $data = null)
|
||||
{
|
||||
return new \Akaunting\Setting\Drivers\Memory($data);
|
||||
}
|
||||
}
|
||||
132
vendor/akaunting/laravel-setting/tests/unit/ArrayUtilTest.php
vendored
Normal file
132
vendor/akaunting/laravel-setting/tests/unit/ArrayUtilTest.php
vendored
Normal file
@ -0,0 +1,132 @@
|
||||
<?php
|
||||
|
||||
use Akaunting\Setting\Support\Arr;
|
||||
|
||||
class ArrayUtilityTest extends PHPUnit_Framework_TestCase
|
||||
{
|
||||
/**
|
||||
* @test
|
||||
* @dataProvider getGetData
|
||||
*/
|
||||
public function getReturnsCorrectValue(array $data, $key, $expected)
|
||||
{
|
||||
$this->assertEquals($expected, Arr::get($data, $key));
|
||||
}
|
||||
|
||||
public function getGetData()
|
||||
{
|
||||
return [
|
||||
[[], 'foo', null],
|
||||
[['foo' => 'bar'], 'foo', 'bar'],
|
||||
[['foo' => 'bar'], 'bar', null],
|
||||
[['foo' => 'bar'], 'foo.bar', null],
|
||||
[['foo' => ['bar' => 'baz']], 'foo.bar', 'baz'],
|
||||
[['foo' => ['bar' => 'baz']], 'foo.baz', null],
|
||||
[['foo' => ['bar' => 'baz']], 'foo', ['bar' => 'baz']],
|
||||
[
|
||||
['foo' => 'bar', 'bar' => 'baz'],
|
||||
['foo', 'bar'],
|
||||
['foo' => 'bar', 'bar' => 'baz'],
|
||||
],
|
||||
[
|
||||
['foo' => ['bar' => 'baz'], 'bar' => 'baz'],
|
||||
['foo.bar', 'bar'],
|
||||
['foo' => ['bar' => 'baz'], 'bar' => 'baz'],
|
||||
],
|
||||
[
|
||||
['foo' => ['bar' => 'baz'], 'bar' => 'baz'],
|
||||
['foo.bar'],
|
||||
['foo' => ['bar' => 'baz']],
|
||||
],
|
||||
[
|
||||
['foo' => ['bar' => 'baz'], 'bar' => 'baz'],
|
||||
['foo.bar', 'baz'],
|
||||
['foo' => ['bar' => 'baz'], 'baz' => null],
|
||||
],
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @dataProvider getSetData
|
||||
*/
|
||||
public function setSetsCorrectKeyToValue(array $input, $key, $value, array $expected)
|
||||
{
|
||||
Arr::set($input, $key, $value);
|
||||
$this->assertEquals($expected, $input);
|
||||
}
|
||||
|
||||
public function getSetData()
|
||||
{
|
||||
return [
|
||||
[
|
||||
['foo' => 'bar'],
|
||||
'foo',
|
||||
'baz',
|
||||
['foo' => 'baz'],
|
||||
],
|
||||
[
|
||||
[],
|
||||
'foo',
|
||||
'bar',
|
||||
['foo' => 'bar'],
|
||||
],
|
||||
[
|
||||
[],
|
||||
'foo.bar',
|
||||
'baz',
|
||||
['foo' => ['bar' => 'baz']],
|
||||
],
|
||||
[
|
||||
['foo' => ['bar' => 'baz']],
|
||||
'foo.baz',
|
||||
'foo',
|
||||
['foo' => ['bar' => 'baz', 'baz' => 'foo']],
|
||||
],
|
||||
[
|
||||
['foo' => ['bar' => 'baz']],
|
||||
'foo.baz.bar',
|
||||
'baz',
|
||||
['foo' => ['bar' => 'baz', 'baz' => ['bar' => 'baz']]],
|
||||
],
|
||||
[
|
||||
[],
|
||||
'foo.bar.baz',
|
||||
'foo',
|
||||
['foo' => ['bar' => ['baz' => 'foo']]],
|
||||
],
|
||||
];
|
||||
}
|
||||
|
||||
/** @test */
|
||||
public function setThrowsExceptionOnNonArraySegment()
|
||||
{
|
||||
$data = ['foo' => 'bar'];
|
||||
$this->setExpectedException('UnexpectedValueException', 'Non-array segment encountered');
|
||||
Arr::set($data, 'foo.bar', 'baz');
|
||||
}
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @dataProvider getHasData
|
||||
*/
|
||||
public function hasReturnsCorrectly(array $input, $key, $expected)
|
||||
{
|
||||
$this->assertEquals($expected, Arr::has($input, $key));
|
||||
}
|
||||
|
||||
public function getHasData()
|
||||
{
|
||||
return [
|
||||
[[], 'foo', false],
|
||||
[['foo' => 'bar'], 'foo', true],
|
||||
[['foo' => 'bar'], 'bar', false],
|
||||
[['foo' => 'bar'], 'foo.bar', false],
|
||||
[['foo' => ['bar' => 'baz']], 'foo.bar', true],
|
||||
[['foo' => ['bar' => 'baz']], 'foo.baz', false],
|
||||
[['foo' => ['bar' => 'baz']], 'foo', true],
|
||||
[['foo' => null], 'foo', true],
|
||||
[['foo' => ['bar' => null]], 'foo.bar', true],
|
||||
];
|
||||
}
|
||||
}
|
||||
107
vendor/akaunting/laravel-setting/tests/unit/DatabaseDriverTest.php
vendored
Normal file
107
vendor/akaunting/laravel-setting/tests/unit/DatabaseDriverTest.php
vendored
Normal file
@ -0,0 +1,107 @@
|
||||
<?php
|
||||
|
||||
use Mockery as m;
|
||||
|
||||
class DatabaseDriverTest extends PHPUnit_Framework_TestCase
|
||||
{
|
||||
public function tearDown()
|
||||
{
|
||||
m::close();
|
||||
}
|
||||
|
||||
/** @test */
|
||||
public function correct_data_is_inserted_and_updated()
|
||||
{
|
||||
$connection = $this->mockConnection();
|
||||
$query = $this->mockQuery($connection);
|
||||
|
||||
$query->shouldReceive('get')->once()->andReturn([
|
||||
['key' => 'nest.one', 'value' => 'old'],
|
||||
]);
|
||||
$query->shouldReceive('lists')->atMost(1)->andReturn(['nest.one']);
|
||||
$query->shouldReceive('pluck')->atMost(1)->andReturn(['nest.one']);
|
||||
$dbData = $this->getDbData();
|
||||
unset($dbData[1]); // remove the nest.one array member
|
||||
$query->shouldReceive('where')->with('key', '=', 'nest.one')->andReturn(m::self())->getMock()
|
||||
->shouldReceive('update')->with(['value' => 'nestone']);
|
||||
$self = $this; // 5.3 compatibility
|
||||
$query->shouldReceive('insert')->once()->andReturnUsing(function ($arg) use ($dbData, $self) {
|
||||
$self->assertEquals(count($dbData), count($arg));
|
||||
foreach ($dbData as $key => $value) {
|
||||
$self->assertContains($value, $arg);
|
||||
}
|
||||
});
|
||||
|
||||
$store = $this->makeStore($connection);
|
||||
$store->set('foo', 'bar');
|
||||
$store->set('nest.one', 'nestone');
|
||||
$store->set('nest.two', 'nesttwo');
|
||||
$store->set('array', ['one', 'two']);
|
||||
$store->save();
|
||||
}
|
||||
|
||||
/** @test */
|
||||
public function extra_columns_are_queried()
|
||||
{
|
||||
$connection = $this->mockConnection();
|
||||
$query = $this->mockQuery($connection);
|
||||
$query->shouldReceive('where')->once()->with('foo', '=', 'bar')
|
||||
->andReturn(m::self())->getMock()
|
||||
->shouldReceive('get')->once()->andReturn([
|
||||
['key' => 'foo', 'value' => 'bar'],
|
||||
]);
|
||||
|
||||
$store = $this->makeStore($connection);
|
||||
$store->setExtraColumns(['foo' => 'bar']);
|
||||
$this->assertEquals('bar', $store->get('foo'));
|
||||
}
|
||||
|
||||
/** @test */
|
||||
public function extra_columns_are_inserted()
|
||||
{
|
||||
$connection = $this->mockConnection();
|
||||
$query = $this->mockQuery($connection);
|
||||
$query->shouldReceive('where')->times(2)->with('extracol', '=', 'extradata')
|
||||
->andReturn(m::self());
|
||||
$query->shouldReceive('get')->once()->andReturn([]);
|
||||
$query->shouldReceive('lists')->atMost(1)->andReturn([]);
|
||||
$query->shouldReceive('pluck')->atMost(1)->andReturn([]);
|
||||
$query->shouldReceive('insert')->once()->with([
|
||||
['key' => 'foo', 'value' => 'bar', 'extracol' => 'extradata'],
|
||||
]);
|
||||
|
||||
$store = $this->makeStore($connection);
|
||||
$store->setExtraColumns(['extracol' => 'extradata']);
|
||||
$store->set('foo', 'bar');
|
||||
$store->save();
|
||||
}
|
||||
|
||||
protected function getDbData()
|
||||
{
|
||||
return [
|
||||
['key' => 'foo', 'value' => 'bar'],
|
||||
['key' => 'nest.one', 'value' => 'nestone'],
|
||||
['key' => 'nest.two', 'value' => 'nesttwo'],
|
||||
['key' => 'array.0', 'value' => 'one'],
|
||||
['key' => 'array.1', 'value' => 'two'],
|
||||
];
|
||||
}
|
||||
|
||||
protected function mockConnection()
|
||||
{
|
||||
return m::mock('Illuminate\Database\Connection');
|
||||
}
|
||||
|
||||
protected function mockQuery($connection)
|
||||
{
|
||||
$query = m::mock('Illuminate\Database\Query\Builder');
|
||||
$connection->shouldReceive('table')->andReturn($query);
|
||||
|
||||
return $query;
|
||||
}
|
||||
|
||||
protected function makeStore($connection)
|
||||
{
|
||||
return new Akaunting\Setting\Drivers\Database($connection);
|
||||
}
|
||||
}
|
||||
51
vendor/akaunting/laravel-setting/tests/unit/HelperTest.php
vendored
Normal file
51
vendor/akaunting/laravel-setting/tests/unit/HelperTest.php
vendored
Normal file
@ -0,0 +1,51 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Container\Container;
|
||||
use Mockery as m;
|
||||
|
||||
class HelperTest extends PHPUnit_Framework_TestCase
|
||||
{
|
||||
public static $functions;
|
||||
|
||||
public function setUp()
|
||||
{
|
||||
self::$functions = m::mock();
|
||||
|
||||
Container::setInstance(new Container());
|
||||
|
||||
$store = m::mock('Akaunting\Setting\Contracts\Driver');
|
||||
|
||||
app()->bind('setting', function () use ($store) {
|
||||
return $store;
|
||||
});
|
||||
}
|
||||
|
||||
/** @test */
|
||||
public function helper_without_parameters_returns_store()
|
||||
{
|
||||
$this->assertInstanceOf('Akaunting\Setting\Contracts\Driver', setting());
|
||||
}
|
||||
|
||||
/** @test */
|
||||
public function single_parameter_get_a_key_from_store()
|
||||
{
|
||||
app('setting')->shouldReceive('get')->with('foo', null)->once();
|
||||
|
||||
setting('foo');
|
||||
}
|
||||
|
||||
public function two_parameters_return_a_default_value()
|
||||
{
|
||||
app('setting')->shouldReceive('get')->with('foo', 'bar')->once();
|
||||
|
||||
setting('foo', 'bar');
|
||||
}
|
||||
|
||||
/** @test */
|
||||
public function array_parameter_call_set_method_into_store()
|
||||
{
|
||||
app('setting')->shouldReceive('set')->with(['foo', 'bar'])->once();
|
||||
|
||||
setting(['foo', 'bar']);
|
||||
}
|
||||
}
|
||||
60
vendor/akaunting/laravel-setting/tests/unit/JsonDriverTest.php
vendored
Normal file
60
vendor/akaunting/laravel-setting/tests/unit/JsonDriverTest.php
vendored
Normal file
@ -0,0 +1,60 @@
|
||||
<?php
|
||||
|
||||
use Mockery as m;
|
||||
|
||||
class JsonDriverTest extends PHPUnit_Framework_TestCase
|
||||
{
|
||||
public function tearDown()
|
||||
{
|
||||
m::close();
|
||||
}
|
||||
|
||||
protected function mockFilesystem()
|
||||
{
|
||||
return m::mock('Illuminate\Filesystem\Filesystem');
|
||||
}
|
||||
|
||||
protected function makeStore($files, $path = 'fakepath')
|
||||
{
|
||||
return new Akaunting\Setting\Drivers\Json($files, $path);
|
||||
}
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @expectedException InvalidArgumentException
|
||||
*/
|
||||
public function throws_exception_when_file_not_writeable()
|
||||
{
|
||||
$files = $this->mockFilesystem();
|
||||
$files->shouldReceive('exists')->once()->with('fakepath')->andReturn(true);
|
||||
$files->shouldReceive('isWritable')->once()->with('fakepath')->andReturn(false);
|
||||
$store = $this->makeStore($files);
|
||||
}
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @expectedException InvalidArgumentException
|
||||
*/
|
||||
public function throws_exception_when_files_put_fails()
|
||||
{
|
||||
$files = $this->mockFilesystem();
|
||||
$files->shouldReceive('exists')->once()->with('fakepath')->andReturn(false);
|
||||
$files->shouldReceive('put')->once()->with('fakepath', '{}')->andReturn(false);
|
||||
$store = $this->makeStore($files);
|
||||
}
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @expectedException RuntimeException
|
||||
*/
|
||||
public function throws_exception_when_file_contains_invalid_json()
|
||||
{
|
||||
$files = $this->mockFilesystem();
|
||||
$files->shouldReceive('exists')->once()->with('fakepath')->andReturn(true);
|
||||
$files->shouldReceive('isWritable')->once()->with('fakepath')->andReturn(true);
|
||||
$files->shouldReceive('get')->once()->with('fakepath')->andReturn('[[!1!11]');
|
||||
|
||||
$store = $this->makeStore($files);
|
||||
$store->get('foo');
|
||||
}
|
||||
}
|
||||
4
vendor/anhskohbo/no-captcha/.gitignore
vendored
Normal file
4
vendor/anhskohbo/no-captcha/.gitignore
vendored
Normal file
@ -0,0 +1,4 @@
|
||||
/vendor
|
||||
composer.phar
|
||||
composer.lock
|
||||
.DS_Store
|
||||
18
vendor/anhskohbo/no-captcha/.travis.yml
vendored
Normal file
18
vendor/anhskohbo/no-captcha/.travis.yml
vendored
Normal file
@ -0,0 +1,18 @@
|
||||
language: php
|
||||
|
||||
dist: trusty
|
||||
|
||||
php:
|
||||
- 5.5
|
||||
- 5.6
|
||||
- 7.0
|
||||
- 7.1
|
||||
- 7.2
|
||||
|
||||
before_script:
|
||||
- travis_retry composer self-update
|
||||
- travis_retry composer install --prefer-source --no-interaction --dev
|
||||
|
||||
script:
|
||||
- composer install
|
||||
- vendor/bin/phpunit
|
||||
22
vendor/anhskohbo/no-captcha/LICENSE
vendored
Normal file
22
vendor/anhskohbo/no-captcha/LICENSE
vendored
Normal file
@ -0,0 +1,22 @@
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2014 Nguyễn Văn Ánh
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
|
||||
197
vendor/anhskohbo/no-captcha/README.md
vendored
Normal file
197
vendor/anhskohbo/no-captcha/README.md
vendored
Normal file
@ -0,0 +1,197 @@
|
||||
No CAPTCHA reCAPTCHA
|
||||
==========
|
||||
|
||||
[](https://travis-ci.org/anhskohbo/no-captcha)
|
||||
[](https://packagist.org/packages/anhskohbo/no-captcha)
|
||||
[](https://packagist.org/packages/anhskohbo/no-captcha)
|
||||
[](https://packagist.org/packages/anhskohbo/no-captcha)
|
||||
[](https://packagist.org/packages/anhskohbo/no-captcha)
|
||||
|
||||

|
||||
|
||||
> For Laravel 4 use [v1](https://github.com/anhskohbo/no-captcha/tree/v1) branch.
|
||||
|
||||
## Installation
|
||||
|
||||
```
|
||||
composer require anhskohbo/no-captcha
|
||||
```
|
||||
|
||||
## Laravel 5 and above
|
||||
|
||||
### Setup
|
||||
|
||||
**_NOTE_** This package supports the auto-discovery feature of Laravel 5.5 and above, So skip these `Setup` instructions if you're using Laravel 5.5 and above.
|
||||
|
||||
In `app/config/app.php` add the following :
|
||||
|
||||
1- The ServiceProvider to the providers array :
|
||||
|
||||
```php
|
||||
Anhskohbo\NoCaptcha\NoCaptchaServiceProvider::class,
|
||||
```
|
||||
|
||||
2- The class alias to the aliases array :
|
||||
|
||||
```php
|
||||
'NoCaptcha' => Anhskohbo\NoCaptcha\Facades\NoCaptcha::class,
|
||||
```
|
||||
|
||||
3- Publish the config file
|
||||
|
||||
```ssh
|
||||
php artisan vendor:publish --provider="Anhskohbo\NoCaptcha\NoCaptchaServiceProvider"
|
||||
```
|
||||
|
||||
### Configuration
|
||||
|
||||
Add `NOCAPTCHA_SECRET` and `NOCAPTCHA_SITEKEY` in **.env** file :
|
||||
|
||||
```
|
||||
NOCAPTCHA_SECRET=secret-key
|
||||
NOCAPTCHA_SITEKEY=site-key
|
||||
```
|
||||
|
||||
(You can obtain them from [here](https://www.google.com/recaptcha/admin))
|
||||
|
||||
### Usage
|
||||
|
||||
#### Init js source
|
||||
|
||||
With default options :
|
||||
|
||||
```php
|
||||
{!! NoCaptcha::renderJs() !!}
|
||||
```
|
||||
|
||||
With [language support](https://developers.google.com/recaptcha/docs/language) or [onloadCallback](https://developers.google.com/recaptcha/docs/display#explicit_render) option :
|
||||
|
||||
```php
|
||||
{!! NoCaptcha::renderJs('fr', true, 'recaptchaCallback') !!}
|
||||
```
|
||||
|
||||
#### Display reCAPTCHA
|
||||
|
||||
Default widget :
|
||||
|
||||
```php
|
||||
{!! NoCaptcha::display() !!}
|
||||
```
|
||||
|
||||
With [custom attributes](https://developers.google.com/recaptcha/docs/display#render_param) (theme, size, callback ...) :
|
||||
|
||||
```php
|
||||
{!! NoCaptcha::display(['data-theme' => 'dark']) !!}
|
||||
```
|
||||
|
||||
Invisible reCAPTCHA using a [submit button](https://developers.google.com/recaptcha/docs/invisible):
|
||||
|
||||
```php
|
||||
{!! NoCaptcha::displaySubmit('my-form-id', 'submit now!', ['data-theme' => 'dark']) !!}
|
||||
```
|
||||
Notice that the id of the form is required in this method to let the autogenerated
|
||||
callback submit the form on a successful captcha verification.
|
||||
|
||||
#### Validation
|
||||
|
||||
Add `'g-recaptcha-response' => 'required|captcha'` to rules array :
|
||||
|
||||
```php
|
||||
$validate = Validator::make(Input::all(), [
|
||||
'g-recaptcha-response' => 'required|captcha'
|
||||
]);
|
||||
|
||||
```
|
||||
|
||||
##### Custom Validation Message
|
||||
|
||||
Add the following values to the `custom` array in the `validation` language file :
|
||||
|
||||
```php
|
||||
'custom' => [
|
||||
'g-recaptcha-response' => [
|
||||
'required' => 'Please verify that you are not a robot.',
|
||||
'captcha' => 'Captcha error! try again later or contact site admin.',
|
||||
],
|
||||
],
|
||||
```
|
||||
|
||||
Then check for captcha errors in the `Form` :
|
||||
|
||||
```php
|
||||
@if ($errors->has('g-recaptcha-response'))
|
||||
<span class="help-block">
|
||||
<strong>{{ $errors->first('g-recaptcha-response') }}</strong>
|
||||
</span>
|
||||
@endif
|
||||
```
|
||||
|
||||
### Testing
|
||||
|
||||
When using the [Laravel Testing functionality](http://laravel.com/docs/5.5/testing), you will need to mock out the response for the captcha form element.
|
||||
|
||||
So for any form tests involving the captcha, you can do this by mocking the facade behavior:
|
||||
|
||||
```php
|
||||
// prevent validation error on captcha
|
||||
NoCaptcha::shouldReceive('verifyResponse')
|
||||
->once()
|
||||
->andReturn(true);
|
||||
|
||||
// provide hidden input for your 'required' validation
|
||||
NoCaptcha::shouldReceive('display')
|
||||
->zeroOrMoreTimes()
|
||||
->andReturn('<input type="hidden" name="g-recaptcha-response" value="1" />');
|
||||
```
|
||||
|
||||
You can then test the remainder of your form as normal.
|
||||
|
||||
When using HTTP tests you can add the `g-recaptcha-response` to the request body for the 'required' validation:
|
||||
|
||||
```php
|
||||
// prevent validation error on captcha
|
||||
NoCaptcha::shouldReceive('verifyResponse')
|
||||
->once()
|
||||
->andReturn(true);
|
||||
|
||||
// POST request, with request body including g-recaptcha-response
|
||||
$response = $this->json('POST', '/register', [
|
||||
'g-recaptcha-response' => '1',
|
||||
'name' => 'John',
|
||||
'email' => 'john@example.com',
|
||||
'password' => '123456',
|
||||
'password_confirmation' => '123456',
|
||||
]);
|
||||
```
|
||||
|
||||
## Without Laravel
|
||||
|
||||
Checkout example below:
|
||||
|
||||
```php
|
||||
<?php
|
||||
|
||||
require_once "vendor/autoload.php";
|
||||
|
||||
$secret = 'CAPTCHA-SECRET';
|
||||
$sitekey = 'CAPTCHA-SITEKEY';
|
||||
$captcha = new \Anhskohbo\NoCaptcha\NoCaptcha($secret, $sitekey);
|
||||
|
||||
if (! empty($_POST)) {
|
||||
var_dump($captcha->verifyResponse($_POST['g-recaptcha-response']));
|
||||
exit();
|
||||
}
|
||||
|
||||
?>
|
||||
|
||||
<form action="?" method="POST">
|
||||
<?php echo $captcha->display(); ?>
|
||||
<button type="submit">Submit</button>
|
||||
</form>
|
||||
|
||||
<?php echo $captcha->renderJs(); ?>
|
||||
```
|
||||
|
||||
## Contribute
|
||||
|
||||
https://github.com/anhskohbo/no-captcha/pulls
|
||||
43
vendor/anhskohbo/no-captcha/composer.json
vendored
Normal file
43
vendor/anhskohbo/no-captcha/composer.json
vendored
Normal file
@ -0,0 +1,43 @@
|
||||
{
|
||||
"name": "anhskohbo/no-captcha",
|
||||
"description": "No CAPTCHA reCAPTCHA For Laravel.",
|
||||
"keywords": [
|
||||
"recaptcha",
|
||||
"no-captcha",
|
||||
"captcha",
|
||||
"laravel",
|
||||
"laravel4",
|
||||
"laravel5",
|
||||
"laravel6"
|
||||
],
|
||||
"license": "MIT",
|
||||
"authors": [
|
||||
{
|
||||
"name": "anhskohbo",
|
||||
"email": "anhskohbo@gmail.com"
|
||||
}
|
||||
],
|
||||
"require": {
|
||||
"php": ">=5.5.5",
|
||||
"illuminate/support": "^5.0|^6.0|^7.0|^8.0|^9.0|^10.0",
|
||||
"guzzlehttp/guzzle": "^6.2|^7.0"
|
||||
},
|
||||
"require-dev": {
|
||||
"phpunit/phpunit": "~4.8|^9.5.10"
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"Anhskohbo\\NoCaptcha\\": "src/"
|
||||
}
|
||||
},
|
||||
"extra": {
|
||||
"laravel": {
|
||||
"providers": [
|
||||
"Anhskohbo\\NoCaptcha\\NoCaptchaServiceProvider"
|
||||
],
|
||||
"aliases": {
|
||||
"NoCaptcha": "Anhskohbo\\NoCaptcha\\Facades\\NoCaptcha"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
18
vendor/anhskohbo/no-captcha/phpunit.xml
vendored
Normal file
18
vendor/anhskohbo/no-captcha/phpunit.xml
vendored
Normal file
@ -0,0 +1,18 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<phpunit backupGlobals="false"
|
||||
backupStaticAttributes="false"
|
||||
bootstrap="vendor/autoload.php"
|
||||
colors="true"
|
||||
convertErrorsToExceptions="true"
|
||||
convertNoticesToExceptions="true"
|
||||
convertWarningsToExceptions="true"
|
||||
processIsolation="false"
|
||||
stopOnFailure="false"
|
||||
syntaxCheck="false"
|
||||
>
|
||||
<testsuites>
|
||||
<testsuite name="Package Test Suite">
|
||||
<directory suffix=".php">./tests/</directory>
|
||||
</testsuite>
|
||||
</testsuites>
|
||||
</phpunit>
|
||||
18
vendor/anhskohbo/no-captcha/src/Facades/NoCaptcha.php
vendored
Normal file
18
vendor/anhskohbo/no-captcha/src/Facades/NoCaptcha.php
vendored
Normal file
@ -0,0 +1,18 @@
|
||||
<?php
|
||||
|
||||
namespace Anhskohbo\NoCaptcha\Facades;
|
||||
|
||||
use Illuminate\Support\Facades\Facade;
|
||||
|
||||
class NoCaptcha extends Facade
|
||||
{
|
||||
/**
|
||||
* Get the registered name of the component.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected static function getFacadeAccessor()
|
||||
{
|
||||
return 'captcha';
|
||||
}
|
||||
}
|
||||
246
vendor/anhskohbo/no-captcha/src/NoCaptcha.php
vendored
Normal file
246
vendor/anhskohbo/no-captcha/src/NoCaptcha.php
vendored
Normal file
@ -0,0 +1,246 @@
|
||||
<?php
|
||||
|
||||
namespace Anhskohbo\NoCaptcha;
|
||||
|
||||
use Symfony\Component\HttpFoundation\Request;
|
||||
use GuzzleHttp\Client;
|
||||
|
||||
class NoCaptcha
|
||||
{
|
||||
const CLIENT_API = 'https://www.google.com/recaptcha/api.js';
|
||||
const VERIFY_URL = 'https://www.google.com/recaptcha/api/siteverify';
|
||||
|
||||
/**
|
||||
* The recaptcha secret key.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $secret;
|
||||
|
||||
/**
|
||||
* The recaptcha sitekey key.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $sitekey;
|
||||
|
||||
/**
|
||||
* @var \GuzzleHttp\Client
|
||||
*/
|
||||
protected $http;
|
||||
|
||||
/**
|
||||
* The cached verified responses.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $verifiedResponses = [];
|
||||
|
||||
/**
|
||||
* NoCaptcha.
|
||||
*
|
||||
* @param string $secret
|
||||
* @param string $sitekey
|
||||
* @param array $options
|
||||
*/
|
||||
public function __construct($secret, $sitekey, $options = [])
|
||||
{
|
||||
$this->secret = $secret;
|
||||
$this->sitekey = $sitekey;
|
||||
$this->http = new Client($options);
|
||||
}
|
||||
|
||||
/**
|
||||
* Render HTML captcha.
|
||||
*
|
||||
* @param array $attributes
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function display($attributes = [])
|
||||
{
|
||||
$attributes = $this->prepareAttributes($attributes);
|
||||
return '<div' . $this->buildAttributes($attributes) . '></div>';
|
||||
}
|
||||
|
||||
/**
|
||||
* @see display()
|
||||
*/
|
||||
public function displayWidget($attributes = [])
|
||||
{
|
||||
return $this->display($attributes);
|
||||
}
|
||||
|
||||
/**
|
||||
* Display a Invisible reCAPTCHA by embedding a callback into a form submit button.
|
||||
*
|
||||
* @param string $formIdentifier the html ID of the form that should be submitted.
|
||||
* @param string $text the text inside the form button
|
||||
* @param array $attributes array of additional html elements
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function displaySubmit($formIdentifier, $text = 'submit', $attributes = [])
|
||||
{
|
||||
$javascript = '';
|
||||
if (!isset($attributes['data-callback'])) {
|
||||
$functionName = 'onSubmit' . str_replace(['-', '=', '\'', '"', '<', '>', '`'], '', $formIdentifier);
|
||||
$attributes['data-callback'] = $functionName;
|
||||
$javascript = sprintf(
|
||||
'<script>function %s(){document.getElementById("%s").submit();}</script>',
|
||||
$functionName,
|
||||
$formIdentifier
|
||||
);
|
||||
}
|
||||
|
||||
$attributes = $this->prepareAttributes($attributes);
|
||||
|
||||
$button = sprintf('<button%s><span>%s</span></button>', $this->buildAttributes($attributes), $text);
|
||||
|
||||
return $button . $javascript;
|
||||
}
|
||||
|
||||
/**
|
||||
* Render js source
|
||||
*
|
||||
* @param null $lang
|
||||
* @param bool $callback
|
||||
* @param string $onLoadClass
|
||||
* @return string
|
||||
*/
|
||||
public function renderJs($lang = null, $callback = false, $onLoadClass = 'onloadCallBack')
|
||||
{
|
||||
return '<script src="'.$this->getJsLink($lang, $callback, $onLoadClass).'" async defer></script>'."\n";
|
||||
}
|
||||
|
||||
/**
|
||||
* Verify no-captcha response.
|
||||
*
|
||||
* @param string $response
|
||||
* @param string $clientIp
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function verifyResponse($response, $clientIp = null)
|
||||
{
|
||||
if (empty($response)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Return true if response already verfied before.
|
||||
if (in_array($response, $this->verifiedResponses)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
$verifyResponse = $this->sendRequestVerify([
|
||||
'secret' => $this->secret,
|
||||
'response' => $response,
|
||||
'remoteip' => $clientIp,
|
||||
]);
|
||||
|
||||
if (isset($verifyResponse['success']) && $verifyResponse['success'] === true) {
|
||||
// A response can only be verified once from google, so we need to
|
||||
// cache it to make it work in case we want to verify it multiple times.
|
||||
$this->verifiedResponses[] = $response;
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Verify no-captcha response by Symfony Request.
|
||||
*
|
||||
* @param Request $request
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function verifyRequest(Request $request)
|
||||
{
|
||||
return $this->verifyResponse(
|
||||
$request->get('g-recaptcha-response'),
|
||||
$request->getClientIp()
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get recaptcha js link.
|
||||
*
|
||||
* @param string $lang
|
||||
* @param boolean $callback
|
||||
* @param string $onLoadClass
|
||||
* @return string
|
||||
*/
|
||||
public function getJsLink($lang = null, $callback = false, $onLoadClass = 'onloadCallBack')
|
||||
{
|
||||
$client_api = static::CLIENT_API;
|
||||
$params = [];
|
||||
|
||||
$callback ? $this->setCallBackParams($params, $onLoadClass) : false;
|
||||
$lang ? $params['hl'] = $lang : null;
|
||||
|
||||
return $client_api . '?'. http_build_query($params);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param $params
|
||||
* @param $onLoadClass
|
||||
*/
|
||||
protected function setCallBackParams(&$params, $onLoadClass)
|
||||
{
|
||||
$params['render'] = 'explicit';
|
||||
$params['onload'] = $onLoadClass;
|
||||
}
|
||||
|
||||
/**
|
||||
* Send verify request.
|
||||
*
|
||||
* @param array $query
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
protected function sendRequestVerify(array $query = [])
|
||||
{
|
||||
$response = $this->http->request('POST', static::VERIFY_URL, [
|
||||
'form_params' => $query,
|
||||
]);
|
||||
|
||||
return json_decode($response->getBody(), true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Prepare HTML attributes and assure that the correct classes and attributes for captcha are inserted.
|
||||
*
|
||||
* @param array $attributes
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
protected function prepareAttributes(array $attributes)
|
||||
{
|
||||
$attributes['data-sitekey'] = $this->sitekey;
|
||||
if (!isset($attributes['class'])) {
|
||||
$attributes['class'] = '';
|
||||
}
|
||||
$attributes['class'] = trim('g-recaptcha ' . $attributes['class']);
|
||||
|
||||
return $attributes;
|
||||
}
|
||||
|
||||
/**
|
||||
* Build HTML attributes.
|
||||
*
|
||||
* @param array $attributes
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function buildAttributes(array $attributes)
|
||||
{
|
||||
$html = [];
|
||||
|
||||
foreach ($attributes as $key => $value) {
|
||||
$html[] = $key.'="'.$value.'"';
|
||||
}
|
||||
|
||||
return count($html) ? ' '.implode(' ', $html) : '';
|
||||
}
|
||||
}
|
||||
73
vendor/anhskohbo/no-captcha/src/NoCaptchaServiceProvider.php
vendored
Normal file
73
vendor/anhskohbo/no-captcha/src/NoCaptchaServiceProvider.php
vendored
Normal file
@ -0,0 +1,73 @@
|
||||
<?php
|
||||
|
||||
namespace Anhskohbo\NoCaptcha;
|
||||
|
||||
use Illuminate\Support\ServiceProvider;
|
||||
|
||||
class NoCaptchaServiceProvider extends ServiceProvider
|
||||
{
|
||||
/**
|
||||
* Indicates if loading of the provider is deferred.
|
||||
*
|
||||
* @var bool
|
||||
*/
|
||||
protected $defer = false;
|
||||
|
||||
/**
|
||||
* Bootstrap the application events.
|
||||
*/
|
||||
public function boot()
|
||||
{
|
||||
$app = $this->app;
|
||||
|
||||
$this->bootConfig();
|
||||
|
||||
$app['validator']->extend('captcha', function ($attribute, $value) use ($app) {
|
||||
return $app['captcha']->verifyResponse($value, $app['request']->getClientIp());
|
||||
});
|
||||
|
||||
if ($app->bound('form')) {
|
||||
$app['form']->macro('captcha', function ($attributes = []) use ($app) {
|
||||
return $app['captcha']->display($attributes, $app->getLocale());
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Booting configure.
|
||||
*/
|
||||
protected function bootConfig()
|
||||
{
|
||||
$path = __DIR__.'/config/captcha.php';
|
||||
|
||||
$this->mergeConfigFrom($path, 'captcha');
|
||||
|
||||
if (function_exists('config_path')) {
|
||||
$this->publishes([$path => config_path('captcha.php')]);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Register the service provider.
|
||||
*/
|
||||
public function register()
|
||||
{
|
||||
$this->app->singleton('captcha', function ($app) {
|
||||
return new NoCaptcha(
|
||||
$app['config']['captcha.secret'],
|
||||
$app['config']['captcha.sitekey'],
|
||||
$app['config']['captcha.options']
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the services provided by the provider.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function provides()
|
||||
{
|
||||
return ['captcha'];
|
||||
}
|
||||
}
|
||||
0
vendor/anhskohbo/no-captcha/src/config/.gitkeep
vendored
Normal file
0
vendor/anhskohbo/no-captcha/src/config/.gitkeep
vendored
Normal file
9
vendor/anhskohbo/no-captcha/src/config/captcha.php
vendored
Normal file
9
vendor/anhskohbo/no-captcha/src/config/captcha.php
vendored
Normal file
@ -0,0 +1,9 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'secret' => env('NOCAPTCHA_SECRET'),
|
||||
'sitekey' => env('NOCAPTCHA_SITEKEY'),
|
||||
'options' => [
|
||||
'timeout' => 30,
|
||||
],
|
||||
];
|
||||
0
vendor/anhskohbo/no-captcha/tests/.gitkeep
vendored
Normal file
0
vendor/anhskohbo/no-captcha/tests/.gitkeep
vendored
Normal file
69
vendor/anhskohbo/no-captcha/tests/NoCaptchaTest.php
vendored
Normal file
69
vendor/anhskohbo/no-captcha/tests/NoCaptchaTest.php
vendored
Normal file
@ -0,0 +1,69 @@
|
||||
<?php
|
||||
|
||||
use Anhskohbo\NoCaptcha\NoCaptcha;
|
||||
|
||||
class NoCaptchaTest extends PHPUnit_Framework_TestCase
|
||||
{
|
||||
/**
|
||||
* @var NoCaptcha
|
||||
*/
|
||||
private $captcha;
|
||||
|
||||
public function setUp()
|
||||
{
|
||||
parent::setUp();
|
||||
$this->captcha = new NoCaptcha('{secret-key}', '{site-key}');
|
||||
}
|
||||
|
||||
public function testRequestShouldWorks()
|
||||
{
|
||||
$response = $this->captcha->verifyResponse('should_false');
|
||||
}
|
||||
|
||||
public function testJsLink()
|
||||
{
|
||||
$this->assertTrue($this->captcha instanceof NoCaptcha);
|
||||
|
||||
$simple = '<script src="https://www.google.com/recaptcha/api.js?" async defer></script>'."\n";
|
||||
$withLang = '<script src="https://www.google.com/recaptcha/api.js?hl=vi" async defer></script>'."\n";
|
||||
$withCallback = '<script src="https://www.google.com/recaptcha/api.js?render=explicit&onload=myOnloadCallback" async defer></script>'."\n";
|
||||
|
||||
$this->assertEquals($simple, $this->captcha->renderJs());
|
||||
$this->assertEquals($withLang, $this->captcha->renderJs('vi'));
|
||||
$this->assertEquals($withCallback, $this->captcha->renderJs(null, true, 'myOnloadCallback'));
|
||||
}
|
||||
|
||||
public function testDisplay()
|
||||
{
|
||||
$this->assertTrue($this->captcha instanceof NoCaptcha);
|
||||
|
||||
$simple = '<div data-sitekey="{site-key}" class="g-recaptcha"></div>';
|
||||
$withAttrs = '<div data-theme="light" data-sitekey="{site-key}" class="g-recaptcha"></div>';
|
||||
|
||||
$this->assertEquals($simple, $this->captcha->display());
|
||||
$this->assertEquals($withAttrs, $this->captcha->display(['data-theme' => 'light']));
|
||||
}
|
||||
|
||||
public function testdisplaySubmit()
|
||||
{
|
||||
$this->assertTrue($this->captcha instanceof NoCaptcha);
|
||||
|
||||
$javascript = '<script>function onSubmittest(){document.getElementById("test").submit();}</script>';
|
||||
$simple = '<button data-callback="onSubmittest" data-sitekey="{site-key}" class="g-recaptcha"><span>submit</span></button>';
|
||||
$withAttrs = '<button data-theme="light" class="g-recaptcha 123" data-callback="onSubmittest" data-sitekey="{site-key}"><span>submit123</span></button>';
|
||||
|
||||
$this->assertEquals($simple . $javascript, $this->captcha->displaySubmit('test'));
|
||||
$withAttrsResult = $this->captcha->displaySubmit('test','submit123',['data-theme' => 'light', 'class' => '123']);
|
||||
$this->assertEquals($withAttrs . $javascript, $withAttrsResult);
|
||||
}
|
||||
|
||||
public function testdisplaySubmitWithCustomCallback()
|
||||
{
|
||||
$this->assertTrue($this->captcha instanceof NoCaptcha);
|
||||
|
||||
$withAttrs = '<button data-theme="light" class="g-recaptcha 123" data-callback="onSubmitCustomCallback" data-sitekey="{site-key}"><span>submit123</span></button>';
|
||||
|
||||
$withAttrsResult = $this->captcha->displaySubmit('test-custom','submit123',['data-theme' => 'light', 'class' => '123', 'data-callback' => 'onSubmitCustomCallback']);
|
||||
$this->assertEquals($withAttrs, $withAttrsResult);
|
||||
}
|
||||
}
|
||||
25
vendor/autoload.php
vendored
Normal file
25
vendor/autoload.php
vendored
Normal file
@ -0,0 +1,25 @@
|
||||
<?php
|
||||
|
||||
// autoload.php @generated by Composer
|
||||
|
||||
if (PHP_VERSION_ID < 50600) {
|
||||
if (!headers_sent()) {
|
||||
header('HTTP/1.1 500 Internal Server Error');
|
||||
}
|
||||
$err = 'Composer 2.3.0 dropped support for autoloading on PHP <5.6 and you are running '.PHP_VERSION.', please upgrade PHP or use Composer 2.2 LTS via "composer self-update --2.2". Aborting.'.PHP_EOL;
|
||||
if (!ini_get('display_errors')) {
|
||||
if (PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg') {
|
||||
fwrite(STDERR, $err);
|
||||
} elseif (!headers_sent()) {
|
||||
echo $err;
|
||||
}
|
||||
}
|
||||
trigger_error(
|
||||
$err,
|
||||
E_USER_ERROR
|
||||
);
|
||||
}
|
||||
|
||||
require_once __DIR__ . '/composer/autoload_real.php';
|
||||
|
||||
return ComposerAutoloaderInit0a39803e5364a51c44275cdfc5d8af8d::getLoader();
|
||||
19
vendor/barryvdh/laravel-debugbar/LICENSE
vendored
Normal file
19
vendor/barryvdh/laravel-debugbar/LICENSE
vendored
Normal file
@ -0,0 +1,19 @@
|
||||
Copyright (C) 2013-present Barry vd. Heuvel
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
the Software without restriction, including without limitation the rights to
|
||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
of the Software, and to permit persons to whom the Software is furnished to do
|
||||
so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
5
vendor/barryvdh/laravel-debugbar/SECURITY.md
vendored
Normal file
5
vendor/barryvdh/laravel-debugbar/SECURITY.md
vendored
Normal file
@ -0,0 +1,5 @@
|
||||
# Security Policy
|
||||
|
||||
## Reporting a Vulnerability
|
||||
|
||||
Please report security issues to `barryvdh@gmail.com`
|
||||
59
vendor/barryvdh/laravel-debugbar/composer.json
vendored
Normal file
59
vendor/barryvdh/laravel-debugbar/composer.json
vendored
Normal file
@ -0,0 +1,59 @@
|
||||
{
|
||||
"name": "barryvdh/laravel-debugbar",
|
||||
"description": "PHP Debugbar integration for Laravel",
|
||||
"keywords": ["laravel", "debugbar", "profiler", "debug", "webprofiler"],
|
||||
"license": "MIT",
|
||||
"authors": [
|
||||
{
|
||||
"name": "Barry vd. Heuvel",
|
||||
"email": "barryvdh@gmail.com"
|
||||
}
|
||||
],
|
||||
"require": {
|
||||
"php": "^8.0",
|
||||
"maximebf/debugbar": "^1.18.2",
|
||||
"illuminate/routing": "^9|^10",
|
||||
"illuminate/session": "^9|^10",
|
||||
"illuminate/support": "^9|^10",
|
||||
"symfony/finder": "^6"
|
||||
},
|
||||
"require-dev": {
|
||||
"mockery/mockery": "^1.3.3",
|
||||
"orchestra/testbench-dusk": "^5|^6|^7|^8",
|
||||
"phpunit/phpunit": "^8.5.30|^9.0",
|
||||
"squizlabs/php_codesniffer": "^3.5"
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"Barryvdh\\Debugbar\\": "src/"
|
||||
},
|
||||
"files": [
|
||||
"src/helpers.php"
|
||||
]
|
||||
},
|
||||
"autoload-dev": {
|
||||
"psr-4": {
|
||||
"Barryvdh\\Debugbar\\Tests\\": "tests"
|
||||
}
|
||||
},
|
||||
"minimum-stability": "dev",
|
||||
"prefer-stable": true,
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "3.8-dev"
|
||||
},
|
||||
"laravel": {
|
||||
"providers": [
|
||||
"Barryvdh\\Debugbar\\ServiceProvider"
|
||||
],
|
||||
"aliases": {
|
||||
"Debugbar": "Barryvdh\\Debugbar\\Facades\\Debugbar"
|
||||
}
|
||||
}
|
||||
},
|
||||
"scripts": {
|
||||
"check-style": "phpcs -p --standard=PSR12 config/ src/ tests/ --ignore=src/Resources/* ",
|
||||
"fix-style": "phpcbf -p --standard=PSR12 config/ src/ tests/ --ignore=src/Resources*",
|
||||
"test": "phpunit"
|
||||
}
|
||||
}
|
||||
277
vendor/barryvdh/laravel-debugbar/config/debugbar.php
vendored
Normal file
277
vendor/barryvdh/laravel-debugbar/config/debugbar.php
vendored
Normal file
@ -0,0 +1,277 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Debugbar Settings
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Debugbar is enabled by default, when debug is set to true in app.php.
|
||||
| You can override the value by setting enable to true or false instead of null.
|
||||
|
|
||||
| You can provide an array of URI's that must be ignored (eg. 'api/*')
|
||||
|
|
||||
*/
|
||||
|
||||
'enabled' => env('DEBUGBAR_ENABLED', null),
|
||||
'except' => [
|
||||
'telescope*',
|
||||
'horizon*',
|
||||
],
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Storage settings
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| DebugBar stores data for session/ajax requests.
|
||||
| You can disable this, so the debugbar stores data in headers/session,
|
||||
| but this can cause problems with large data collectors.
|
||||
| By default, file storage (in the storage folder) is used. Redis and PDO
|
||||
| can also be used. For PDO, run the package migrations first.
|
||||
|
|
||||
*/
|
||||
'storage' => [
|
||||
'enabled' => true,
|
||||
'driver' => 'file', // redis, file, pdo, socket, custom
|
||||
'path' => storage_path('debugbar'), // For file driver
|
||||
'connection' => null, // Leave null for default connection (Redis/PDO)
|
||||
'provider' => '', // Instance of StorageInterface for custom driver
|
||||
'hostname' => '127.0.0.1', // Hostname to use with the "socket" driver
|
||||
'port' => 2304, // Port to use with the "socket" driver
|
||||
],
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Editor
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Choose your preferred editor to use when clicking file name.
|
||||
|
|
||||
| Supported: "phpstorm", "vscode", "vscode-insiders", "vscode-remote",
|
||||
| "vscode-insiders-remote", "vscodium", "textmate", "emacs",
|
||||
| "sublime", "atom", "nova", "macvim", "idea", "netbeans",
|
||||
| "xdebug", "espresso"
|
||||
|
|
||||
*/
|
||||
|
||||
'editor' => env('DEBUGBAR_EDITOR', 'phpstorm'),
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Remote Path Mapping
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| If you are using a remote dev server, like Laravel Homestead, Docker, or
|
||||
| even a remote VPS, it will be necessary to specify your path mapping.
|
||||
|
|
||||
| Leaving one, or both of these, empty or null will not trigger the remote
|
||||
| URL changes and Debugbar will treat your editor links as local files.
|
||||
|
|
||||
| "remote_sites_path" is an absolute base path for your sites or projects
|
||||
| in Homestead, Vagrant, Docker, or another remote development server.
|
||||
|
|
||||
| Example value: "/home/vagrant/Code"
|
||||
|
|
||||
| "local_sites_path" is an absolute base path for your sites or projects
|
||||
| on your local computer where your IDE or code editor is running on.
|
||||
|
|
||||
| Example values: "/Users/<name>/Code", "C:\Users\<name>\Documents\Code"
|
||||
|
|
||||
*/
|
||||
|
||||
'remote_sites_path' => env('DEBUGBAR_REMOTE_SITES_PATH', ''),
|
||||
'local_sites_path' => env('DEBUGBAR_LOCAL_SITES_PATH', ''),
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Vendors
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Vendor files are included by default, but can be set to false.
|
||||
| This can also be set to 'js' or 'css', to only include javascript or css vendor files.
|
||||
| Vendor files are for css: font-awesome (including fonts) and highlight.js (css files)
|
||||
| and for js: jquery and highlight.js
|
||||
| So if you want syntax highlighting, set it to true.
|
||||
| jQuery is set to not conflict with existing jQuery scripts.
|
||||
|
|
||||
*/
|
||||
|
||||
'include_vendors' => true,
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Capture Ajax Requests
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| The Debugbar can capture Ajax requests and display them. If you don't want this (ie. because of errors),
|
||||
| you can use this option to disable sending the data through the headers.
|
||||
|
|
||||
| Optionally, you can also send ServerTiming headers on ajax requests for the Chrome DevTools.
|
||||
|
|
||||
| Note for your request to be identified as ajax requests they must either send the header
|
||||
| X-Requested-With with the value XMLHttpRequest (most JS libraries send this), or have application/json as a Accept header.
|
||||
*/
|
||||
|
||||
'capture_ajax' => true,
|
||||
'add_ajax_timing' => false,
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Custom Error Handler for Deprecated warnings
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| When enabled, the Debugbar shows deprecated warnings for Symfony components
|
||||
| in the Messages tab.
|
||||
|
|
||||
*/
|
||||
'error_handler' => false,
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Clockwork integration
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| The Debugbar can emulate the Clockwork headers, so you can use the Chrome
|
||||
| Extension, without the server-side code. It uses Debugbar collectors instead.
|
||||
|
|
||||
*/
|
||||
'clockwork' => false,
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| DataCollectors
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Enable/disable DataCollectors
|
||||
|
|
||||
*/
|
||||
|
||||
'collectors' => [
|
||||
'phpinfo' => true, // Php version
|
||||
'messages' => true, // Messages
|
||||
'time' => true, // Time Datalogger
|
||||
'memory' => true, // Memory usage
|
||||
'exceptions' => true, // Exception displayer
|
||||
'log' => true, // Logs from Monolog (merged in messages if enabled)
|
||||
'db' => true, // Show database (PDO) queries and bindings
|
||||
'views' => true, // Views with their data
|
||||
'route' => true, // Current route information
|
||||
'auth' => false, // Display Laravel authentication status
|
||||
'gate' => true, // Display Laravel Gate checks
|
||||
'session' => true, // Display session data
|
||||
'symfony_request' => true, // Only one can be enabled..
|
||||
'mail' => true, // Catch mail messages
|
||||
'laravel' => false, // Laravel version and environment
|
||||
'events' => false, // All events fired
|
||||
'default_request' => false, // Regular or special Symfony request logger
|
||||
'logs' => false, // Add the latest log messages
|
||||
'files' => false, // Show the included files
|
||||
'config' => false, // Display config settings
|
||||
'cache' => false, // Display cache events
|
||||
'models' => true, // Display models
|
||||
'livewire' => true, // Display Livewire (when available)
|
||||
],
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Extra options
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Configure some DataCollectors
|
||||
|
|
||||
*/
|
||||
|
||||
'options' => [
|
||||
'auth' => [
|
||||
'show_name' => true, // Also show the users name/email in the debugbar
|
||||
],
|
||||
'db' => [
|
||||
'with_params' => true, // Render SQL with the parameters substituted
|
||||
'backtrace' => true, // Use a backtrace to find the origin of the query in your files.
|
||||
'backtrace_exclude_paths' => [], // Paths to exclude from backtrace. (in addition to defaults)
|
||||
'timeline' => false, // Add the queries to the timeline
|
||||
'duration_background' => true, // Show shaded background on each query relative to how long it took to execute.
|
||||
'explain' => [ // Show EXPLAIN output on queries
|
||||
'enabled' => false,
|
||||
'types' => ['SELECT'], // Deprecated setting, is always only SELECT
|
||||
],
|
||||
'hints' => false, // Show hints for common mistakes
|
||||
'show_copy' => false, // Show copy button next to the query,
|
||||
'slow_threshold' => false, // Only track queries that last longer than this time in ms
|
||||
],
|
||||
'mail' => [
|
||||
'full_log' => false,
|
||||
],
|
||||
'views' => [
|
||||
'timeline' => false, // Add the views to the timeline (Experimental)
|
||||
'data' => false, //Note: Can slow down the application, because the data can be quite large..
|
||||
'exclude_paths' => [], // Add the paths which you don't want to appear in the views
|
||||
],
|
||||
'route' => [
|
||||
'label' => true, // show complete route on bar
|
||||
],
|
||||
'logs' => [
|
||||
'file' => null,
|
||||
],
|
||||
'cache' => [
|
||||
'values' => true, // collect cache values
|
||||
],
|
||||
],
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Inject Debugbar in Response
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Usually, the debugbar is added just before </body>, by listening to the
|
||||
| Response after the App is done. If you disable this, you have to add them
|
||||
| in your template yourself. See http://phpdebugbar.com/docs/rendering.html
|
||||
|
|
||||
*/
|
||||
|
||||
'inject' => true,
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| DebugBar route prefix
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Sometimes you want to set route prefix to be used by DebugBar to load
|
||||
| its resources from. Usually the need comes from misconfigured web server or
|
||||
| from trying to overcome bugs like this: http://trac.nginx.org/nginx/ticket/97
|
||||
|
|
||||
*/
|
||||
'route_prefix' => '_debugbar',
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| DebugBar route domain
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| By default DebugBar route served from the same domain that request served.
|
||||
| To override default domain, specify it as a non-empty value.
|
||||
*/
|
||||
'route_domain' => null,
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| DebugBar theme
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Switches between light and dark theme. If set to auto it will respect system preferences
|
||||
| Possible values: auto, light, dark
|
||||
*/
|
||||
'theme' => env('DEBUGBAR_THEME', 'auto'),
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Backtrace stack limit
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| By default, the DebugBar limits the number of frames returned by the 'debug_backtrace()' function.
|
||||
| If you need larger stacktraces, you can increase this number. Setting it to 0 will result in no limit.
|
||||
*/
|
||||
'debug_backtrace_limit' => 50,
|
||||
];
|
||||
@ -0,0 +1,42 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
class CreatePhpdebugbarStorageTable extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function up()
|
||||
{
|
||||
Schema::create('phpdebugbar', function (Blueprint $table) {
|
||||
$table->string('id');
|
||||
$table->longText('data');
|
||||
$table->string('meta_utime');
|
||||
$table->dateTime('meta_datetime');
|
||||
$table->string('meta_uri');
|
||||
$table->string('meta_ip');
|
||||
$table->string('meta_method');
|
||||
|
||||
$table->primary('id');
|
||||
$table->index('meta_utime');
|
||||
$table->index('meta_datetime');
|
||||
$table->index('meta_uri');
|
||||
$table->index('meta_ip');
|
||||
$table->index('meta_method');
|
||||
});
|
||||
}
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function down()
|
||||
{
|
||||
Schema::drop('phpdebugbar');
|
||||
}
|
||||
}
|
||||
213
vendor/barryvdh/laravel-debugbar/readme.md
vendored
Normal file
213
vendor/barryvdh/laravel-debugbar/readme.md
vendored
Normal file
@ -0,0 +1,213 @@
|
||||
## Debugbar for Laravel
|
||||

|
||||
[](http://choosealicense.com/licenses/mit/)
|
||||
[](https://packagist.org/packages/barryvdh/laravel-debugbar)
|
||||
[](https://packagist.org/packages/barryvdh/laravel-debugbar)
|
||||
[](https://fruitcake.nl/)
|
||||
|
||||
This is a package to integrate [PHP Debug Bar](http://phpdebugbar.com/) with Laravel.
|
||||
It includes a ServiceProvider to register the debugbar and attach it to the output. You can publish assets and configure it through Laravel.
|
||||
It bootstraps some Collectors to work with Laravel and implements a couple custom DataCollectors, specific for Laravel.
|
||||
It is configured to display Redirects and (jQuery) Ajax Requests. (Shown in a dropdown)
|
||||
Read [the documentation](http://phpdebugbar.com/docs/) for more configuration options.
|
||||
|
||||

|
||||
|
||||
|
||||
Note: Use the DebugBar only in development. It can slow the application down (because it has to gather data). So when experiencing slowness, try disabling some of the collectors.
|
||||
|
||||
This package includes some custom collectors:
|
||||
- QueryCollector: Show all queries, including binding + timing
|
||||
- RouteCollector: Show information about the current Route.
|
||||
- ViewCollector: Show the currently loaded views. (Optionally: display the shared data)
|
||||
- EventsCollector: Show all events
|
||||
- LaravelCollector: Show the Laravel version and Environment. (disabled by default)
|
||||
- SymfonyRequestCollector: replaces the RequestCollector with more information about the request/response
|
||||
- LogsCollector: Show the latest log entries from the storage logs. (disabled by default)
|
||||
- FilesCollector: Show the files that are included/required by PHP. (disabled by default)
|
||||
- ConfigCollector: Display the values from the config files. (disabled by default)
|
||||
- CacheCollector: Display all cache events. (disabled by default)
|
||||
|
||||
Bootstraps the following collectors for Laravel:
|
||||
- LogCollector: Show all Log messages
|
||||
- SwiftMailCollector and SwiftLogCollector for Mail
|
||||
|
||||
And the default collectors:
|
||||
- PhpInfoCollector
|
||||
- MessagesCollector
|
||||
- TimeDataCollector (With Booting and Application timing)
|
||||
- MemoryCollector
|
||||
- ExceptionsCollector
|
||||
|
||||
It also provides a facade interface (`Debugbar`) for easy logging Messages, Exceptions and Time
|
||||
|
||||
## Installation
|
||||
|
||||
Require this package with composer. It is recommended to only require the package for development.
|
||||
|
||||
```shell
|
||||
composer require barryvdh/laravel-debugbar --dev
|
||||
```
|
||||
|
||||
Laravel uses Package Auto-Discovery, so doesn't require you to manually add the ServiceProvider.
|
||||
|
||||
The Debugbar will be enabled when `APP_DEBUG` is `true`.
|
||||
|
||||
> If you use a catch-all/fallback route, make sure you load the Debugbar ServiceProvider before your own App ServiceProviders.
|
||||
|
||||
### Laravel without auto-discovery:
|
||||
|
||||
If you don't use auto-discovery, add the ServiceProvider to the providers array in config/app.php
|
||||
|
||||
```php
|
||||
Barryvdh\Debugbar\ServiceProvider::class,
|
||||
```
|
||||
|
||||
If you want to use the facade to log messages, add this to your facades in app.php:
|
||||
|
||||
```php
|
||||
'Debugbar' => Barryvdh\Debugbar\Facades\Debugbar::class,
|
||||
```
|
||||
|
||||
The profiler is enabled by default, if you have APP_DEBUG=true. You can override that in the config (`debugbar.enabled`) or by setting `DEBUGBAR_ENABLED` in your `.env`. See more options in `config/debugbar.php`
|
||||
You can also set in your config if you want to include/exclude the vendor files also (FontAwesome, Highlight.js and jQuery). If you already use them in your site, set it to false.
|
||||
You can also only display the js or css vendors, by setting it to 'js' or 'css'. (Highlight.js requires both css + js, so set to `true` for syntax highlighting)
|
||||
|
||||
#### Copy the package config to your local config with the publish command:
|
||||
|
||||
```shell
|
||||
php artisan vendor:publish --provider="Barryvdh\Debugbar\ServiceProvider"
|
||||
```
|
||||
|
||||
### Laravel with Octane:
|
||||
|
||||
Make sure to add LaravelDebugbar to your flush list in `config/octane.php`.
|
||||
|
||||
```php
|
||||
'flush' => [
|
||||
\Barryvdh\Debugbar\LaravelDebugbar::class,
|
||||
],
|
||||
```
|
||||
|
||||
### Lumen:
|
||||
|
||||
For Lumen, register a different Provider in `bootstrap/app.php`:
|
||||
|
||||
```php
|
||||
if (env('APP_DEBUG')) {
|
||||
$app->register(Barryvdh\Debugbar\LumenServiceProvider::class);
|
||||
}
|
||||
```
|
||||
|
||||
To change the configuration, copy the file to your config folder and enable it:
|
||||
|
||||
```php
|
||||
$app->configure('debugbar');
|
||||
```
|
||||
|
||||
## Usage
|
||||
|
||||
You can now add messages using the Facade (when added), using the PSR-3 levels (debug, info, notice, warning, error, critical, alert, emergency):
|
||||
|
||||
```php
|
||||
Debugbar::info($object);
|
||||
Debugbar::error('Error!');
|
||||
Debugbar::warning('Watch out…');
|
||||
Debugbar::addMessage('Another message', 'mylabel');
|
||||
```
|
||||
|
||||
And start/stop timing:
|
||||
|
||||
```php
|
||||
Debugbar::startMeasure('render','Time for rendering');
|
||||
Debugbar::stopMeasure('render');
|
||||
Debugbar::addMeasure('now', LARAVEL_START, microtime(true));
|
||||
Debugbar::measure('My long operation', function() {
|
||||
// Do something…
|
||||
});
|
||||
```
|
||||
|
||||
Or log exceptions:
|
||||
|
||||
```php
|
||||
try {
|
||||
throw new Exception('foobar');
|
||||
} catch (Exception $e) {
|
||||
Debugbar::addThrowable($e);
|
||||
}
|
||||
```
|
||||
|
||||
There are also helper functions available for the most common calls:
|
||||
|
||||
```php
|
||||
// All arguments will be dumped as a debug message
|
||||
debug($var1, $someString, $intValue, $object);
|
||||
|
||||
// `$collection->debug()` will return the collection and dump it as a debug message. Like `$collection->dump()`
|
||||
collect([$var1, $someString])->debug();
|
||||
|
||||
start_measure('render','Time for rendering');
|
||||
stop_measure('render');
|
||||
add_measure('now', LARAVEL_START, microtime(true));
|
||||
measure('My long operation', function() {
|
||||
// Do something…
|
||||
});
|
||||
```
|
||||
|
||||
If you want you can add your own DataCollectors, through the Container or the Facade:
|
||||
|
||||
```php
|
||||
Debugbar::addCollector(new DebugBar\DataCollector\MessagesCollector('my_messages'));
|
||||
//Or via the App container:
|
||||
$debugbar = App::make('debugbar');
|
||||
$debugbar->addCollector(new DebugBar\DataCollector\MessagesCollector('my_messages'));
|
||||
```
|
||||
|
||||
By default, the Debugbar is injected just before `</body>`. If you want to inject the Debugbar yourself,
|
||||
set the config option 'inject' to false and use the renderer yourself and follow http://phpdebugbar.com/docs/rendering.html
|
||||
|
||||
```php
|
||||
$renderer = Debugbar::getJavascriptRenderer();
|
||||
```
|
||||
|
||||
Note: Not using the auto-inject, will disable the Request information, because that is added After the response.
|
||||
You can add the default_request datacollector in the config as alternative.
|
||||
|
||||
## Enabling/Disabling on run time
|
||||
You can enable or disable the debugbar during run time.
|
||||
|
||||
```php
|
||||
\Debugbar::enable();
|
||||
\Debugbar::disable();
|
||||
```
|
||||
|
||||
NB. Once enabled, the collectors are added (and could produce extra overhead), so if you want to use the debugbar in production, disable in the config and only enable when needed.
|
||||
|
||||
|
||||
## Twig Integration
|
||||
|
||||
Laravel Debugbar comes with two Twig Extensions. These are tested with [rcrowe/TwigBridge](https://github.com/rcrowe/TwigBridge) 0.6.x
|
||||
|
||||
Add the following extensions to your TwigBridge config/extensions.php (or register the extensions manually)
|
||||
|
||||
```php
|
||||
'Barryvdh\Debugbar\Twig\Extension\Debug',
|
||||
'Barryvdh\Debugbar\Twig\Extension\Dump',
|
||||
'Barryvdh\Debugbar\Twig\Extension\Stopwatch',
|
||||
```
|
||||
|
||||
The Dump extension will replace the [dump function](http://twig.sensiolabs.org/doc/functions/dump.html) to output variables using the DataFormatter. The Debug extension adds a `debug()` function which passes variables to the Message Collector,
|
||||
instead of showing it directly in the template. It dumps the arguments, or when empty; all context variables.
|
||||
|
||||
```twig
|
||||
{{ debug() }}
|
||||
{{ debug(user, categories) }}
|
||||
```
|
||||
|
||||
The Stopwatch extension adds a [stopwatch tag](http://symfony.com/blog/new-in-symfony-2-4-a-stopwatch-tag-for-twig) similar to the one in Symfony/Silex Twigbridge.
|
||||
|
||||
```twig
|
||||
{% stopwatch "foo" %}
|
||||
…some things that gets timed
|
||||
{% endstopwatch %}
|
||||
```
|
||||
39
vendor/barryvdh/laravel-debugbar/src/Console/ClearCommand.php
vendored
Normal file
39
vendor/barryvdh/laravel-debugbar/src/Console/ClearCommand.php
vendored
Normal file
@ -0,0 +1,39 @@
|
||||
<?php
|
||||
|
||||
namespace Barryvdh\Debugbar\Console;
|
||||
|
||||
use DebugBar\DebugBar;
|
||||
use Illuminate\Console\Command;
|
||||
|
||||
class ClearCommand extends Command
|
||||
{
|
||||
protected $name = 'debugbar:clear';
|
||||
protected $description = 'Clear the Debugbar Storage';
|
||||
protected $debugbar;
|
||||
|
||||
public function __construct(DebugBar $debugbar)
|
||||
{
|
||||
$this->debugbar = $debugbar;
|
||||
|
||||
parent::__construct();
|
||||
}
|
||||
|
||||
public function handle()
|
||||
{
|
||||
$this->debugbar->boot();
|
||||
|
||||
if ($storage = $this->debugbar->getStorage()) {
|
||||
try {
|
||||
$storage->clear();
|
||||
} catch (\InvalidArgumentException $e) {
|
||||
// hide InvalidArgumentException if storage location does not exist
|
||||
if (strpos($e->getMessage(), 'does not exist') === false) {
|
||||
throw $e;
|
||||
}
|
||||
}
|
||||
$this->info('Debugbar Storage cleared!');
|
||||
} else {
|
||||
$this->error('No Debugbar Storage found..');
|
||||
}
|
||||
}
|
||||
}
|
||||
64
vendor/barryvdh/laravel-debugbar/src/Controllers/AssetController.php
vendored
Normal file
64
vendor/barryvdh/laravel-debugbar/src/Controllers/AssetController.php
vendored
Normal file
@ -0,0 +1,64 @@
|
||||
<?php
|
||||
|
||||
namespace Barryvdh\Debugbar\Controllers;
|
||||
|
||||
use Illuminate\Http\Response;
|
||||
|
||||
class AssetController extends BaseController
|
||||
{
|
||||
/**
|
||||
* Return the javascript for the Debugbar
|
||||
*
|
||||
* @return \Symfony\Component\HttpFoundation\Response
|
||||
*/
|
||||
public function js()
|
||||
{
|
||||
$renderer = $this->debugbar->getJavascriptRenderer();
|
||||
|
||||
$content = $renderer->dumpAssetsToString('js');
|
||||
|
||||
$response = new Response(
|
||||
$content,
|
||||
200,
|
||||
[
|
||||
'Content-Type' => 'text/javascript',
|
||||
]
|
||||
);
|
||||
|
||||
return $this->cacheResponse($response);
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the stylesheets for the Debugbar
|
||||
*
|
||||
* @return \Symfony\Component\HttpFoundation\Response
|
||||
*/
|
||||
public function css()
|
||||
{
|
||||
$renderer = $this->debugbar->getJavascriptRenderer();
|
||||
|
||||
$content = $renderer->dumpAssetsToString('css');
|
||||
|
||||
$response = new Response(
|
||||
$content,
|
||||
200,
|
||||
[
|
||||
'Content-Type' => 'text/css',
|
||||
]
|
||||
);
|
||||
|
||||
return $this->cacheResponse($response);
|
||||
}
|
||||
|
||||
/**
|
||||
* Cache the response 1 year (31536000 sec)
|
||||
*/
|
||||
protected function cacheResponse(Response $response)
|
||||
{
|
||||
$response->setSharedMaxAge(31536000);
|
||||
$response->setMaxAge(31536000);
|
||||
$response->setExpires(new \DateTime('+1 year'));
|
||||
|
||||
return $response;
|
||||
}
|
||||
}
|
||||
49
vendor/barryvdh/laravel-debugbar/src/Controllers/BaseController.php
vendored
Normal file
49
vendor/barryvdh/laravel-debugbar/src/Controllers/BaseController.php
vendored
Normal file
@ -0,0 +1,49 @@
|
||||
<?php
|
||||
|
||||
namespace Barryvdh\Debugbar\Controllers;
|
||||
|
||||
use Barryvdh\Debugbar\LaravelDebugbar;
|
||||
use Illuminate\Routing\Controller;
|
||||
use Illuminate\Http\Request;
|
||||
use Laravel\Telescope\Telescope;
|
||||
|
||||
// phpcs:ignoreFile
|
||||
if (class_exists('Illuminate\Routing\Controller')) {
|
||||
|
||||
class BaseController extends Controller
|
||||
{
|
||||
protected $debugbar;
|
||||
|
||||
public function __construct(Request $request, LaravelDebugbar $debugbar)
|
||||
{
|
||||
$this->debugbar = $debugbar;
|
||||
|
||||
if ($request->hasSession()) {
|
||||
$request->session()->reflash();
|
||||
}
|
||||
|
||||
$this->middleware(function ($request, $next) {
|
||||
if (class_exists(Telescope::class)) {
|
||||
Telescope::stopRecording();
|
||||
}
|
||||
return $next($request);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
class BaseController
|
||||
{
|
||||
protected $debugbar;
|
||||
|
||||
public function __construct(Request $request, LaravelDebugbar $debugbar)
|
||||
{
|
||||
$this->debugbar = $debugbar;
|
||||
|
||||
if ($request->hasSession()) {
|
||||
$request->session()->reflash();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
28
vendor/barryvdh/laravel-debugbar/src/Controllers/CacheController.php
vendored
Normal file
28
vendor/barryvdh/laravel-debugbar/src/Controllers/CacheController.php
vendored
Normal file
@ -0,0 +1,28 @@
|
||||
<?php
|
||||
|
||||
namespace Barryvdh\Debugbar\Controllers;
|
||||
|
||||
use Illuminate\Http\Response;
|
||||
|
||||
class CacheController extends BaseController
|
||||
{
|
||||
/**
|
||||
* Forget a cache key
|
||||
*
|
||||
*/
|
||||
public function delete($key, $tags = '')
|
||||
{
|
||||
$cache = app('cache');
|
||||
|
||||
if (!empty($tags)) {
|
||||
$tags = json_decode($tags, true);
|
||||
$cache = $cache->tags($tags);
|
||||
} else {
|
||||
unset($tags);
|
||||
}
|
||||
|
||||
$success = $cache->forget($key);
|
||||
|
||||
return response()->json(compact('success'));
|
||||
}
|
||||
}
|
||||
49
vendor/barryvdh/laravel-debugbar/src/Controllers/OpenHandlerController.php
vendored
Normal file
49
vendor/barryvdh/laravel-debugbar/src/Controllers/OpenHandlerController.php
vendored
Normal file
@ -0,0 +1,49 @@
|
||||
<?php
|
||||
|
||||
namespace Barryvdh\Debugbar\Controllers;
|
||||
|
||||
use Barryvdh\Debugbar\Support\Clockwork\Converter;
|
||||
use DebugBar\OpenHandler;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Http\Response;
|
||||
|
||||
class OpenHandlerController extends BaseController
|
||||
{
|
||||
public function handle(Request $request)
|
||||
{
|
||||
$openHandler = new OpenHandler($this->debugbar);
|
||||
$data = $openHandler->handle($request->input(), false, false);
|
||||
|
||||
return new Response(
|
||||
$data,
|
||||
200,
|
||||
[
|
||||
'Content-Type' => 'application/json'
|
||||
]
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Return Clockwork output
|
||||
*
|
||||
* @param $id
|
||||
* @return mixed
|
||||
* @throws \DebugBar\DebugBarException
|
||||
*/
|
||||
public function clockwork($id)
|
||||
{
|
||||
$request = [
|
||||
'op' => 'get',
|
||||
'id' => $id,
|
||||
];
|
||||
|
||||
$openHandler = new OpenHandler($this->debugbar);
|
||||
$data = $openHandler->handle($request, false, false);
|
||||
|
||||
// Convert to Clockwork
|
||||
$converter = new Converter();
|
||||
$output = $converter->convert(json_decode($data, true));
|
||||
|
||||
return response()->json($output);
|
||||
}
|
||||
}
|
||||
23
vendor/barryvdh/laravel-debugbar/src/Controllers/TelescopeController.php
vendored
Normal file
23
vendor/barryvdh/laravel-debugbar/src/Controllers/TelescopeController.php
vendored
Normal file
@ -0,0 +1,23 @@
|
||||
<?php
|
||||
|
||||
namespace Barryvdh\Debugbar\Controllers;
|
||||
|
||||
use Barryvdh\Debugbar\Support\Clockwork\Converter;
|
||||
use DebugBar\OpenHandler;
|
||||
use Illuminate\Http\Response;
|
||||
use Laravel\Telescope\Contracts\EntriesRepository;
|
||||
use Laravel\Telescope\IncomingEntry;
|
||||
use Laravel\Telescope\Storage\EntryQueryOptions;
|
||||
use Laravel\Telescope\Telescope;
|
||||
|
||||
class TelescopeController extends BaseController
|
||||
{
|
||||
public function show(EntriesRepository $storage, $uuid)
|
||||
{
|
||||
|
||||
$entry = $storage->find($uuid);
|
||||
$result = $storage->get('request', (new EntryQueryOptions())->batchId($entry->batchId))->first();
|
||||
|
||||
return redirect(config('telescope.path') . '/requests/' . $result->id);
|
||||
}
|
||||
}
|
||||
96
vendor/barryvdh/laravel-debugbar/src/DataCollector/CacheCollector.php
vendored
Normal file
96
vendor/barryvdh/laravel-debugbar/src/DataCollector/CacheCollector.php
vendored
Normal file
@ -0,0 +1,96 @@
|
||||
<?php
|
||||
|
||||
namespace Barryvdh\Debugbar\DataCollector;
|
||||
|
||||
use DebugBar\DataCollector\TimeDataCollector;
|
||||
use Illuminate\Cache\Events\CacheEvent;
|
||||
use Illuminate\Cache\Events\CacheHit;
|
||||
use Illuminate\Cache\Events\CacheMissed;
|
||||
use Illuminate\Cache\Events\KeyForgotten;
|
||||
use Illuminate\Cache\Events\KeyWritten;
|
||||
use Illuminate\Events\Dispatcher;
|
||||
|
||||
class CacheCollector extends TimeDataCollector
|
||||
{
|
||||
/** @var bool */
|
||||
protected $collectValues;
|
||||
|
||||
/** @var array */
|
||||
protected $classMap = [
|
||||
CacheHit::class => 'hit',
|
||||
CacheMissed::class => 'missed',
|
||||
KeyWritten::class => 'written',
|
||||
KeyForgotten::class => 'forgotten',
|
||||
];
|
||||
|
||||
public function __construct($requestStartTime, $collectValues)
|
||||
{
|
||||
parent::__construct();
|
||||
|
||||
$this->collectValues = $collectValues;
|
||||
}
|
||||
|
||||
public function onCacheEvent(CacheEvent $event)
|
||||
{
|
||||
$class = get_class($event);
|
||||
$params = get_object_vars($event);
|
||||
|
||||
$label = $this->classMap[$class];
|
||||
|
||||
if (isset($params['value'])) {
|
||||
if ($this->collectValues) {
|
||||
$params['value'] = htmlspecialchars($this->getDataFormatter()->formatVar($event->value));
|
||||
} else {
|
||||
unset($params['value']);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (!empty($params['key']) && in_array($label, ['hit', 'written'])) {
|
||||
$params['delete'] = route('debugbar.cache.delete', [
|
||||
'key' => urlencode($params['key']),
|
||||
'tags' => !empty($params['tags']) ? json_encode($params['tags']) : '',
|
||||
]);
|
||||
}
|
||||
|
||||
$time = microtime(true);
|
||||
$this->addMeasure($label . "\t" . $event->key, $time, $time, $params);
|
||||
}
|
||||
|
||||
|
||||
public function subscribe(Dispatcher $dispatcher)
|
||||
{
|
||||
foreach ($this->classMap as $eventClass => $type) {
|
||||
$dispatcher->listen($eventClass, [$this, 'onCacheEvent']);
|
||||
}
|
||||
}
|
||||
|
||||
public function collect()
|
||||
{
|
||||
$data = parent::collect();
|
||||
$data['nb_measures'] = count($data['measures']);
|
||||
|
||||
return $data;
|
||||
}
|
||||
|
||||
public function getName()
|
||||
{
|
||||
return 'cache';
|
||||
}
|
||||
|
||||
public function getWidgets()
|
||||
{
|
||||
return [
|
||||
'cache' => [
|
||||
'icon' => 'clipboard',
|
||||
'widget' => 'PhpDebugBar.Widgets.LaravelCacheWidget',
|
||||
'map' => 'cache',
|
||||
'default' => '{}',
|
||||
],
|
||||
'cache:badge' => [
|
||||
'map' => 'cache.nb_measures',
|
||||
'default' => 'null',
|
||||
],
|
||||
];
|
||||
}
|
||||
}
|
||||
116
vendor/barryvdh/laravel-debugbar/src/DataCollector/EventCollector.php
vendored
Normal file
116
vendor/barryvdh/laravel-debugbar/src/DataCollector/EventCollector.php
vendored
Normal file
@ -0,0 +1,116 @@
|
||||
<?php
|
||||
|
||||
namespace Barryvdh\Debugbar\DataCollector;
|
||||
|
||||
use Barryvdh\Debugbar\DataFormatter\SimpleFormatter;
|
||||
use DebugBar\DataCollector\TimeDataCollector;
|
||||
use Illuminate\Contracts\Events\Dispatcher;
|
||||
use Illuminate\Support\Str;
|
||||
use Symfony\Component\VarDumper\Cloner\VarCloner;
|
||||
|
||||
class EventCollector extends TimeDataCollector
|
||||
{
|
||||
/** @var Dispatcher */
|
||||
protected $events;
|
||||
|
||||
/** @var integer */
|
||||
protected $previousTime;
|
||||
|
||||
public function __construct($requestStartTime = null)
|
||||
{
|
||||
parent::__construct($requestStartTime);
|
||||
$this->previousTime = microtime(true);
|
||||
$this->setDataFormatter(new SimpleFormatter());
|
||||
}
|
||||
|
||||
public function onWildcardEvent($name = null, $data = [])
|
||||
{
|
||||
$params = $this->prepareParams($data);
|
||||
$currentTime = microtime(true);
|
||||
|
||||
// Find all listeners for the current event
|
||||
foreach ($this->events->getListeners($name) as $i => $listener) {
|
||||
// Check if it's an object + method name
|
||||
if (is_array($listener) && count($listener) > 1 && is_object($listener[0])) {
|
||||
list($class, $method) = $listener;
|
||||
|
||||
// Skip this class itself
|
||||
if ($class instanceof static) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// Format the listener to readable format
|
||||
$listener = get_class($class) . '@' . $method;
|
||||
|
||||
// Handle closures
|
||||
} elseif ($listener instanceof \Closure) {
|
||||
$reflector = new \ReflectionFunction($listener);
|
||||
|
||||
// Skip our own listeners
|
||||
if ($reflector->getNamespaceName() == 'Barryvdh\Debugbar') {
|
||||
continue;
|
||||
}
|
||||
|
||||
// Format the closure to a readable format
|
||||
$filename = ltrim(str_replace(base_path(), '', $reflector->getFileName()), '/');
|
||||
$lines = $reflector->getStartLine() . '-' . $reflector->getEndLine();
|
||||
$listener = $reflector->getName() . ' (' . $filename . ':' . $lines . ')';
|
||||
} else {
|
||||
// Not sure if this is possible, but to prevent edge cases
|
||||
$listener = $this->getDataFormatter()->formatVar($listener);
|
||||
}
|
||||
|
||||
$params['listeners.' . $i] = $listener;
|
||||
}
|
||||
$this->addMeasure($name, $this->previousTime, $currentTime, $params);
|
||||
$this->previousTime = $currentTime;
|
||||
}
|
||||
|
||||
public function subscribe(Dispatcher $events)
|
||||
{
|
||||
$this->events = $events;
|
||||
$events->listen('*', [$this, 'onWildcardEvent']);
|
||||
}
|
||||
|
||||
protected function prepareParams($params)
|
||||
{
|
||||
$data = [];
|
||||
foreach ($params as $key => $value) {
|
||||
if (is_object($value) && Str::is('Illuminate\*\Events\*', get_class($value))) {
|
||||
$value = $this->prepareParams(get_object_vars($value));
|
||||
}
|
||||
$data[$key] = htmlentities($this->getDataFormatter()->formatVar($value), ENT_QUOTES, 'UTF-8', false);
|
||||
}
|
||||
|
||||
return $data;
|
||||
}
|
||||
|
||||
public function collect()
|
||||
{
|
||||
$data = parent::collect();
|
||||
$data['nb_measures'] = count($data['measures']);
|
||||
|
||||
return $data;
|
||||
}
|
||||
|
||||
public function getName()
|
||||
{
|
||||
return 'event';
|
||||
}
|
||||
|
||||
public function getWidgets()
|
||||
{
|
||||
return [
|
||||
"events" => [
|
||||
"icon" => "tasks",
|
||||
"widget" => "PhpDebugBar.Widgets.TimelineWidget",
|
||||
"map" => "event",
|
||||
"default" => "{}",
|
||||
],
|
||||
'events:badge' => [
|
||||
'map' => 'event.nb_measures',
|
||||
'default' => 0,
|
||||
],
|
||||
];
|
||||
}
|
||||
}
|
||||
136
vendor/barryvdh/laravel-debugbar/src/DataCollector/FilesCollector.php
vendored
Normal file
136
vendor/barryvdh/laravel-debugbar/src/DataCollector/FilesCollector.php
vendored
Normal file
@ -0,0 +1,136 @@
|
||||
<?php
|
||||
|
||||
namespace Barryvdh\Debugbar\DataCollector;
|
||||
|
||||
use DebugBar\DataCollector\DataCollector;
|
||||
use DebugBar\DataCollector\Renderable;
|
||||
use Illuminate\Container\Container;
|
||||
|
||||
class FilesCollector extends DataCollector implements Renderable
|
||||
{
|
||||
/** @var \Illuminate\Container\Container */
|
||||
protected $app;
|
||||
protected $basePath;
|
||||
|
||||
/**
|
||||
* @param \Illuminate\Container\Container $app
|
||||
*/
|
||||
public function __construct(Container $app = null)
|
||||
{
|
||||
$this->app = $app;
|
||||
$this->basePath = base_path();
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public function collect()
|
||||
{
|
||||
$files = $this->getIncludedFiles();
|
||||
$compiled = $this->getCompiledFiles();
|
||||
|
||||
$included = [];
|
||||
$alreadyCompiled = [];
|
||||
foreach ($files as $file) {
|
||||
// Skip the files from Debugbar, they are only loaded for Debugging and confuse the output.
|
||||
// Of course some files are stil always loaded (ServiceProvider, Facade etc)
|
||||
if (
|
||||
strpos($file, 'vendor/maximebf/debugbar/src') !== false || strpos(
|
||||
$file,
|
||||
'vendor/barryvdh/laravel-debugbar/src'
|
||||
) !== false
|
||||
) {
|
||||
continue;
|
||||
} elseif (!in_array($file, $compiled)) {
|
||||
$included[] = [
|
||||
'message' => "'" . $this->stripBasePath($file) . "',",
|
||||
// Use PHP syntax so we can copy-paste to compile config file.
|
||||
'is_string' => true,
|
||||
];
|
||||
} else {
|
||||
$alreadyCompiled[] = [
|
||||
'message' => "* '" . $this->stripBasePath($file) . "',",
|
||||
// Mark with *, so know they are compiled anyways.
|
||||
'is_string' => true,
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
// First the included files, then those that are going to be compiled.
|
||||
$messages = array_merge($included, $alreadyCompiled);
|
||||
|
||||
return [
|
||||
'messages' => $messages,
|
||||
'count' => count($included),
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the files included on load.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
protected function getIncludedFiles()
|
||||
{
|
||||
return get_included_files();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the files that are going to be compiled, so they aren't as important.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
protected function getCompiledFiles()
|
||||
{
|
||||
if ($this->app && class_exists('Illuminate\Foundation\Console\OptimizeCommand')) {
|
||||
$reflector = new \ReflectionClass('Illuminate\Foundation\Console\OptimizeCommand');
|
||||
$path = dirname($reflector->getFileName()) . '/Optimize/config.php';
|
||||
|
||||
if (file_exists($path)) {
|
||||
$app = $this->app;
|
||||
$core = require $path;
|
||||
return array_merge($core, $app['config']['compile']);
|
||||
}
|
||||
}
|
||||
return [];
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove the basePath from the paths, so they are relative to the base
|
||||
*
|
||||
* @param $path
|
||||
* @return string
|
||||
*/
|
||||
protected function stripBasePath($path)
|
||||
{
|
||||
return ltrim(str_replace($this->basePath, '', $path), '/');
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public function getWidgets()
|
||||
{
|
||||
$name = $this->getName();
|
||||
return [
|
||||
"$name" => [
|
||||
"icon" => "files-o",
|
||||
"widget" => "PhpDebugBar.Widgets.MessagesWidget",
|
||||
"map" => "$name.messages",
|
||||
"default" => "{}"
|
||||
],
|
||||
"$name:badge" => [
|
||||
"map" => "$name.count",
|
||||
"default" => "null"
|
||||
]
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public function getName()
|
||||
{
|
||||
return 'files';
|
||||
}
|
||||
}
|
||||
54
vendor/barryvdh/laravel-debugbar/src/DataCollector/GateCollector.php
vendored
Normal file
54
vendor/barryvdh/laravel-debugbar/src/DataCollector/GateCollector.php
vendored
Normal file
@ -0,0 +1,54 @@
|
||||
<?php
|
||||
|
||||
namespace Barryvdh\Debugbar\DataCollector;
|
||||
|
||||
use Barryvdh\Debugbar\DataFormatter\SimpleFormatter;
|
||||
use DebugBar\DataCollector\MessagesCollector;
|
||||
use Illuminate\Auth\Access\Response;
|
||||
use Illuminate\Contracts\Auth\Access\Gate;
|
||||
use Illuminate\Contracts\Auth\Authenticatable;
|
||||
use Symfony\Component\VarDumper\Cloner\VarCloner;
|
||||
use Illuminate\Support\Str;
|
||||
|
||||
/**
|
||||
* Collector for Laravel's Auth provider
|
||||
*/
|
||||
class GateCollector extends MessagesCollector
|
||||
{
|
||||
/**
|
||||
* @param Gate $gate
|
||||
*/
|
||||
public function __construct(Gate $gate)
|
||||
{
|
||||
parent::__construct('gate');
|
||||
$this->setDataFormatter(new SimpleFormatter());
|
||||
$gate->after(function ($user, $ability, $result, $arguments = []) {
|
||||
$this->addCheck($user, $ability, $result, $arguments);
|
||||
});
|
||||
}
|
||||
|
||||
public function addCheck($user, $ability, $result, $arguments = [])
|
||||
{
|
||||
$userKey = 'user';
|
||||
$userId = null;
|
||||
|
||||
if ($user) {
|
||||
$userKey = Str::snake(class_basename($user));
|
||||
$userId = $user instanceof Authenticatable ? $user->getAuthIdentifier() : $user->id;
|
||||
}
|
||||
|
||||
$label = $result ? 'success' : 'error';
|
||||
|
||||
// Response::allowed() was added in Laravel 6.x
|
||||
if ($result instanceof Response && method_exists($result, 'allowed')) {
|
||||
$label = $result->allowed() ? 'success' : 'error';
|
||||
}
|
||||
|
||||
$this->addMessage([
|
||||
'ability' => $ability,
|
||||
'result' => $result,
|
||||
$userKey => $userId,
|
||||
'arguments' => $this->getDataFormatter()->formatVar($arguments),
|
||||
], $label, false);
|
||||
}
|
||||
}
|
||||
71
vendor/barryvdh/laravel-debugbar/src/DataCollector/LaravelCollector.php
vendored
Normal file
71
vendor/barryvdh/laravel-debugbar/src/DataCollector/LaravelCollector.php
vendored
Normal file
@ -0,0 +1,71 @@
|
||||
<?php
|
||||
|
||||
namespace Barryvdh\Debugbar\DataCollector;
|
||||
|
||||
use DebugBar\DataCollector\DataCollector;
|
||||
use DebugBar\DataCollector\Renderable;
|
||||
use Illuminate\Foundation\Application;
|
||||
|
||||
class LaravelCollector extends DataCollector implements Renderable
|
||||
{
|
||||
/** @var \Illuminate\Foundation\Application $app */
|
||||
protected $app;
|
||||
|
||||
/**
|
||||
* @param Application $app
|
||||
*/
|
||||
public function __construct(Application $app = null)
|
||||
{
|
||||
$this->app = $app;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public function collect()
|
||||
{
|
||||
// Fallback if not injected
|
||||
$app = $this->app ?: app();
|
||||
|
||||
return [
|
||||
"version" => $app::VERSION,
|
||||
"environment" => $app->environment(),
|
||||
"locale" => $app->getLocale(),
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public function getName()
|
||||
{
|
||||
return 'laravel';
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public function getWidgets()
|
||||
{
|
||||
return [
|
||||
"version" => [
|
||||
"icon" => "github",
|
||||
"tooltip" => "Laravel Version",
|
||||
"map" => "laravel.version",
|
||||
"default" => ""
|
||||
],
|
||||
"environment" => [
|
||||
"icon" => "desktop",
|
||||
"tooltip" => "Environment",
|
||||
"map" => "laravel.environment",
|
||||
"default" => ""
|
||||
],
|
||||
"locale" => [
|
||||
"icon" => "flag",
|
||||
"tooltip" => "Current locale",
|
||||
"map" => "laravel.locale",
|
||||
"default" => "",
|
||||
],
|
||||
];
|
||||
}
|
||||
}
|
||||
82
vendor/barryvdh/laravel-debugbar/src/DataCollector/LivewireCollector.php
vendored
Normal file
82
vendor/barryvdh/laravel-debugbar/src/DataCollector/LivewireCollector.php
vendored
Normal file
@ -0,0 +1,82 @@
|
||||
<?php
|
||||
|
||||
namespace Barryvdh\Debugbar\DataCollector;
|
||||
|
||||
use DebugBar\DataCollector\DataCollector;
|
||||
use DebugBar\DataCollector\DataCollectorInterface;
|
||||
use DebugBar\DataCollector\Renderable;
|
||||
use Illuminate\Contracts\Events\Dispatcher;
|
||||
use Illuminate\Contracts\View\View;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Arr;
|
||||
use Illuminate\Support\Fluent;
|
||||
use Illuminate\Support\Str;
|
||||
use Livewire\Livewire;
|
||||
|
||||
/**
|
||||
* Collector for Models.
|
||||
*/
|
||||
class LivewireCollector extends DataCollector implements DataCollectorInterface, Renderable
|
||||
{
|
||||
public $data = [];
|
||||
|
||||
public function __construct(Request $request)
|
||||
{
|
||||
// Listen to Livewire views
|
||||
Livewire::listen('view:render', function (View $view) use ($request) {
|
||||
/** @var \Livewire\Component $component */
|
||||
$component = $view->getData()['_instance'];
|
||||
|
||||
// Create an unique name for each compoent
|
||||
$key = $component->getName() . ' #' . $component->id;
|
||||
|
||||
$data = [
|
||||
'data' => $component->getPublicPropertiesDefinedBySubClass(),
|
||||
];
|
||||
|
||||
if ($request->request->get('id') == $component->id) {
|
||||
$data['oldData'] = $request->request->get('data');
|
||||
$data['actionQueue'] = $request->request->get('actionQueue');
|
||||
}
|
||||
|
||||
$data['name'] = $component->getName();
|
||||
$data['view'] = $view->name();
|
||||
$data['component'] = get_class($component);
|
||||
$data['id'] = $component->id;
|
||||
|
||||
$this->data[$key] = $this->formatVar($data);
|
||||
});
|
||||
}
|
||||
|
||||
public function collect()
|
||||
{
|
||||
return ['data' => $this->data, 'count' => count($this->data)];
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public function getName()
|
||||
{
|
||||
return 'livewire';
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public function getWidgets()
|
||||
{
|
||||
return [
|
||||
"livewire" => [
|
||||
"icon" => "bolt",
|
||||
"widget" => "PhpDebugBar.Widgets.VariableListWidget",
|
||||
"map" => "livewire.data",
|
||||
"default" => "{}"
|
||||
],
|
||||
'livewire:badge' => [
|
||||
'map' => 'livewire.count',
|
||||
'default' => 0
|
||||
]
|
||||
];
|
||||
}
|
||||
}
|
||||
143
vendor/barryvdh/laravel-debugbar/src/DataCollector/LogsCollector.php
vendored
Normal file
143
vendor/barryvdh/laravel-debugbar/src/DataCollector/LogsCollector.php
vendored
Normal file
@ -0,0 +1,143 @@
|
||||
<?php
|
||||
|
||||
namespace Barryvdh\Debugbar\DataCollector;
|
||||
|
||||
use DebugBar\DataCollector\MessagesCollector;
|
||||
use Psr\Log\LogLevel;
|
||||
use ReflectionClass;
|
||||
|
||||
class LogsCollector extends MessagesCollector
|
||||
{
|
||||
protected $lines = 124;
|
||||
|
||||
public function __construct($path = null, $name = 'logs')
|
||||
{
|
||||
parent::__construct($name);
|
||||
|
||||
$path = $path ?: $this->getLogsFile();
|
||||
$this->getStorageLogs($path);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the path to the logs file
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getLogsFile()
|
||||
{
|
||||
// default daily rotating logs (Laravel 5.0)
|
||||
$path = storage_path() . '/logs/laravel-' . date('Y-m-d') . '.log';
|
||||
|
||||
// single file logs
|
||||
if (!file_exists($path)) {
|
||||
$path = storage_path() . '/logs/laravel.log';
|
||||
}
|
||||
|
||||
return $path;
|
||||
}
|
||||
|
||||
/**
|
||||
* get logs apache in app/storage/logs
|
||||
* only 24 last of current day
|
||||
*
|
||||
* @param string $path
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function getStorageLogs($path)
|
||||
{
|
||||
if (!file_exists($path)) {
|
||||
return;
|
||||
}
|
||||
|
||||
//Load the latest lines, guessing about 15x the number of log entries (for stack traces etc)
|
||||
$file = implode("", $this->tailFile($path, $this->lines));
|
||||
|
||||
foreach ($this->getLogs($file) as $log) {
|
||||
$this->addMessage($log['header'] . $log['stack'], $log['level'], false);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* By Ain Tohvri (ain)
|
||||
* http://tekkie.flashbit.net/php/tail-functionality-in-php
|
||||
* @param string $file
|
||||
* @param int $lines
|
||||
* @return array
|
||||
*/
|
||||
protected function tailFile($file, $lines)
|
||||
{
|
||||
$handle = fopen($file, "r");
|
||||
$linecounter = $lines;
|
||||
$pos = -2;
|
||||
$beginning = false;
|
||||
$text = [];
|
||||
while ($linecounter > 0) {
|
||||
$t = " ";
|
||||
while ($t != "\n") {
|
||||
if (fseek($handle, $pos, SEEK_END) == -1) {
|
||||
$beginning = true;
|
||||
break;
|
||||
}
|
||||
$t = fgetc($handle);
|
||||
$pos--;
|
||||
}
|
||||
$linecounter--;
|
||||
if ($beginning) {
|
||||
rewind($handle);
|
||||
}
|
||||
$text[$lines - $linecounter - 1] = fgets($handle);
|
||||
if ($beginning) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
fclose($handle);
|
||||
return array_reverse($text);
|
||||
}
|
||||
|
||||
/**
|
||||
* Search a string for log entries
|
||||
* Based on https://github.com/mikemand/logviewer/blob/master/src/Kmd/Logviewer/Logviewer.php by mikemand
|
||||
*
|
||||
* @param $file
|
||||
* @return array
|
||||
*/
|
||||
public function getLogs($file)
|
||||
{
|
||||
$pattern = "/\[\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\].*/";
|
||||
|
||||
$log_levels = $this->getLevels();
|
||||
|
||||
// There has GOT to be a better way of doing this...
|
||||
preg_match_all($pattern, $file, $headings);
|
||||
$log_data = preg_split($pattern, $file);
|
||||
|
||||
$log = [];
|
||||
foreach ($headings as $h) {
|
||||
for ($i = 0, $j = count($h); $i < $j; $i++) {
|
||||
foreach ($log_levels as $ll) {
|
||||
if (strpos(strtolower($h[$i]), strtolower('.' . $ll))) {
|
||||
$log[] = ['level' => $ll, 'header' => $h[$i], 'stack' => $log_data[$i]];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$log = array_reverse($log);
|
||||
|
||||
return $log;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the log levels from psr/log.
|
||||
* Based on https://github.com/mikemand/logviewer/blob/master/src/Kmd/Logviewer/Logviewer.php by mikemand
|
||||
*
|
||||
* @access public
|
||||
* @return array
|
||||
*/
|
||||
public function getLevels()
|
||||
{
|
||||
$class = new ReflectionClass(new LogLevel());
|
||||
return $class->getConstants();
|
||||
}
|
||||
}
|
||||
65
vendor/barryvdh/laravel-debugbar/src/DataCollector/ModelsCollector.php
vendored
Normal file
65
vendor/barryvdh/laravel-debugbar/src/DataCollector/ModelsCollector.php
vendored
Normal file
@ -0,0 +1,65 @@
|
||||
<?php
|
||||
|
||||
namespace Barryvdh\Debugbar\DataCollector;
|
||||
|
||||
use DebugBar\DataCollector\DataCollector;
|
||||
use DebugBar\DataCollector\DataCollectorInterface;
|
||||
use DebugBar\DataCollector\Renderable;
|
||||
use Illuminate\Contracts\Events\Dispatcher;
|
||||
|
||||
/**
|
||||
* Collector for Models.
|
||||
*/
|
||||
class ModelsCollector extends DataCollector implements DataCollectorInterface, Renderable
|
||||
{
|
||||
public $models = [];
|
||||
public $count = 0;
|
||||
|
||||
/**
|
||||
* @param Dispatcher $events
|
||||
*/
|
||||
public function __construct(Dispatcher $events)
|
||||
{
|
||||
$events->listen('eloquent.retrieved:*', function ($event, $models) {
|
||||
foreach (array_filter($models) as $model) {
|
||||
$class = get_class($model);
|
||||
$this->models[$class] = ($this->models[$class] ?? 0) + 1;
|
||||
$this->count++;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public function collect()
|
||||
{
|
||||
ksort($this->models, SORT_NUMERIC);
|
||||
|
||||
return ['data' => array_reverse($this->models), 'count' => $this->count];
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public function getName()
|
||||
{
|
||||
return 'models';
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public function getWidgets()
|
||||
{
|
||||
return [
|
||||
"models" => [
|
||||
"icon" => "cubes",
|
||||
"widget" => "PhpDebugBar.Widgets.HtmlVariableListWidget",
|
||||
"map" => "models.data",
|
||||
"default" => "{}"
|
||||
],
|
||||
'models:badge' => [
|
||||
'map' => 'models.count',
|
||||
'default' => 0
|
||||
]
|
||||
];
|
||||
}
|
||||
}
|
||||
168
vendor/barryvdh/laravel-debugbar/src/DataCollector/MultiAuthCollector.php
vendored
Normal file
168
vendor/barryvdh/laravel-debugbar/src/DataCollector/MultiAuthCollector.php
vendored
Normal file
@ -0,0 +1,168 @@
|
||||
<?php
|
||||
|
||||
namespace Barryvdh\Debugbar\DataCollector;
|
||||
|
||||
use DebugBar\DataCollector\DataCollector;
|
||||
use DebugBar\DataCollector\Renderable;
|
||||
use Illuminate\Auth\Recaller;
|
||||
use Illuminate\Auth\SessionGuard;
|
||||
use Illuminate\Contracts\Auth\Authenticatable;
|
||||
use Illuminate\Contracts\Auth\Guard;
|
||||
use Illuminate\Support\Str;
|
||||
use Illuminate\Contracts\Support\Arrayable;
|
||||
|
||||
/**
|
||||
* Collector for Laravel's Auth provider
|
||||
*/
|
||||
class MultiAuthCollector extends DataCollector implements Renderable
|
||||
{
|
||||
/** @var array $guards */
|
||||
protected $guards;
|
||||
|
||||
/** @var \Illuminate\Auth\AuthManager */
|
||||
protected $auth;
|
||||
|
||||
/** @var bool */
|
||||
protected $showName = false;
|
||||
|
||||
/**
|
||||
* @param \Illuminate\Auth\AuthManager $auth
|
||||
* @param array $guards
|
||||
*/
|
||||
public function __construct($auth, $guards)
|
||||
{
|
||||
$this->auth = $auth;
|
||||
$this->guards = $guards;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set to show the users name/email
|
||||
* @param bool $showName
|
||||
*/
|
||||
public function setShowName($showName)
|
||||
{
|
||||
$this->showName = (bool) $showName;
|
||||
}
|
||||
|
||||
/**
|
||||
* @{inheritDoc}
|
||||
*/
|
||||
public function collect()
|
||||
{
|
||||
$data = [
|
||||
'guards' => [],
|
||||
];
|
||||
$names = '';
|
||||
|
||||
foreach ($this->guards as $guardName => $config) {
|
||||
try {
|
||||
$guard = $this->auth->guard($guardName);
|
||||
if ($this->hasUser($guard)) {
|
||||
$user = $guard->user();
|
||||
|
||||
if (!is_null($user)) {
|
||||
$data['guards'][$guardName] = $this->getUserInformation($user);
|
||||
$names .= $guardName . ": " . $data['guards'][$guardName]['name'] . ', ';
|
||||
}
|
||||
} else {
|
||||
$data['guards'][$guardName] = null;
|
||||
}
|
||||
} catch (\Exception $e) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
foreach ($data['guards'] as $key => $var) {
|
||||
if (!is_string($data['guards'][$key])) {
|
||||
$data['guards'][$key] = $this->formatVar($var);
|
||||
}
|
||||
}
|
||||
|
||||
$data['names'] = rtrim($names, ', ');
|
||||
|
||||
return $data;
|
||||
}
|
||||
|
||||
private function hasUser(Guard $guard)
|
||||
{
|
||||
if (method_exists($guard, 'hasUser')) {
|
||||
return $guard->hasUser();
|
||||
}
|
||||
|
||||
// For Laravel 5.5
|
||||
if (method_exists($guard, 'alreadyAuthenticated')) {
|
||||
return $guard->alreadyAuthenticated();
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get displayed user information
|
||||
* @param \Illuminate\Auth\UserInterface $user
|
||||
* @return array
|
||||
*/
|
||||
protected function getUserInformation($user = null)
|
||||
{
|
||||
// Defaults
|
||||
if (is_null($user)) {
|
||||
return [
|
||||
'name' => 'Guest',
|
||||
'user' => ['guest' => true],
|
||||
];
|
||||
}
|
||||
|
||||
// The default auth identifer is the ID number, which isn't all that
|
||||
// useful. Try username and email.
|
||||
$identifier = $user instanceof Authenticatable ? $user->getAuthIdentifier() : $user->id;
|
||||
if (is_numeric($identifier)) {
|
||||
try {
|
||||
if (isset($user->username)) {
|
||||
$identifier = $user->username;
|
||||
} elseif (isset($user->email)) {
|
||||
$identifier = $user->email;
|
||||
}
|
||||
} catch (\Throwable $e) {
|
||||
}
|
||||
}
|
||||
|
||||
return [
|
||||
'name' => $identifier,
|
||||
'user' => $user instanceof Arrayable ? $user->toArray() : $user,
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* @{inheritDoc}
|
||||
*/
|
||||
public function getName()
|
||||
{
|
||||
return 'auth';
|
||||
}
|
||||
|
||||
/**
|
||||
* @{inheritDoc}
|
||||
*/
|
||||
public function getWidgets()
|
||||
{
|
||||
$widgets = [
|
||||
"auth" => [
|
||||
"icon" => "lock",
|
||||
"widget" => "PhpDebugBar.Widgets.VariableListWidget",
|
||||
"map" => "auth.guards",
|
||||
"default" => "{}"
|
||||
]
|
||||
];
|
||||
|
||||
if ($this->showName) {
|
||||
$widgets['auth.name'] = [
|
||||
'icon' => 'user',
|
||||
'tooltip' => 'Auth status',
|
||||
'map' => 'auth.names',
|
||||
'default' => '',
|
||||
];
|
||||
}
|
||||
|
||||
return $widgets;
|
||||
}
|
||||
}
|
||||
18
vendor/barryvdh/laravel-debugbar/src/DataCollector/PhpInfoCollector.php
vendored
Normal file
18
vendor/barryvdh/laravel-debugbar/src/DataCollector/PhpInfoCollector.php
vendored
Normal file
@ -0,0 +1,18 @@
|
||||
<?php
|
||||
|
||||
namespace Barryvdh\Debugbar\DataCollector;
|
||||
|
||||
use DebugBar\DataCollector\PhpInfoCollector as DebugBarPhpInfoCollector;
|
||||
|
||||
class PhpInfoCollector extends DebugBarPhpInfoCollector
|
||||
{
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
public function getWidgets()
|
||||
{
|
||||
return tap(parent::getWidgets(), function (&$widgets) {
|
||||
data_set($widgets, 'php_version.tooltip', 'PHP Version');
|
||||
});
|
||||
}
|
||||
}
|
||||
624
vendor/barryvdh/laravel-debugbar/src/DataCollector/QueryCollector.php
vendored
Normal file
624
vendor/barryvdh/laravel-debugbar/src/DataCollector/QueryCollector.php
vendored
Normal file
@ -0,0 +1,624 @@
|
||||
<?php
|
||||
|
||||
namespace Barryvdh\Debugbar\DataCollector;
|
||||
|
||||
use DebugBar\DataCollector\PDO\PDOCollector;
|
||||
use DebugBar\DataCollector\TimeDataCollector;
|
||||
use Illuminate\Support\Str;
|
||||
|
||||
/**
|
||||
* Collects data about SQL statements executed with PDO
|
||||
*/
|
||||
class QueryCollector extends PDOCollector
|
||||
{
|
||||
protected $timeCollector;
|
||||
protected $queries = [];
|
||||
protected $renderSqlWithParams = false;
|
||||
protected $findSource = false;
|
||||
protected $middleware = [];
|
||||
protected $durationBackground = true;
|
||||
protected $explainQuery = false;
|
||||
protected $explainTypes = ['SELECT']; // ['SELECT', 'INSERT', 'UPDATE', 'DELETE']; for MySQL 5.6.3+
|
||||
protected $showHints = false;
|
||||
protected $showCopyButton = false;
|
||||
protected $reflection = [];
|
||||
protected $backtraceExcludePaths = [
|
||||
'/vendor/laravel/framework/src/Illuminate/Support',
|
||||
'/vendor/laravel/framework/src/Illuminate/Database',
|
||||
'/vendor/laravel/framework/src/Illuminate/Events',
|
||||
'/vendor/october/rain',
|
||||
'/vendor/barryvdh/laravel-debugbar',
|
||||
];
|
||||
|
||||
/**
|
||||
* @param TimeDataCollector $timeCollector
|
||||
*/
|
||||
public function __construct(TimeDataCollector $timeCollector = null)
|
||||
{
|
||||
$this->timeCollector = $timeCollector;
|
||||
}
|
||||
|
||||
/**
|
||||
* Renders the SQL of traced statements with params embedded
|
||||
*
|
||||
* @param boolean $enabled
|
||||
* @param string $quotationChar NOT USED
|
||||
*/
|
||||
public function setRenderSqlWithParams($enabled = true, $quotationChar = "'")
|
||||
{
|
||||
$this->renderSqlWithParams = $enabled;
|
||||
}
|
||||
|
||||
/**
|
||||
* Show or hide the hints in the parameters
|
||||
*
|
||||
* @param boolean $enabled
|
||||
*/
|
||||
public function setShowHints($enabled = true)
|
||||
{
|
||||
$this->showHints = $enabled;
|
||||
}
|
||||
|
||||
/**
|
||||
* Show or hide copy button next to the queries
|
||||
*
|
||||
* @param boolean $enabled
|
||||
*/
|
||||
public function setShowCopyButton($enabled = true)
|
||||
{
|
||||
$this->showCopyButton = $enabled;
|
||||
}
|
||||
|
||||
/**
|
||||
* Enable/disable finding the source
|
||||
*
|
||||
* @param bool $value
|
||||
* @param array $middleware
|
||||
*/
|
||||
public function setFindSource($value, array $middleware)
|
||||
{
|
||||
$this->findSource = (bool) $value;
|
||||
$this->middleware = $middleware;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set additional paths to exclude from the backtrace
|
||||
*
|
||||
* @param array $excludePaths Array of file paths to exclude from backtrace
|
||||
*/
|
||||
public function mergeBacktraceExcludePaths(array $excludePaths)
|
||||
{
|
||||
$this->backtraceExcludePaths = array_merge($this->backtraceExcludePaths, $excludePaths);
|
||||
}
|
||||
|
||||
/**
|
||||
* Enable/disable the shaded duration background on queries
|
||||
*
|
||||
* @param bool $enabled
|
||||
*/
|
||||
public function setDurationBackground($enabled)
|
||||
{
|
||||
$this->durationBackground = $enabled;
|
||||
}
|
||||
|
||||
/**
|
||||
* Enable/disable the EXPLAIN queries
|
||||
*
|
||||
* @param bool $enabled
|
||||
* @param array|null $types Array of types to explain queries (select/insert/update/delete)
|
||||
*/
|
||||
public function setExplainSource($enabled, $types)
|
||||
{
|
||||
$this->explainQuery = $enabled;
|
||||
// workaround ['SELECT'] only. https://github.com/barryvdh/laravel-debugbar/issues/888
|
||||
// if($types){
|
||||
// $this->explainTypes = $types;
|
||||
// }
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param string $query
|
||||
* @param array $bindings
|
||||
* @param float $time
|
||||
* @param \Illuminate\Database\Connection $connection
|
||||
*/
|
||||
public function addQuery($query, $bindings, $time, $connection)
|
||||
{
|
||||
$explainResults = [];
|
||||
$time = $time / 1000;
|
||||
$endTime = microtime(true);
|
||||
$startTime = $endTime - $time;
|
||||
$hints = $this->performQueryAnalysis($query);
|
||||
|
||||
$pdo = null;
|
||||
try {
|
||||
$pdo = $connection->getPdo();
|
||||
} catch (\Throwable $e) {
|
||||
// ignore error for non-pdo laravel drivers
|
||||
}
|
||||
$bindings = $connection->prepareBindings($bindings);
|
||||
|
||||
// Run EXPLAIN on this query (if needed)
|
||||
if ($this->explainQuery && $pdo && preg_match('/^\s*(' . implode('|', $this->explainTypes) . ') /i', $query)) {
|
||||
$statement = $pdo->prepare('EXPLAIN ' . $query);
|
||||
$statement->execute($bindings);
|
||||
$explainResults = $statement->fetchAll(\PDO::FETCH_CLASS);
|
||||
}
|
||||
|
||||
$bindings = $this->getDataFormatter()->checkBindings($bindings);
|
||||
if (!empty($bindings) && $this->renderSqlWithParams) {
|
||||
foreach ($bindings as $key => $binding) {
|
||||
// This regex matches placeholders only, not the question marks,
|
||||
// nested in quotes, while we iterate through the bindings
|
||||
// and substitute placeholders by suitable values.
|
||||
$regex = is_numeric($key)
|
||||
? "/(?<!\?)\?(?=(?:[^'\\\']*'[^'\\']*')*[^'\\\']*$)(?!\?)/"
|
||||
: "/:{$key}(?=(?:[^'\\\']*'[^'\\\']*')*[^'\\\']*$)/";
|
||||
|
||||
// Mimic bindValue and only quote non-integer and non-float data types
|
||||
if (!is_int($binding) && !is_float($binding)) {
|
||||
if ($pdo) {
|
||||
try {
|
||||
$binding = $pdo->quote((string) $binding);
|
||||
} catch (\Exception $e) {
|
||||
$binding = $this->emulateQuote($binding);
|
||||
}
|
||||
} else {
|
||||
$binding = $this->emulateQuote($binding);
|
||||
}
|
||||
}
|
||||
|
||||
$query = preg_replace($regex, addcslashes($binding, '$'), $query, 1);
|
||||
}
|
||||
}
|
||||
|
||||
$source = [];
|
||||
|
||||
if ($this->findSource) {
|
||||
try {
|
||||
$source = array_slice($this->findSource(), 0, 5);
|
||||
} catch (\Exception $e) {
|
||||
}
|
||||
}
|
||||
|
||||
$this->queries[] = [
|
||||
'query' => $query,
|
||||
'type' => 'query',
|
||||
'bindings' => $this->getDataFormatter()->escapeBindings($bindings),
|
||||
'time' => $time,
|
||||
'source' => $source,
|
||||
'explain' => $explainResults,
|
||||
'connection' => $connection->getDatabaseName(),
|
||||
'driver' => $connection->getConfig('driver'),
|
||||
'hints' => $this->showHints ? $hints : null,
|
||||
'show_copy' => $this->showCopyButton,
|
||||
];
|
||||
|
||||
if ($this->timeCollector !== null) {
|
||||
$this->timeCollector->addMeasure(Str::limit($query, 100), $startTime, $endTime);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Mimic mysql_real_escape_string
|
||||
*
|
||||
* @param string $value
|
||||
* @return string
|
||||
*/
|
||||
protected function emulateQuote($value)
|
||||
{
|
||||
$search = ["\\", "\x00", "\n", "\r", "'", '"', "\x1a"];
|
||||
$replace = ["\\\\","\\0","\\n", "\\r", "\'", '\"', "\\Z"];
|
||||
|
||||
return "'" . str_replace($search, $replace, (string) $value) . "'";
|
||||
}
|
||||
|
||||
/**
|
||||
* Explainer::performQueryAnalysis()
|
||||
*
|
||||
* Perform simple regex analysis on the code
|
||||
*
|
||||
* @package xplain (https://github.com/rap2hpoutre/mysql-xplain-xplain)
|
||||
* @author e-doceo
|
||||
* @copyright 2014
|
||||
* @version $Id$
|
||||
* @access public
|
||||
* @param string $query
|
||||
* @return string[]
|
||||
*/
|
||||
protected function performQueryAnalysis($query)
|
||||
{
|
||||
// @codingStandardsIgnoreStart
|
||||
$hints = [];
|
||||
if (preg_match('/^\\s*SELECT\\s*`?[a-zA-Z0-9]*`?\\.?\\*/i', $query)) {
|
||||
$hints[] = 'Use <code>SELECT *</code> only if you need all columns from table';
|
||||
}
|
||||
if (preg_match('/ORDER BY RAND()/i', $query)) {
|
||||
$hints[] = '<code>ORDER BY RAND()</code> is slow, try to avoid if you can.
|
||||
You can <a href="http://stackoverflow.com/questions/2663710/how-does-mysqls-order-by-rand-work" target="_blank">read this</a>
|
||||
or <a href="http://stackoverflow.com/questions/1244555/how-can-i-optimize-mysqls-order-by-rand-function" target="_blank">this</a>';
|
||||
}
|
||||
if (strpos($query, '!=') !== false) {
|
||||
$hints[] = 'The <code>!=</code> operator is not standard. Use the <code><></code> operator to test for inequality instead.';
|
||||
}
|
||||
if (stripos($query, 'WHERE') === false && preg_match('/^(SELECT) /i', $query)) {
|
||||
$hints[] = 'The <code>SELECT</code> statement has no <code>WHERE</code> clause and could examine many more rows than intended';
|
||||
}
|
||||
if (preg_match('/LIMIT\\s/i', $query) && stripos($query, 'ORDER BY') === false) {
|
||||
$hints[] = '<code>LIMIT</code> without <code>ORDER BY</code> causes non-deterministic results, depending on the query execution plan';
|
||||
}
|
||||
if (preg_match('/LIKE\\s[\'"](%.*?)[\'"]/i', $query, $matches)) {
|
||||
$hints[] = 'An argument has a leading wildcard character: <code>' . $matches[1] . '</code>.
|
||||
The predicate with this argument is not sargable and cannot use an index if one exists.';
|
||||
}
|
||||
return $hints;
|
||||
|
||||
// @codingStandardsIgnoreEnd
|
||||
}
|
||||
|
||||
/**
|
||||
* Use a backtrace to search for the origins of the query.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
protected function findSource()
|
||||
{
|
||||
$stack = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS | DEBUG_BACKTRACE_PROVIDE_OBJECT, app('config')->get('debugbar.debug_backtrace_limit', 50));
|
||||
|
||||
$sources = [];
|
||||
|
||||
foreach ($stack as $index => $trace) {
|
||||
$sources[] = $this->parseTrace($index, $trace);
|
||||
}
|
||||
|
||||
return array_filter($sources);
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse a trace element from the backtrace stack.
|
||||
*
|
||||
* @param int $index
|
||||
* @param array $trace
|
||||
* @return object|bool
|
||||
*/
|
||||
protected function parseTrace($index, array $trace)
|
||||
{
|
||||
$frame = (object) [
|
||||
'index' => $index,
|
||||
'namespace' => null,
|
||||
'name' => null,
|
||||
'line' => isset($trace['line']) ? $trace['line'] : '?',
|
||||
];
|
||||
|
||||
if (isset($trace['function']) && $trace['function'] == 'substituteBindings') {
|
||||
$frame->name = 'Route binding';
|
||||
|
||||
return $frame;
|
||||
}
|
||||
|
||||
if (
|
||||
isset($trace['class']) &&
|
||||
isset($trace['file']) &&
|
||||
!$this->fileIsInExcludedPath($trace['file'])
|
||||
) {
|
||||
$file = $trace['file'];
|
||||
|
||||
if (isset($trace['object']) && is_a($trace['object'], 'Twig_Template')) {
|
||||
list($file, $frame->line) = $this->getTwigInfo($trace);
|
||||
} elseif (strpos($file, storage_path()) !== false) {
|
||||
$hash = pathinfo($file, PATHINFO_FILENAME);
|
||||
|
||||
if (! $frame->name = $this->findViewFromHash($hash)) {
|
||||
$frame->name = $hash;
|
||||
}
|
||||
|
||||
$frame->namespace = 'view';
|
||||
|
||||
return $frame;
|
||||
} elseif (strpos($file, 'Middleware') !== false) {
|
||||
$frame->name = $this->findMiddlewareFromFile($file);
|
||||
|
||||
if ($frame->name) {
|
||||
$frame->namespace = 'middleware';
|
||||
} else {
|
||||
$frame->name = $this->normalizeFilename($file);
|
||||
}
|
||||
|
||||
return $frame;
|
||||
}
|
||||
|
||||
$frame->name = $this->normalizeFilename($file);
|
||||
|
||||
return $frame;
|
||||
}
|
||||
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if the given file is to be excluded from analysis
|
||||
*
|
||||
* @param string $file
|
||||
* @return bool
|
||||
*/
|
||||
protected function fileIsInExcludedPath($file)
|
||||
{
|
||||
$normalizedPath = str_replace('\\', '/', $file);
|
||||
|
||||
foreach ($this->backtraceExcludePaths as $excludedPath) {
|
||||
if (strpos($normalizedPath, $excludedPath) !== false) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Find the middleware alias from the file.
|
||||
*
|
||||
* @param string $file
|
||||
* @return string|null
|
||||
*/
|
||||
protected function findMiddlewareFromFile($file)
|
||||
{
|
||||
$filename = pathinfo($file, PATHINFO_FILENAME);
|
||||
|
||||
foreach ($this->middleware as $alias => $class) {
|
||||
if (strpos($class, $filename) !== false) {
|
||||
return $alias;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Find the template name from the hash.
|
||||
*
|
||||
* @param string $hash
|
||||
* @return null|string
|
||||
*/
|
||||
protected function findViewFromHash($hash)
|
||||
{
|
||||
$finder = app('view')->getFinder();
|
||||
|
||||
if (isset($this->reflection['viewfinderViews'])) {
|
||||
$property = $this->reflection['viewfinderViews'];
|
||||
} else {
|
||||
$reflection = new \ReflectionClass($finder);
|
||||
$property = $reflection->getProperty('views');
|
||||
$property->setAccessible(true);
|
||||
$this->reflection['viewfinderViews'] = $property;
|
||||
}
|
||||
|
||||
foreach ($property->getValue($finder) as $name => $path) {
|
||||
if (sha1($path) == $hash || md5($path) == $hash) {
|
||||
return $name;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the filename/line from a Twig template trace
|
||||
*
|
||||
* @param array $trace
|
||||
* @return array The file and line
|
||||
*/
|
||||
protected function getTwigInfo($trace)
|
||||
{
|
||||
$file = $trace['object']->getTemplateName();
|
||||
|
||||
if (isset($trace['line'])) {
|
||||
foreach ($trace['object']->getDebugInfo() as $codeLine => $templateLine) {
|
||||
if ($codeLine <= $trace['line']) {
|
||||
return [$file, $templateLine];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return [$file, -1];
|
||||
}
|
||||
|
||||
/**
|
||||
* Shorten the path by removing the relative links and base dir
|
||||
*
|
||||
* @param string $path
|
||||
* @return string
|
||||
*/
|
||||
protected function normalizeFilename($path)
|
||||
{
|
||||
if (file_exists($path)) {
|
||||
$path = realpath($path);
|
||||
}
|
||||
return str_replace(base_path(), '', $path);
|
||||
}
|
||||
|
||||
/**
|
||||
* Collect a database transaction event.
|
||||
* @param string $event
|
||||
* @param \Illuminate\Database\Connection $connection
|
||||
* @return array
|
||||
*/
|
||||
public function collectTransactionEvent($event, $connection)
|
||||
{
|
||||
$source = [];
|
||||
|
||||
if ($this->findSource) {
|
||||
try {
|
||||
$source = $this->findSource();
|
||||
} catch (\Exception $e) {
|
||||
}
|
||||
}
|
||||
|
||||
$this->queries[] = [
|
||||
'query' => $event,
|
||||
'type' => 'transaction',
|
||||
'bindings' => [],
|
||||
'time' => 0,
|
||||
'source' => $source,
|
||||
'explain' => [],
|
||||
'connection' => $connection->getDatabaseName(),
|
||||
'driver' => $connection->getConfig('driver'),
|
||||
'hints' => null,
|
||||
'show_copy' => false,
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Reset the queries.
|
||||
*/
|
||||
public function reset()
|
||||
{
|
||||
$this->queries = [];
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public function collect()
|
||||
{
|
||||
$totalTime = 0;
|
||||
$queries = $this->queries;
|
||||
|
||||
$statements = [];
|
||||
foreach ($queries as $query) {
|
||||
$totalTime += $query['time'];
|
||||
|
||||
$statements[] = [
|
||||
'sql' => $this->getDataFormatter()->formatSql($query['query']),
|
||||
'type' => $query['type'],
|
||||
'params' => [],
|
||||
'bindings' => $query['bindings'],
|
||||
'hints' => $query['hints'],
|
||||
'show_copy' => $query['show_copy'],
|
||||
'backtrace' => array_values($query['source']),
|
||||
'duration' => $query['time'],
|
||||
'duration_str' => ($query['type'] == 'transaction') ? '' : $this->formatDuration($query['time']),
|
||||
'stmt_id' => $this->getDataFormatter()->formatSource(reset($query['source'])),
|
||||
'connection' => $query['connection'],
|
||||
];
|
||||
|
||||
// Add the results from the explain as new rows
|
||||
if ($query['driver'] === 'pgsql') {
|
||||
$explainer = trim(implode("\n", array_map(function ($explain) {
|
||||
return $explain->{'QUERY PLAN'};
|
||||
}, $query['explain'])));
|
||||
|
||||
if ($explainer) {
|
||||
$statements[] = [
|
||||
'sql' => " - EXPLAIN: {$explainer}",
|
||||
'type' => 'explain',
|
||||
];
|
||||
}
|
||||
} elseif ($query['driver'] === 'sqlite') {
|
||||
$vmi = '<table style="margin:-5px -11px !important;width: 100% !important">';
|
||||
$vmi .= "<thead><tr>
|
||||
<td>Address</td>
|
||||
<td>Opcode</td>
|
||||
<td>P1</td>
|
||||
<td>P2</td>
|
||||
<td>P3</td>
|
||||
<td>P4</td>
|
||||
<td>P5</td>
|
||||
<td>Comment</td>
|
||||
</tr></thead>";
|
||||
|
||||
foreach ($query['explain'] as $explain) {
|
||||
$vmi .= "<tr>
|
||||
<td>{$explain->addr}</td>
|
||||
<td>{$explain->opcode}</td>
|
||||
<td>{$explain->p1}</td>
|
||||
<td>{$explain->p2}</td>
|
||||
<td>{$explain->p3}</td>
|
||||
<td>{$explain->p4}</td>
|
||||
<td>{$explain->p5}</td>
|
||||
<td>{$explain->comment}</td>
|
||||
</tr>";
|
||||
}
|
||||
|
||||
$vmi .= '</table>';
|
||||
|
||||
$statements[] = [
|
||||
'sql' => " - EXPLAIN:",
|
||||
'type' => 'explain',
|
||||
'params' => [
|
||||
'Virtual Machine Instructions' => $vmi,
|
||||
]
|
||||
];
|
||||
} else {
|
||||
foreach ($query['explain'] as $explain) {
|
||||
$statements[] = [
|
||||
'sql' => " - EXPLAIN # {$explain->id}: `{$explain->table}` ({$explain->select_type})",
|
||||
'type' => 'explain',
|
||||
'params' => $explain,
|
||||
'row_count' => $explain->rows,
|
||||
'stmt_id' => $explain->id,
|
||||
];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ($this->durationBackground) {
|
||||
if ($totalTime > 0) {
|
||||
// For showing background measure on Queries tab
|
||||
$start_percent = 0;
|
||||
|
||||
foreach ($statements as $i => $statement) {
|
||||
if (!isset($statement['duration'])) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$width_percent = $statement['duration'] / $totalTime * 100;
|
||||
|
||||
$statements[$i] = array_merge($statement, [
|
||||
'start_percent' => round($start_percent, 3),
|
||||
'width_percent' => round($width_percent, 3),
|
||||
]);
|
||||
|
||||
$start_percent += $width_percent;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$nb_statements = array_filter($queries, function ($query) {
|
||||
return $query['type'] === 'query';
|
||||
});
|
||||
|
||||
$data = [
|
||||
'nb_statements' => count($nb_statements),
|
||||
'nb_failed_statements' => 0,
|
||||
'accumulated_duration' => $totalTime,
|
||||
'accumulated_duration_str' => $this->formatDuration($totalTime),
|
||||
'statements' => $statements
|
||||
];
|
||||
return $data;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public function getName()
|
||||
{
|
||||
return 'queries';
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public function getWidgets()
|
||||
{
|
||||
return [
|
||||
"queries" => [
|
||||
"icon" => "database",
|
||||
"widget" => "PhpDebugBar.Widgets.LaravelSQLQueriesWidget",
|
||||
"map" => "queries",
|
||||
"default" => "[]"
|
||||
],
|
||||
"queries:badge" => [
|
||||
"map" => "queries.nb_statements",
|
||||
"default" => 0
|
||||
]
|
||||
];
|
||||
}
|
||||
}
|
||||
199
vendor/barryvdh/laravel-debugbar/src/DataCollector/RequestCollector.php
vendored
Normal file
199
vendor/barryvdh/laravel-debugbar/src/DataCollector/RequestCollector.php
vendored
Normal file
@ -0,0 +1,199 @@
|
||||
<?php
|
||||
|
||||
namespace Barryvdh\Debugbar\DataCollector;
|
||||
|
||||
use DebugBar\DataCollector\DataCollector;
|
||||
use DebugBar\DataCollector\DataCollectorInterface;
|
||||
use DebugBar\DataCollector\Renderable;
|
||||
use Illuminate\Support\Str;
|
||||
use Laravel\Telescope\IncomingEntry;
|
||||
use Laravel\Telescope\Telescope;
|
||||
use Symfony\Component\HttpFoundation\Response;
|
||||
|
||||
/**
|
||||
*
|
||||
* Based on \Symfony\Component\HttpKernel\DataCollector\RequestDataCollector by Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
*/
|
||||
class RequestCollector extends DataCollector implements DataCollectorInterface, Renderable
|
||||
{
|
||||
/** @var \Symfony\Component\HttpFoundation\Request $request */
|
||||
protected $request;
|
||||
/** @var \Symfony\Component\HttpFoundation\Request $response */
|
||||
protected $response;
|
||||
/** @var \Symfony\Component\HttpFoundation\Session\SessionInterface $session */
|
||||
protected $session;
|
||||
/** @var string|null */
|
||||
protected $currentRequestId;
|
||||
|
||||
/**
|
||||
* Create a new SymfonyRequestCollector
|
||||
*
|
||||
* @param \Symfony\Component\HttpFoundation\Request $request
|
||||
* @param \Symfony\Component\HttpFoundation\Response $response
|
||||
* @param \Symfony\Component\HttpFoundation\Session\SessionInterface $session
|
||||
*/
|
||||
public function __construct($request, $response, $session = null, $currentRequestId = null)
|
||||
{
|
||||
$this->request = $request;
|
||||
$this->response = $response;
|
||||
$this->session = $session;
|
||||
$this->currentRequestId = $currentRequestId;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public function getName()
|
||||
{
|
||||
return 'request';
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public function getWidgets()
|
||||
{
|
||||
return [
|
||||
"request" => [
|
||||
"icon" => "tags",
|
||||
"widget" => "PhpDebugBar.Widgets.HtmlVariableListWidget",
|
||||
"map" => "request",
|
||||
"default" => "{}"
|
||||
]
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function collect()
|
||||
{
|
||||
$request = $this->request;
|
||||
$response = $this->response;
|
||||
|
||||
$responseHeaders = $response->headers->all();
|
||||
$cookies = [];
|
||||
foreach ($response->headers->getCookies() as $cookie) {
|
||||
$cookies[] = $this->getCookieHeader(
|
||||
$cookie->getName(),
|
||||
$cookie->getValue(),
|
||||
$cookie->getExpiresTime(),
|
||||
$cookie->getPath(),
|
||||
$cookie->getDomain(),
|
||||
$cookie->isSecure(),
|
||||
$cookie->isHttpOnly()
|
||||
);
|
||||
}
|
||||
if (count($cookies) > 0) {
|
||||
$responseHeaders['Set-Cookie'] = $cookies;
|
||||
}
|
||||
|
||||
$statusCode = $response->getStatusCode();
|
||||
|
||||
$data = [
|
||||
'path_info' => $request->getPathInfo(),
|
||||
'status_code' => $statusCode,
|
||||
'status_text' => isset(Response::$statusTexts[$statusCode]) ? Response::$statusTexts[$statusCode] : '',
|
||||
'format' => $request->getRequestFormat(),
|
||||
'content_type' => $response->headers->get('Content-Type') ? $response->headers->get(
|
||||
'Content-Type'
|
||||
) : 'text/html',
|
||||
'request_query' => $request->query->all(),
|
||||
'request_request' => $request->request->all(),
|
||||
'request_headers' => $request->headers->all(),
|
||||
'request_server' => $request->server->all(),
|
||||
'request_cookies' => $request->cookies->all(),
|
||||
'response_headers' => $responseHeaders,
|
||||
];
|
||||
|
||||
if ($this->session) {
|
||||
$sessionAttributes = [];
|
||||
foreach ($this->session->all() as $key => $value) {
|
||||
$sessionAttributes[$key] = $value;
|
||||
}
|
||||
$data['session_attributes'] = $sessionAttributes;
|
||||
}
|
||||
|
||||
foreach ($data['request_server'] as $key => $value) {
|
||||
if (
|
||||
Str::is('*_KEY', $key) || Str::is('*_PASSWORD', $key)
|
||||
|| Str::is('*_SECRET', $key) || Str::is('*_PW', $key)
|
||||
|| Str::is('*_TOKEN', $key) || Str::is('*_PASS', $key)
|
||||
) {
|
||||
$data['request_server'][$key] = '******';
|
||||
}
|
||||
}
|
||||
|
||||
if (isset($data['request_headers']['php-auth-pw'])) {
|
||||
$data['request_headers']['php-auth-pw'] = '******';
|
||||
}
|
||||
|
||||
if (isset($data['request_server']['PHP_AUTH_PW'])) {
|
||||
$data['request_server']['PHP_AUTH_PW'] = '******';
|
||||
}
|
||||
;
|
||||
|
||||
foreach ($data as $key => $var) {
|
||||
if (!is_string($data[$key])) {
|
||||
$data[$key] = DataCollector::getDefaultVarDumper()->renderVar($var);
|
||||
} else {
|
||||
$data[$key] = e($data[$key]);
|
||||
}
|
||||
}
|
||||
|
||||
$htmlData = [];
|
||||
if (class_exists(Telescope::class)) {
|
||||
$entry = IncomingEntry::make([
|
||||
'requestId' => $this->currentRequestId,
|
||||
])->type('debugbar');
|
||||
Telescope::$entriesQueue[] = $entry;
|
||||
$url = route('debugbar.telescope', [$entry->uuid]);
|
||||
$htmlData['telescope'] = '<a href="' . $url . '" target="_blank">View in Telescope</a>';
|
||||
}
|
||||
|
||||
return $htmlData + $data;
|
||||
}
|
||||
|
||||
private function getCookieHeader($name, $value, $expires, $path, $domain, $secure, $httponly)
|
||||
{
|
||||
$cookie = sprintf('%s=%s', $name, urlencode($value));
|
||||
|
||||
if (0 !== $expires) {
|
||||
if (is_numeric($expires)) {
|
||||
$expires = (int) $expires;
|
||||
} elseif ($expires instanceof \DateTime) {
|
||||
$expires = $expires->getTimestamp();
|
||||
} else {
|
||||
$expires = strtotime($expires);
|
||||
if (false === $expires || -1 == $expires) {
|
||||
throw new \InvalidArgumentException(
|
||||
sprintf('The "expires" cookie parameter is not valid.', $expires)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
$cookie .= '; expires=' . substr(
|
||||
\DateTime::createFromFormat('U', $expires, new \DateTimeZone('UTC'))->format('D, d-M-Y H:i:s T'),
|
||||
0,
|
||||
-5
|
||||
);
|
||||
}
|
||||
|
||||
if ($domain) {
|
||||
$cookie .= '; domain=' . $domain;
|
||||
}
|
||||
|
||||
$cookie .= '; path=' . $path;
|
||||
|
||||
if ($secure) {
|
||||
$cookie .= '; secure';
|
||||
}
|
||||
|
||||
if ($httponly) {
|
||||
$cookie .= '; httponly';
|
||||
}
|
||||
|
||||
return $cookie;
|
||||
}
|
||||
}
|
||||
220
vendor/barryvdh/laravel-debugbar/src/DataCollector/RouteCollector.php
vendored
Normal file
220
vendor/barryvdh/laravel-debugbar/src/DataCollector/RouteCollector.php
vendored
Normal file
@ -0,0 +1,220 @@
|
||||
<?php
|
||||
|
||||
namespace Barryvdh\Debugbar\DataCollector;
|
||||
|
||||
use Closure;
|
||||
use DebugBar\DataCollector\DataCollector;
|
||||
use DebugBar\DataCollector\Renderable;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Routing\Route;
|
||||
use Illuminate\Routing\Router;
|
||||
use Illuminate\Support\Facades\Config;
|
||||
use InvalidArgumentException;
|
||||
|
||||
/**
|
||||
* Based on Illuminate\Foundation\Console\RoutesCommand for Taylor Otwell
|
||||
* https://github.com/laravel/framework/blob/master/src/Illuminate/Foundation/Console/RoutesCommand.php
|
||||
*
|
||||
*/
|
||||
class RouteCollector extends DataCollector implements Renderable
|
||||
{
|
||||
/**
|
||||
* The router instance.
|
||||
*
|
||||
* @var \Illuminate\Routing\Router
|
||||
*/
|
||||
protected $router;
|
||||
|
||||
/**
|
||||
* A list of known editor strings.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $editors = [
|
||||
'sublime' => 'subl://open?url=file://%file&line=%line',
|
||||
'textmate' => 'txmt://open?url=file://%file&line=%line',
|
||||
'emacs' => 'emacs://open?url=file://%file&line=%line',
|
||||
'macvim' => 'mvim://open/?url=file://%file&line=%line',
|
||||
'phpstorm' => 'phpstorm://open?file=%file&line=%line',
|
||||
'idea' => 'idea://open?file=%file&line=%line',
|
||||
'vscode' => 'vscode://file/%file:%line',
|
||||
'vscode-insiders' => 'vscode-insiders://file/%file:%line',
|
||||
'vscode-remote' => 'vscode://vscode-remote/%file:%line',
|
||||
'vscode-insiders-remote' => 'vscode-insiders://vscode-remote/%file:%line',
|
||||
'vscodium' => 'vscodium://file/%file:%line',
|
||||
'nova' => 'nova://core/open/file?filename=%file&line=%line',
|
||||
'xdebug' => 'xdebug://%file@%line',
|
||||
'atom' => 'atom://core/open/file?filename=%file&line=%line',
|
||||
'espresso' => 'x-espresso://open?filepath=%file&lines=%line',
|
||||
'netbeans' => 'netbeans://open/?f=%file:%line',
|
||||
];
|
||||
|
||||
public function __construct(Router $router)
|
||||
{
|
||||
$this->router = $router;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public function collect()
|
||||
{
|
||||
$route = $this->router->current();
|
||||
return $this->getRouteInformation($route);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the route information for a given route.
|
||||
*
|
||||
* @param \Illuminate\Routing\Route $route
|
||||
* @return array
|
||||
*/
|
||||
protected function getRouteInformation($route)
|
||||
{
|
||||
if (!is_a($route, 'Illuminate\Routing\Route')) {
|
||||
return [];
|
||||
}
|
||||
$uri = head($route->methods()) . ' ' . $route->uri();
|
||||
$action = $route->getAction();
|
||||
|
||||
$result = [
|
||||
'uri' => $uri ?: '-',
|
||||
];
|
||||
|
||||
$result = array_merge($result, $action);
|
||||
|
||||
|
||||
if (
|
||||
isset($action['controller'])
|
||||
&& is_string($action['controller'])
|
||||
&& strpos($action['controller'], '@') !== false
|
||||
) {
|
||||
list($controller, $method) = explode('@', $action['controller']);
|
||||
if (class_exists($controller) && method_exists($controller, $method)) {
|
||||
$reflector = new \ReflectionMethod($controller, $method);
|
||||
}
|
||||
unset($result['uses']);
|
||||
} elseif (isset($action['uses']) && $action['uses'] instanceof \Closure) {
|
||||
$reflector = new \ReflectionFunction($action['uses']);
|
||||
$result['uses'] = $this->formatVar($result['uses']);
|
||||
}
|
||||
|
||||
if (isset($reflector)) {
|
||||
$filename = ltrim(str_replace(base_path(), '', $reflector->getFileName()), '/');
|
||||
|
||||
if ($href = $this->getEditorHref($reflector->getFileName(), $reflector->getStartLine())) {
|
||||
$result['file'] = sprintf('<a href="%s">%s:%s-%s</a>', $href, $filename, $reflector->getStartLine(), $reflector->getEndLine());
|
||||
} else {
|
||||
$result['file'] = sprintf('%s:%s-%s', $filename, $reflector->getStartLine(), $reflector->getEndLine());
|
||||
}
|
||||
}
|
||||
|
||||
if ($middleware = $this->getMiddleware($route)) {
|
||||
$result['middleware'] = $middleware;
|
||||
}
|
||||
|
||||
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get middleware
|
||||
*
|
||||
* @param \Illuminate\Routing\Route $route
|
||||
* @return string
|
||||
*/
|
||||
protected function getMiddleware($route)
|
||||
{
|
||||
return implode(', ', array_map(function ($middleware) {
|
||||
return $middleware instanceof Closure ? 'Closure' : $middleware;
|
||||
}, $route->middleware()));
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public function getName()
|
||||
{
|
||||
return 'route';
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public function getWidgets()
|
||||
{
|
||||
$widgets = [
|
||||
"route" => [
|
||||
"icon" => "share",
|
||||
"widget" => "PhpDebugBar.Widgets.HtmlVariableListWidget",
|
||||
"map" => "route",
|
||||
"default" => "{}"
|
||||
]
|
||||
];
|
||||
if (Config::get('debugbar.options.route.label', true)) {
|
||||
$widgets['currentroute'] = [
|
||||
"icon" => "share",
|
||||
"tooltip" => "Route",
|
||||
"map" => "route.uri",
|
||||
"default" => ""
|
||||
];
|
||||
}
|
||||
return $widgets;
|
||||
}
|
||||
|
||||
/**
|
||||
* Display the route information on the console.
|
||||
*
|
||||
* @param array $routes
|
||||
* @return void
|
||||
*/
|
||||
protected function displayRoutes(array $routes)
|
||||
{
|
||||
$this->table->setHeaders($this->headers)->setRows($routes);
|
||||
|
||||
$this->table->render($this->getOutput());
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the editor href for a given file and line, if available.
|
||||
*
|
||||
* @param string $filePath
|
||||
* @param int $line
|
||||
*
|
||||
* @throws InvalidArgumentException If editor resolver does not return a string
|
||||
*
|
||||
* @return null|string
|
||||
*/
|
||||
protected function getEditorHref($filePath, $line)
|
||||
{
|
||||
if (empty(config('debugbar.editor'))) {
|
||||
return null;
|
||||
}
|
||||
|
||||
if (empty($this->editors[config('debugbar.editor')])) {
|
||||
throw new InvalidArgumentException(
|
||||
'Unknown editor identifier: ' . config('debugbar.editor') . '. Known editors:' .
|
||||
implode(', ', array_keys($this->editors))
|
||||
);
|
||||
}
|
||||
|
||||
$filePath = $this->replaceSitesPath($filePath);
|
||||
|
||||
$url = str_replace(['%file', '%line'], [$filePath, $line], $this->editors[config('debugbar.editor')]);
|
||||
|
||||
return $url;
|
||||
}
|
||||
|
||||
/**
|
||||
* Replace remote path
|
||||
*
|
||||
* @param string $filePath
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function replaceSitesPath($filePath)
|
||||
{
|
||||
return str_replace(config('debugbar.remote_sites_path'), config('debugbar.local_sites_path'), $filePath);
|
||||
}
|
||||
}
|
||||
58
vendor/barryvdh/laravel-debugbar/src/DataCollector/SessionCollector.php
vendored
Normal file
58
vendor/barryvdh/laravel-debugbar/src/DataCollector/SessionCollector.php
vendored
Normal file
@ -0,0 +1,58 @@
|
||||
<?php
|
||||
|
||||
namespace Barryvdh\Debugbar\DataCollector;
|
||||
|
||||
use DebugBar\DataCollector\DataCollector;
|
||||
use DebugBar\DataCollector\DataCollectorInterface;
|
||||
use DebugBar\DataCollector\Renderable;
|
||||
|
||||
class SessionCollector extends DataCollector implements DataCollectorInterface, Renderable
|
||||
{
|
||||
/** @var \Symfony\Component\HttpFoundation\Session\SessionInterface|\Illuminate\Contracts\Session\Session $session */
|
||||
protected $session;
|
||||
|
||||
/**
|
||||
* Create a new SessionCollector
|
||||
*
|
||||
* @param \Symfony\Component\HttpFoundation\Session\SessionInterface|\Illuminate\Contracts\Session\Session $session
|
||||
*/
|
||||
public function __construct($session)
|
||||
{
|
||||
$this->session = $session;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function collect()
|
||||
{
|
||||
$data = [];
|
||||
foreach ($this->session->all() as $key => $value) {
|
||||
$data[$key] = is_string($value) ? $value : $this->formatVar($value);
|
||||
}
|
||||
return $data;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public function getName()
|
||||
{
|
||||
return 'session';
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public function getWidgets()
|
||||
{
|
||||
return [
|
||||
"session" => [
|
||||
"icon" => "archive",
|
||||
"widget" => "PhpDebugBar.Widgets.VariableListWidget",
|
||||
"map" => "session",
|
||||
"default" => "{}"
|
||||
]
|
||||
];
|
||||
}
|
||||
}
|
||||
183
vendor/barryvdh/laravel-debugbar/src/DataCollector/ViewCollector.php
vendored
Normal file
183
vendor/barryvdh/laravel-debugbar/src/DataCollector/ViewCollector.php
vendored
Normal file
@ -0,0 +1,183 @@
|
||||
<?php
|
||||
|
||||
namespace Barryvdh\Debugbar\DataCollector;
|
||||
|
||||
use Barryvdh\Debugbar\DataFormatter\SimpleFormatter;
|
||||
use DebugBar\Bridge\Twig\TwigCollector;
|
||||
use Illuminate\View\View;
|
||||
use InvalidArgumentException;
|
||||
|
||||
class ViewCollector extends TwigCollector
|
||||
{
|
||||
protected $name;
|
||||
protected $templates = [];
|
||||
protected $collect_data;
|
||||
protected $exclude_paths;
|
||||
|
||||
/**
|
||||
* A list of known editor strings.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $editors = [
|
||||
'sublime' => 'subl://open?url=file://%file&line=%line',
|
||||
'textmate' => 'txmt://open?url=file://%file&line=%line',
|
||||
'emacs' => 'emacs://open?url=file://%file&line=%line',
|
||||
'macvim' => 'mvim://open/?url=file://%file&line=%line',
|
||||
'phpstorm' => 'phpstorm://open?file=%file&line=%line',
|
||||
'idea' => 'idea://open?file=%file&line=%line',
|
||||
'vscode' => 'vscode://file/%file:%line',
|
||||
'vscode-insiders' => 'vscode-insiders://file/%file:%line',
|
||||
'vscode-remote' => 'vscode://vscode-remote/%file:%line',
|
||||
'vscode-insiders-remote' => 'vscode-insiders://vscode-remote/%file:%line',
|
||||
'vscodium' => 'vscodium://file/%file:%line',
|
||||
'nova' => 'nova://core/open/file?filename=%file&line=%line',
|
||||
'xdebug' => 'xdebug://%file@%line',
|
||||
'atom' => 'atom://core/open/file?filename=%file&line=%line',
|
||||
'espresso' => 'x-espresso://open?filepath=%file&lines=%line',
|
||||
'netbeans' => 'netbeans://open/?f=%file:%line',
|
||||
];
|
||||
|
||||
/**
|
||||
* Create a ViewCollector
|
||||
*
|
||||
* @param bool $collectData Collects view data when tru
|
||||
* @param string[] $excludePaths Paths to exclude from collection
|
||||
*/
|
||||
public function __construct($collectData = true, $excludePaths = [])
|
||||
{
|
||||
$this->setDataFormatter(new SimpleFormatter());
|
||||
$this->collect_data = $collectData;
|
||||
$this->templates = [];
|
||||
$this->exclude_paths = $excludePaths;
|
||||
}
|
||||
|
||||
public function getName()
|
||||
{
|
||||
return 'views';
|
||||
}
|
||||
|
||||
public function getWidgets()
|
||||
{
|
||||
return [
|
||||
'views' => [
|
||||
'icon' => 'leaf',
|
||||
'widget' => 'PhpDebugBar.Widgets.LaravelViewTemplatesWidget',
|
||||
'map' => 'views',
|
||||
'default' => '[]'
|
||||
],
|
||||
'views:badge' => [
|
||||
'map' => 'views.nb_templates',
|
||||
'default' => 0
|
||||
]
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the editor href for a given file and line, if available.
|
||||
*
|
||||
* @param string $filePath
|
||||
* @param int $line
|
||||
*
|
||||
* @throws InvalidArgumentException If editor resolver does not return a string
|
||||
*
|
||||
* @return null|string
|
||||
*/
|
||||
protected function getEditorHref($filePath, $line)
|
||||
{
|
||||
if (empty(config('debugbar.editor'))) {
|
||||
return null;
|
||||
}
|
||||
|
||||
if (empty($this->editors[config('debugbar.editor')])) {
|
||||
throw new InvalidArgumentException(
|
||||
'Unknown editor identifier: ' . config('debugbar.editor') . '. Known editors:' .
|
||||
implode(', ', array_keys($this->editors))
|
||||
);
|
||||
}
|
||||
|
||||
$filePath = $this->replaceSitesPath($filePath);
|
||||
|
||||
$url = str_replace(['%file', '%line'], [$filePath, $line], $this->editors[config('debugbar.editor')]);
|
||||
|
||||
return $url;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a View instance to the Collector
|
||||
*
|
||||
* @param \Illuminate\View\View $view
|
||||
*/
|
||||
public function addView(View $view)
|
||||
{
|
||||
$name = $view->getName();
|
||||
$path = $view->getPath();
|
||||
|
||||
if (!is_object($path)) {
|
||||
if ($path) {
|
||||
$path = ltrim(str_replace(base_path(), '', realpath($path)), '/');
|
||||
}
|
||||
|
||||
if (substr($path, -10) == '.blade.php') {
|
||||
$type = 'blade';
|
||||
} else {
|
||||
$type = pathinfo($path, PATHINFO_EXTENSION);
|
||||
}
|
||||
} else {
|
||||
$type = get_class($view);
|
||||
$path = '';
|
||||
}
|
||||
|
||||
foreach ($this->exclude_paths as $excludePath) {
|
||||
if (strpos($path, $excludePath) !== false) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (!$this->collect_data) {
|
||||
$params = array_keys($view->getData());
|
||||
} else {
|
||||
$data = [];
|
||||
foreach ($view->getData() as $key => $value) {
|
||||
$data[$key] = $this->getDataFormatter()->formatVar($value);
|
||||
}
|
||||
$params = $data;
|
||||
}
|
||||
|
||||
$template = [
|
||||
'name' => $path ? sprintf('%s (%s)', $name, $path) : $name,
|
||||
'param_count' => count($params),
|
||||
'params' => $params,
|
||||
'type' => $type,
|
||||
'editorLink' => $this->getEditorHref($view->getPath(), 0),
|
||||
];
|
||||
|
||||
if ($this->getXdebugLink($path)) {
|
||||
$template['xdebug_link'] = $this->getXdebugLink(realpath($view->getPath()));
|
||||
}
|
||||
|
||||
$this->templates[] = $template;
|
||||
}
|
||||
|
||||
public function collect()
|
||||
{
|
||||
$templates = $this->templates;
|
||||
|
||||
return [
|
||||
'nb_templates' => count($templates),
|
||||
'templates' => $templates,
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Replace remote path
|
||||
*
|
||||
* @param string $filePath
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function replaceSitesPath($filePath)
|
||||
{
|
||||
return str_replace(config('debugbar.remote_sites_path'), config('debugbar.local_sites_path'), $filePath);
|
||||
}
|
||||
}
|
||||
88
vendor/barryvdh/laravel-debugbar/src/DataFormatter/QueryFormatter.php
vendored
Normal file
88
vendor/barryvdh/laravel-debugbar/src/DataFormatter/QueryFormatter.php
vendored
Normal file
@ -0,0 +1,88 @@
|
||||
<?php
|
||||
|
||||
namespace Barryvdh\Debugbar\DataFormatter;
|
||||
|
||||
use DebugBar\DataFormatter\DataFormatter;
|
||||
|
||||
#[\AllowDynamicProperties]
|
||||
class QueryFormatter extends DataFormatter
|
||||
{
|
||||
/**
|
||||
* Removes extra spaces at the beginning and end of the SQL query and its lines.
|
||||
*
|
||||
* @param string $sql
|
||||
* @return string
|
||||
*/
|
||||
public function formatSql($sql)
|
||||
{
|
||||
$sql = preg_replace("/\?(?=(?:[^'\\\']*'[^'\\']*')*[^'\\\']*$)(?:\?)/", '?', $sql);
|
||||
$sql = trim(preg_replace("/\s*\n\s*/", "\n", $sql));
|
||||
|
||||
return $sql;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check bindings for illegal (non UTF-8) strings, like Binary data.
|
||||
*
|
||||
* @param $bindings
|
||||
* @return mixed
|
||||
*/
|
||||
public function checkBindings($bindings)
|
||||
{
|
||||
foreach ($bindings as &$binding) {
|
||||
if (is_string($binding) && !mb_check_encoding($binding, 'UTF-8')) {
|
||||
$binding = '[BINARY DATA]';
|
||||
}
|
||||
|
||||
if (is_array($binding)) {
|
||||
$binding = $this->checkBindings($binding);
|
||||
$binding = '[' . implode(',', $binding) . ']';
|
||||
}
|
||||
|
||||
if (is_object($binding)) {
|
||||
$binding = json_encode($binding);
|
||||
}
|
||||
}
|
||||
|
||||
return $bindings;
|
||||
}
|
||||
|
||||
/**
|
||||
* Make the bindings safe for outputting.
|
||||
*
|
||||
* @param array $bindings
|
||||
* @return array
|
||||
*/
|
||||
public function escapeBindings($bindings)
|
||||
{
|
||||
foreach ($bindings as &$binding) {
|
||||
$binding = htmlentities((string) $binding, ENT_QUOTES, 'UTF-8', false);
|
||||
}
|
||||
|
||||
return $bindings;
|
||||
}
|
||||
|
||||
/**
|
||||
* Format a source object.
|
||||
*
|
||||
* @param object|null $source If the backtrace is disabled, the $source will be null.
|
||||
* @return string
|
||||
*/
|
||||
public function formatSource($source)
|
||||
{
|
||||
if (! is_object($source)) {
|
||||
return '';
|
||||
}
|
||||
|
||||
$parts = [];
|
||||
|
||||
if ($source->namespace) {
|
||||
$parts['namespace'] = $source->namespace . '::';
|
||||
}
|
||||
|
||||
$parts['name'] = $source->name;
|
||||
$parts['line'] = ':' . $source->line;
|
||||
|
||||
return implode($parts);
|
||||
}
|
||||
}
|
||||
107
vendor/barryvdh/laravel-debugbar/src/DataFormatter/SimpleFormatter.php
vendored
Normal file
107
vendor/barryvdh/laravel-debugbar/src/DataFormatter/SimpleFormatter.php
vendored
Normal file
@ -0,0 +1,107 @@
|
||||
<?php
|
||||
|
||||
namespace Barryvdh\Debugbar\DataFormatter;
|
||||
|
||||
use DebugBar\DataFormatter\DataFormatter;
|
||||
|
||||
/**
|
||||
* Simple DataFormatter based on the deprecated Symfony ValueExporter
|
||||
*
|
||||
* @see https://github.com/symfony/symfony/blob/v3.4.4/src/Symfony/Component/HttpKernel/DataCollector/Util/ValueExporter.php
|
||||
*/
|
||||
#[\AllowDynamicProperties]
|
||||
class SimpleFormatter extends DataFormatter
|
||||
{
|
||||
/**
|
||||
* @param $data
|
||||
* @return string
|
||||
*/
|
||||
public function formatVar($data)
|
||||
{
|
||||
return $this->exportValue($data);
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts a PHP value to a string.
|
||||
*
|
||||
* @param mixed $value The PHP value
|
||||
* @param int $depth Only for internal usage
|
||||
* @param bool $deep Only for internal usage
|
||||
*
|
||||
* @return string The string representation of the given value
|
||||
* @author Bernhard Schussek <bschussek@gmail.com>
|
||||
*/
|
||||
private function exportValue($value, $depth = 1, $deep = false)
|
||||
{
|
||||
if ($value instanceof \__PHP_Incomplete_Class) {
|
||||
return sprintf('__PHP_Incomplete_Class(%s)', $this->getClassNameFromIncomplete($value));
|
||||
}
|
||||
|
||||
if (is_object($value)) {
|
||||
if ($value instanceof \DateTimeInterface) {
|
||||
return sprintf('Object(%s) - %s', get_class($value), $value->format(\DateTime::ATOM));
|
||||
}
|
||||
|
||||
return sprintf('Object(%s)', get_class($value));
|
||||
}
|
||||
|
||||
if (is_array($value)) {
|
||||
if (empty($value)) {
|
||||
return '[]';
|
||||
}
|
||||
|
||||
$indent = str_repeat(' ', $depth);
|
||||
|
||||
$a = array();
|
||||
foreach ($value as $k => $v) {
|
||||
if (is_array($v)) {
|
||||
$deep = true;
|
||||
}
|
||||
$a[] = sprintf('%s => %s', $k, $this->exportValue($v, $depth + 1, $deep));
|
||||
}
|
||||
|
||||
if ($deep) {
|
||||
$args = [$indent, implode(sprintf(", \n%s", $indent), $a), str_repeat(' ', $depth - 1)];
|
||||
return sprintf("[\n%s%s\n%s]", ...$args);
|
||||
}
|
||||
|
||||
$s = sprintf('[%s]', implode(', ', $a));
|
||||
|
||||
if (80 > strlen($s)) {
|
||||
return $s;
|
||||
}
|
||||
|
||||
return sprintf("[\n%s%s\n]", $indent, implode(sprintf(",\n%s", $indent), $a));
|
||||
}
|
||||
|
||||
if (is_resource($value)) {
|
||||
return sprintf('Resource(%s#%d)', get_resource_type($value), $value);
|
||||
}
|
||||
|
||||
if (null === $value) {
|
||||
return 'null';
|
||||
}
|
||||
|
||||
if (false === $value) {
|
||||
return 'false';
|
||||
}
|
||||
|
||||
if (true === $value) {
|
||||
return 'true';
|
||||
}
|
||||
|
||||
return (string) $value;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param \__PHP_Incomplete_Class $value
|
||||
* @return mixed
|
||||
* @author Bernhard Schussek <bschussek@gmail.com>
|
||||
*/
|
||||
private function getClassNameFromIncomplete(\__PHP_Incomplete_Class $value)
|
||||
{
|
||||
$array = new \ArrayObject($value);
|
||||
|
||||
return $array['__PHP_Incomplete_Class_Name'];
|
||||
}
|
||||
}
|
||||
55
vendor/barryvdh/laravel-debugbar/src/DebugbarViewEngine.php
vendored
Normal file
55
vendor/barryvdh/laravel-debugbar/src/DebugbarViewEngine.php
vendored
Normal file
@ -0,0 +1,55 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Barryvdh\Debugbar;
|
||||
|
||||
use Illuminate\Contracts\View\Engine;
|
||||
|
||||
class DebugbarViewEngine implements Engine
|
||||
{
|
||||
/**
|
||||
* @var Engine
|
||||
*/
|
||||
protected $engine;
|
||||
|
||||
/**
|
||||
* @var LaravelDebugbar
|
||||
*/
|
||||
protected $laravelDebugbar;
|
||||
|
||||
/**
|
||||
* @param Engine $engine
|
||||
* @param LaravelDebugbar $laravelDebugbar
|
||||
*/
|
||||
public function __construct(Engine $engine, LaravelDebugbar $laravelDebugbar)
|
||||
{
|
||||
$this->engine = $engine;
|
||||
$this->laravelDebugbar = $laravelDebugbar;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $path
|
||||
* @param array $data
|
||||
* @return string
|
||||
*/
|
||||
public function get($path, array $data = [])
|
||||
{
|
||||
$shortPath = ltrim(str_replace(base_path(), '', realpath($path)), '/');
|
||||
|
||||
return $this->laravelDebugbar->measure($shortPath, function () use ($path, $data) {
|
||||
return $this->engine->get($path, $data);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* NOTE: This is done to support other Engine swap (example: Livewire).
|
||||
* @param $name
|
||||
* @param $arguments
|
||||
* @return mixed
|
||||
*/
|
||||
public function __call($name, $arguments)
|
||||
{
|
||||
return $this->engine->$name(...$arguments);
|
||||
}
|
||||
}
|
||||
30
vendor/barryvdh/laravel-debugbar/src/Facade.php
vendored
Normal file
30
vendor/barryvdh/laravel-debugbar/src/Facade.php
vendored
Normal file
@ -0,0 +1,30 @@
|
||||
<?php
|
||||
|
||||
namespace Barryvdh\Debugbar;
|
||||
|
||||
use DebugBar\DataCollector\DataCollectorInterface;
|
||||
|
||||
/**
|
||||
* @method static LaravelDebugbar addCollector(DataCollectorInterface $collector)
|
||||
* @method static void addMessage(mixed $message, string $label = 'info')
|
||||
* @method static void alert(mixed $message)
|
||||
* @method static void critical(mixed $message)
|
||||
* @method static void debug(mixed $message)
|
||||
* @method static void emergency(mixed $message)
|
||||
* @method static void error(mixed $message)
|
||||
* @method static LaravelDebugbar getCollector(string $name)
|
||||
* @method static bool hasCollector(string $name)
|
||||
* @method static void info(mixed $message)
|
||||
* @method static void log(mixed $message)
|
||||
* @method static void notice(mixed $message)
|
||||
* @method static void warning(mixed $message)
|
||||
* @method static mixed measure(string $label, \Closure $closure)
|
||||
*
|
||||
* @deprecated Renamed to \Barryvdh\Debugbar\Facades\Debugbar
|
||||
* @see \Barryvdh\Debugbar\Facades\Debugbar
|
||||
*
|
||||
* @see \Barryvdh\Debugbar\LaravelDebugbar
|
||||
*/
|
||||
class Facade extends \Barryvdh\Debugbar\Facades\Debugbar
|
||||
{
|
||||
}
|
||||
33
vendor/barryvdh/laravel-debugbar/src/Facades/Debugbar.php
vendored
Normal file
33
vendor/barryvdh/laravel-debugbar/src/Facades/Debugbar.php
vendored
Normal file
@ -0,0 +1,33 @@
|
||||
<?php
|
||||
|
||||
namespace Barryvdh\Debugbar\Facades;
|
||||
|
||||
use DebugBar\DataCollector\DataCollectorInterface;
|
||||
|
||||
/**
|
||||
* @method static LaravelDebugbar addCollector(DataCollectorInterface $collector)
|
||||
* @method static void addMessage(mixed $message, string $label = 'info')
|
||||
* @method static void alert(mixed $message)
|
||||
* @method static void critical(mixed $message)
|
||||
* @method static void debug(mixed $message)
|
||||
* @method static void emergency(mixed $message)
|
||||
* @method static void error(mixed $message)
|
||||
* @method static LaravelDebugbar getCollector(string $name)
|
||||
* @method static bool hasCollector(string $name)
|
||||
* @method static void info(mixed $message)
|
||||
* @method static void log(mixed $message)
|
||||
* @method static void notice(mixed $message)
|
||||
* @method static void warning(mixed $message)
|
||||
*
|
||||
* @see \Barryvdh\Debugbar\LaravelDebugbar
|
||||
*/
|
||||
class Debugbar extends \Illuminate\Support\Facades\Facade
|
||||
{
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
protected static function getFacadeAccessor()
|
||||
{
|
||||
return \Barryvdh\Debugbar\LaravelDebugbar::class;
|
||||
}
|
||||
}
|
||||
156
vendor/barryvdh/laravel-debugbar/src/JavascriptRenderer.php
vendored
Normal file
156
vendor/barryvdh/laravel-debugbar/src/JavascriptRenderer.php
vendored
Normal file
@ -0,0 +1,156 @@
|
||||
<?php
|
||||
|
||||
namespace Barryvdh\Debugbar;
|
||||
|
||||
use DebugBar\DebugBar;
|
||||
use DebugBar\JavascriptRenderer as BaseJavascriptRenderer;
|
||||
use Illuminate\Routing\UrlGenerator;
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
class JavascriptRenderer extends BaseJavascriptRenderer
|
||||
{
|
||||
// Use XHR handler by default, instead of jQuery
|
||||
protected $ajaxHandlerBindToJquery = false;
|
||||
protected $ajaxHandlerBindToXHR = true;
|
||||
|
||||
public function __construct(DebugBar $debugBar, $baseUrl = null, $basePath = null)
|
||||
{
|
||||
parent::__construct($debugBar, $baseUrl, $basePath);
|
||||
|
||||
$this->cssFiles['laravel'] = __DIR__ . '/Resources/laravel-debugbar.css';
|
||||
$this->cssVendors['fontawesome'] = __DIR__ . '/Resources/vendor/font-awesome/style.css';
|
||||
$this->jsFiles['laravel-sql'] = __DIR__ . '/Resources/sqlqueries/widget.js';
|
||||
$this->jsFiles['laravel-cache'] = __DIR__ . '/Resources/cache/widget.js';
|
||||
$this->jsFiles['laravel-view'] = __DIR__ . '/Resources/templates/widget.js';
|
||||
|
||||
$theme = config('debugbar.theme', 'auto');
|
||||
switch ($theme) {
|
||||
case 'dark':
|
||||
$this->cssFiles['laravel-dark'] = __DIR__ . '/Resources/laravel-debugbar-dark-mode.css';
|
||||
break;
|
||||
case 'auto':
|
||||
$this->cssFiles['laravel-dark-0'] = __DIR__ . '/Resources/laravel-debugbar-dark-mode-media-start.css';
|
||||
$this->cssFiles['laravel-dark-1'] = __DIR__ . '/Resources/laravel-debugbar-dark-mode.css';
|
||||
$this->cssFiles['laravel-dark-2'] = __DIR__ . '/Resources/laravel-debugbar-dark-mode-media-end.css';
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the URL Generator
|
||||
*
|
||||
* @param \Illuminate\Routing\UrlGenerator $url
|
||||
* @deprecated
|
||||
*/
|
||||
public function setUrlGenerator($url)
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function renderHead()
|
||||
{
|
||||
$cssRoute = route('debugbar.assets.css', [
|
||||
'v' => $this->getModifiedTime('css'),
|
||||
'theme' => config('debugbar.theme', 'auto'),
|
||||
]);
|
||||
|
||||
$jsRoute = route('debugbar.assets.js', [
|
||||
'v' => $this->getModifiedTime('js')
|
||||
]);
|
||||
|
||||
$cssRoute = preg_replace('/\Ahttps?:/', '', $cssRoute);
|
||||
$jsRoute = preg_replace('/\Ahttps?:/', '', $jsRoute);
|
||||
|
||||
$html = "<link rel='stylesheet' type='text/css' property='stylesheet' href='{$cssRoute}' data-turbolinks-eval='false' data-turbo-eval='false'>";
|
||||
$html .= "<script src='{$jsRoute}' data-turbolinks-eval='false' data-turbo-eval='false'></script>";
|
||||
|
||||
if ($this->isJqueryNoConflictEnabled()) {
|
||||
$html .= '<script data-turbo-eval="false">jQuery.noConflict(true);</script>' . "\n";
|
||||
}
|
||||
|
||||
$html .= $this->getInlineHtml();
|
||||
|
||||
|
||||
return $html;
|
||||
}
|
||||
|
||||
protected function getInlineHtml()
|
||||
{
|
||||
$html = '';
|
||||
|
||||
foreach (['head', 'css', 'js'] as $asset) {
|
||||
foreach ($this->getAssets('inline_' . $asset) as $item) {
|
||||
$html .= $item . "\n";
|
||||
}
|
||||
}
|
||||
|
||||
return $html;
|
||||
}
|
||||
/**
|
||||
* Get the last modified time of any assets.
|
||||
*
|
||||
* @param string $type 'js' or 'css'
|
||||
* @return int
|
||||
*/
|
||||
protected function getModifiedTime($type)
|
||||
{
|
||||
$files = $this->getAssets($type);
|
||||
|
||||
$latest = 0;
|
||||
foreach ($files as $file) {
|
||||
$mtime = filemtime($file);
|
||||
if ($mtime > $latest) {
|
||||
$latest = $mtime;
|
||||
}
|
||||
}
|
||||
return $latest;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return assets as a string
|
||||
*
|
||||
* @param string $type 'js' or 'css'
|
||||
* @return string
|
||||
*/
|
||||
public function dumpAssetsToString($type)
|
||||
{
|
||||
$files = $this->getAssets($type);
|
||||
|
||||
$content = '';
|
||||
foreach ($files as $file) {
|
||||
$content .= file_get_contents($file) . "\n";
|
||||
}
|
||||
|
||||
return $content;
|
||||
}
|
||||
|
||||
/**
|
||||
* Makes a URI relative to another
|
||||
*
|
||||
* @param string|array $uri
|
||||
* @param string $root
|
||||
* @return string
|
||||
*/
|
||||
protected function makeUriRelativeTo($uri, $root)
|
||||
{
|
||||
if (!$root) {
|
||||
return $uri;
|
||||
}
|
||||
|
||||
if (is_array($uri)) {
|
||||
$uris = [];
|
||||
foreach ($uri as $u) {
|
||||
$uris[] = $this->makeUriRelativeTo($u, $root);
|
||||
}
|
||||
return $uris;
|
||||
}
|
||||
|
||||
if (substr($uri ?? '', 0, 1) === '/' || preg_match('/^([a-zA-Z]+:\/\/|[a-zA-Z]:\/|[a-zA-Z]:\\\)/', $uri ?? '')) {
|
||||
return $uri;
|
||||
}
|
||||
return rtrim($root, '/') . "/$uri";
|
||||
}
|
||||
}
|
||||
1174
vendor/barryvdh/laravel-debugbar/src/LaravelDebugbar.php
vendored
Normal file
1174
vendor/barryvdh/laravel-debugbar/src/LaravelDebugbar.php
vendored
Normal file
File diff suppressed because it is too large
Load Diff
51
vendor/barryvdh/laravel-debugbar/src/LumenServiceProvider.php
vendored
Normal file
51
vendor/barryvdh/laravel-debugbar/src/LumenServiceProvider.php
vendored
Normal file
@ -0,0 +1,51 @@
|
||||
<?php
|
||||
|
||||
namespace Barryvdh\Debugbar;
|
||||
|
||||
use Laravel\Lumen\Application;
|
||||
|
||||
class LumenServiceProvider extends ServiceProvider
|
||||
{
|
||||
/** @var Application */
|
||||
protected $app;
|
||||
|
||||
/**
|
||||
* Get the active router.
|
||||
*
|
||||
* @return Application
|
||||
*/
|
||||
protected function getRouter()
|
||||
{
|
||||
return $this->app->router;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the config path
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function getConfigPath()
|
||||
{
|
||||
return base_path('config/debugbar.php');
|
||||
}
|
||||
|
||||
/**
|
||||
* Register the Debugbar Middleware
|
||||
*
|
||||
* @param string $middleware
|
||||
*/
|
||||
protected function registerMiddleware($middleware)
|
||||
{
|
||||
$this->app->middleware([$middleware]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the services provided by the provider.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function provides()
|
||||
{
|
||||
return ['debugbar', 'command.debugbar.clear'];
|
||||
}
|
||||
}
|
||||
43
vendor/barryvdh/laravel-debugbar/src/Middleware/DebugbarEnabled.php
vendored
Normal file
43
vendor/barryvdh/laravel-debugbar/src/Middleware/DebugbarEnabled.php
vendored
Normal file
@ -0,0 +1,43 @@
|
||||
<?php
|
||||
|
||||
namespace Barryvdh\Debugbar\Middleware;
|
||||
|
||||
use Closure;
|
||||
use Illuminate\Http\Request;
|
||||
use Barryvdh\Debugbar\LaravelDebugbar;
|
||||
|
||||
class DebugbarEnabled
|
||||
{
|
||||
/**
|
||||
* The DebugBar instance
|
||||
*
|
||||
* @var LaravelDebugbar
|
||||
*/
|
||||
protected $debugbar;
|
||||
|
||||
/**
|
||||
* Create a new middleware instance.
|
||||
*
|
||||
* @param LaravelDebugbar $debugbar
|
||||
*/
|
||||
public function __construct(LaravelDebugbar $debugbar)
|
||||
{
|
||||
$this->debugbar = $debugbar;
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle an incoming request.
|
||||
*
|
||||
* @param Request $request
|
||||
* @param Closure $next
|
||||
* @return mixed
|
||||
*/
|
||||
public function handle($request, Closure $next)
|
||||
{
|
||||
if (!$this->debugbar->isEnabled()) {
|
||||
abort(404);
|
||||
}
|
||||
|
||||
return $next($request);
|
||||
}
|
||||
}
|
||||
120
vendor/barryvdh/laravel-debugbar/src/Middleware/InjectDebugbar.php
vendored
Normal file
120
vendor/barryvdh/laravel-debugbar/src/Middleware/InjectDebugbar.php
vendored
Normal file
@ -0,0 +1,120 @@
|
||||
<?php
|
||||
|
||||
namespace Barryvdh\Debugbar\Middleware;
|
||||
|
||||
use Closure;
|
||||
use Exception;
|
||||
use Illuminate\Http\Request;
|
||||
use Barryvdh\Debugbar\LaravelDebugbar;
|
||||
use Illuminate\Contracts\Container\Container;
|
||||
use Illuminate\Contracts\Debug\ExceptionHandler;
|
||||
use Throwable;
|
||||
|
||||
class InjectDebugbar
|
||||
{
|
||||
/**
|
||||
* The App container
|
||||
*
|
||||
* @var Container
|
||||
*/
|
||||
protected $container;
|
||||
|
||||
/**
|
||||
* The DebugBar instance
|
||||
*
|
||||
* @var LaravelDebugbar
|
||||
*/
|
||||
protected $debugbar;
|
||||
|
||||
/**
|
||||
* The URIs that should be excluded.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $except = [];
|
||||
|
||||
/**
|
||||
* Create a new middleware instance.
|
||||
*
|
||||
* @param Container $container
|
||||
* @param LaravelDebugbar $debugbar
|
||||
*/
|
||||
public function __construct(Container $container, LaravelDebugbar $debugbar)
|
||||
{
|
||||
$this->container = $container;
|
||||
$this->debugbar = $debugbar;
|
||||
$this->except = config('debugbar.except') ?: [];
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle an incoming request.
|
||||
*
|
||||
* @param Request $request
|
||||
* @param Closure $next
|
||||
* @return mixed
|
||||
*/
|
||||
public function handle($request, Closure $next)
|
||||
{
|
||||
if (!$this->debugbar->isEnabled() || $this->inExceptArray($request)) {
|
||||
return $next($request);
|
||||
}
|
||||
|
||||
$this->debugbar->boot();
|
||||
|
||||
try {
|
||||
/** @var \Illuminate\Http\Response $response */
|
||||
$response = $next($request);
|
||||
} catch (Throwable $e) {
|
||||
$response = $this->handleException($request, $e);
|
||||
}
|
||||
|
||||
// Modify the response to add the Debugbar
|
||||
$this->debugbar->modifyResponse($request, $response);
|
||||
|
||||
return $response;
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle the given exception.
|
||||
*
|
||||
* (Copy from Illuminate\Routing\Pipeline by Taylor Otwell)
|
||||
*
|
||||
* @param $passable
|
||||
* @param Throwable $e
|
||||
* @return mixed
|
||||
* @throws Exception
|
||||
*/
|
||||
protected function handleException($passable, $e)
|
||||
{
|
||||
if (! $this->container->bound(ExceptionHandler::class) || ! $passable instanceof Request) {
|
||||
throw $e;
|
||||
}
|
||||
|
||||
$handler = $this->container->make(ExceptionHandler::class);
|
||||
|
||||
$handler->report($e);
|
||||
|
||||
return $handler->render($passable, $e);
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine if the request has a URI that should be ignored.
|
||||
*
|
||||
* @param \Illuminate\Http\Request $request
|
||||
* @return bool
|
||||
*/
|
||||
protected function inExceptArray($request)
|
||||
{
|
||||
foreach ($this->except as $except) {
|
||||
if ($except !== '/') {
|
||||
$except = trim($except, '/');
|
||||
}
|
||||
|
||||
if ($request->is($except)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
59
vendor/barryvdh/laravel-debugbar/src/Resources/cache/widget.js
vendored
Normal file
59
vendor/barryvdh/laravel-debugbar/src/Resources/cache/widget.js
vendored
Normal file
@ -0,0 +1,59 @@
|
||||
(function ($) {
|
||||
|
||||
var csscls = PhpDebugBar.utils.makecsscls('phpdebugbar-widgets-');
|
||||
|
||||
/**
|
||||
* Widget for the displaying cache events
|
||||
*
|
||||
* Options:
|
||||
* - data
|
||||
*/
|
||||
var LaravelCacheWidget = PhpDebugBar.Widgets.LaravelCacheWidget = PhpDebugBar.Widgets.TimelineWidget.extend({
|
||||
|
||||
tagName: 'ul',
|
||||
|
||||
className: csscls('timeline cache'),
|
||||
|
||||
onForgetClick: function (e, el) {
|
||||
e.stopPropagation();
|
||||
|
||||
$.ajax({
|
||||
url: $(el).attr("data-url"),
|
||||
type: 'DELETE',
|
||||
success: function (result) {
|
||||
$(el).fadeOut(200);
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
render: function () {
|
||||
LaravelCacheWidget.__super__.render.apply(this);
|
||||
|
||||
this.bindAttr('data', function (data) {
|
||||
|
||||
if (data.measures) {
|
||||
var self = this;
|
||||
var lines = this.$el.find('.' + csscls('measure'));
|
||||
|
||||
for (var i = 0; i < data.measures.length; i++) {
|
||||
var measure = data.measures[i];
|
||||
var m = lines[i];
|
||||
|
||||
if (measure.params && !$.isEmptyObject(measure.params)) {
|
||||
if (measure.params.delete && measure.params.key) {
|
||||
$('<a />')
|
||||
.addClass(csscls('forget'))
|
||||
.text('forget')
|
||||
.attr('data-url', measure.params.delete)
|
||||
.one('click', function (e) {
|
||||
self.onForgetClick(e, this); })
|
||||
.appendTo(m);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
})(PhpDebugBar.$);
|
||||
1
vendor/barryvdh/laravel-debugbar/src/Resources/laravel-debugbar-dark-mode-media-end.css
vendored
Normal file
1
vendor/barryvdh/laravel-debugbar/src/Resources/laravel-debugbar-dark-mode-media-end.css
vendored
Normal file
@ -0,0 +1 @@
|
||||
}
|
||||
1
vendor/barryvdh/laravel-debugbar/src/Resources/laravel-debugbar-dark-mode-media-start.css
vendored
Normal file
1
vendor/barryvdh/laravel-debugbar/src/Resources/laravel-debugbar-dark-mode-media-start.css
vendored
Normal file
@ -0,0 +1 @@
|
||||
@media (prefers-color-scheme: dark) {
|
||||
292
vendor/barryvdh/laravel-debugbar/src/Resources/laravel-debugbar-dark-mode.css
vendored
Normal file
292
vendor/barryvdh/laravel-debugbar/src/Resources/laravel-debugbar-dark-mode.css
vendored
Normal file
@ -0,0 +1,292 @@
|
||||
/* Dark mode */
|
||||
|
||||
div.phpdebugbar,
|
||||
div.phpdebugbar-openhandler {
|
||||
--color-gray-100: #F7FAFC;
|
||||
--color-gray-200: #EDF2F7;
|
||||
--color-gray-300: #E2E8F0;
|
||||
--color-gray-400: #CBD5E0;
|
||||
--color-gray-500: #A0AEC0;
|
||||
--color-gray-600: #718096;
|
||||
--color-gray-700: #4A5568;
|
||||
--color-gray-800: #2D3748;
|
||||
--color-gray-900: #1A202C;
|
||||
--color-red-vivid: #FF0040;
|
||||
}
|
||||
|
||||
div.phpdebugbar,
|
||||
div.phpdebugbar-openhandler {
|
||||
background: var(--color-gray-800);
|
||||
}
|
||||
|
||||
div.phpdebugbar,
|
||||
div.phpdebugbar-openhandler,
|
||||
div.phpdebugbar div.phpdebugbar-header > div > *,
|
||||
div.phpdebugbar ul.phpdebugbar-widgets-timeline li span.phpdebugbar-widgets-label,
|
||||
div.phpdebugbar ul.phpdebugbar-widgets-timeline li span.phpdebugbar-widgets-collector,
|
||||
div.phpdebugbar ul.phpdebugbar-widgets-list li.phpdebugbar-widgets-list-item,
|
||||
div.phpdebugbar ul.phpdebugbar-widgets-list li span.phpdebugbar-widgets-label,
|
||||
div.phpdebugbar code.phpdebugbar-widgets-sql span.hljs-keyword,
|
||||
div.phpdebugbar-openhandler .phpdebugbar-openhandler-header,
|
||||
div.phpdebugbar-openhandler .phpdebugbar-openhandler-header a {
|
||||
color: var(--color-gray-200);
|
||||
}
|
||||
|
||||
div.phpdebugbar-openhandler,
|
||||
div.phpdebugbar div.phpdebugbar-widgets-messages div.phpdebugbar-widgets-toolbar,
|
||||
div.phpdebugbar div.phpdebugbar-widgets-exceptions li.phpdebugbar-widgets-list-item pre.phpdebugbar-widgets-file,
|
||||
div.phpdebugbar ul.phpdebugbar-widgets-list li.phpdebugbar-widgets-list-item table.phpdebugbar-widgets-params,
|
||||
div.phpdebugbar-openhandler .phpdebugbar-openhandler-actions > a,
|
||||
div.phpdebugbar-openhandler .phpdebugbar-openhandler-actions button,
|
||||
div.phpdebugbar-openhandler .phpdebugbar-openhandler-actions > form input,
|
||||
div.phpdebugbar-openhandler .phpdebugbar-openhandler-actions > form select {
|
||||
border-color: var(--color-gray-600);
|
||||
}
|
||||
|
||||
div.phpdebugbar div.phpdebugbar-header,
|
||||
div.phpdebugbar div.phpdebugbar-panel div.phpdebugbar-widgets-status > span:first-child:before,
|
||||
div.phpdebugbar-openhandler table th,
|
||||
div.phpdebugbar-openhandler .phpdebugbar-openhandler-actions > a,
|
||||
div.phpdebugbar-openhandler .phpdebugbar-openhandler-actions button,
|
||||
div.phpdebugbar-openhandler .phpdebugbar-openhandler-actions > form input,
|
||||
div.phpdebugbar-openhandler .phpdebugbar-openhandler-actions > form select {
|
||||
text-shadow: 1px 1px var(--color-gray-700);
|
||||
}
|
||||
|
||||
div.phpdebugbar div.phpdebugbar-header > div > select,
|
||||
div.phpdebugbar ul.phpdebugbar-widgets-list li.phpdebugbar-widgets-list-item table.phpdebugbar-widgets-params,
|
||||
div.phpdebugbar-openhandler .phpdebugbar-openhandler-actions > form input,
|
||||
div.phpdebugbar-openhandler .phpdebugbar-openhandler-actions > form select,
|
||||
div.phpdebugbar input[type='text'],
|
||||
div.phpdebugbar input[type='password'] {
|
||||
background-color: var(--color-gray-800);
|
||||
}
|
||||
|
||||
div.phpdebugbar div.phpdebugbar-header,
|
||||
div.phpdebugbar a.phpdebugbar-restore-btn,
|
||||
div.phpdebugbar-openhandler .phpdebugbar-openhandler-header,
|
||||
div.phpdebugbar dl.phpdebugbar-widgets-kvlist > :nth-child(4n-1),
|
||||
div.phpdebugbar dl.phpdebugbar-widgets-kvlist > :nth-child(4n),
|
||||
div.phpdebugbar ul.phpdebugbar-widgets-list li.phpdebugbar-widgets-list-item:nth-child(even),
|
||||
div.phpdebugbar .hljs,
|
||||
div.phpdebugbar div.phpdebugbar-widgets-sqlqueries table.phpdebugbar-widgets-params th,
|
||||
div.phpdebugbar-openhandler .phpdebugbar-openhandler-actions > a,
|
||||
div.phpdebugbar-openhandler .phpdebugbar-openhandler-actions button,
|
||||
div.phpdebugbar div.phpdebugbar-widgets-templates table.phpdebugbar-widgets-params th {
|
||||
background-color: var(--color-gray-900);
|
||||
}
|
||||
|
||||
div.phpdebugbar .phpdebugbar-widgets-mails ul.phpdebugbar-widgets-list li.phpdebugbar-widgets-list-item .phpdebugbar-widgets-headers,
|
||||
div.phpdebugbar ul.phpdebugbar-widgets-list li.phpdebugbar-widgets-list-item table.phpdebugbar-widgets-params {
|
||||
border-left-color: var(--color-gray-600);
|
||||
}
|
||||
|
||||
div.phpdebugbar a.phpdebugbar-tab:hover,
|
||||
div.phpdebugbar span.phpdebugbar-indicator:hover,
|
||||
div.phpdebugbar a.phpdebugbar-indicator:hover,
|
||||
div.phpdebugbar a.phpdebugbar-close-btn:hover,
|
||||
div.phpdebugbar a.phpdebugbar-minimize-btn:hover,
|
||||
div.phpdebugbar a.phpdebugbar-maximize-btn:hover,
|
||||
div.phpdebugbar a.phpdebugbar-open-btn:hover,
|
||||
div.phpdebugbar-openhandler table th,
|
||||
div.phpdebugbar-openhandler table tr:nth-child(2n),
|
||||
div.phpdebugbar div.phpdebugbar-widgets-messages div.phpdebugbar-widgets-toolbar {
|
||||
background-color: var(--color-gray-700);
|
||||
}
|
||||
|
||||
div.phpdebugbar .phpdebugbar-indicator span.phpdebugbar-tooltip,
|
||||
div.phpdebugbar div.phpdebugbar-mini-design a.phpdebugbar-tab:hover span.phpdebugbar-text,
|
||||
div.phpdebugbar pre.sf-dump,
|
||||
div.phpdebugbar .hljs,
|
||||
div.phpdebugbar code.phpdebugbar-widgets-sql span.hljs-operator {
|
||||
color: var(--color-gray-100);
|
||||
}
|
||||
|
||||
div.phpdebugbar pre.sf-dump .sf-dump-public,
|
||||
div.phpdebugbar pre.sf-dump .sf-dump-protected,
|
||||
div.phpdebugbar pre.sf-dump .sf-dump-private {
|
||||
color: var(--color-gray-100) !important;
|
||||
}
|
||||
|
||||
div.phpdebugbar div.phpdebugbar-panel div.phpdebugbar-widgets-status > span:first-child:before,
|
||||
div.phpdebugbar-openhandler a {
|
||||
color: var(--color-gray-500);
|
||||
}
|
||||
|
||||
div.phpdebugbar .phpdebugbar-indicator span.phpdebugbar-tooltip,
|
||||
div.phpdebugbar div.phpdebugbar-mini-design a.phpdebugbar-tab:hover span.phpdebugbar-text {
|
||||
background: var(--color-gray-900);
|
||||
}
|
||||
|
||||
div.phpdebugbar .hljs-tag .hljs-value,
|
||||
div.phpdebugbar .hljs-phpdoc,
|
||||
div.phpdebugbar .tex .hljs-formula,
|
||||
div.phpdebugbar div.phpdebugbar-widgets-exceptions li.phpdebugbar-widgets-list-item span.phpdebugbar-widgets-message {
|
||||
color: var(--color-red-vivid);
|
||||
}
|
||||
|
||||
div.phpdebugbar div.phpdebugbar-widgets-exceptions li.phpdebugbar-widgets-list-item span.phpdebugbar-widgets-filename,
|
||||
div.phpdebugbar div.phpdebugbar-widgets-sqlqueries li.phpdebugbar-widgets-list-item span.phpdebugbar-widgets-database,
|
||||
div.phpdebugbar div.phpdebugbar-widgets-sqlqueries li.phpdebugbar-widgets-list-item span.phpdebugbar-widgets-duration,
|
||||
div.phpdebugbar div.phpdebugbar-widgets-sqlqueries li.phpdebugbar-widgets-list-item span.phpdebugbar-widgets-memory,
|
||||
div.phpdebugbar div.phpdebugbar-widgets-sqlqueries li.phpdebugbar-widgets-list-item span.phpdebugbar-widgets-row-count,
|
||||
div.phpdebugbar div.phpdebugbar-widgets-sqlqueries li.phpdebugbar-widgets-list-item span.phpdebugbar-widgets-copy-clipboard,
|
||||
div.phpdebugbar div.phpdebugbar-widgets-sqlqueries li.phpdebugbar-widgets-list-item span.phpdebugbar-widgets-stmt-id,
|
||||
div.phpdebugbar .phpdebugbar-widgets-callgraph pre,
|
||||
div.phpdebugbar .phpdebugbar-text-muted,
|
||||
div.phpdebugbar-openhandler .phpdebugbar-text-muted
|
||||
{
|
||||
color: var(--color-gray-600);
|
||||
}
|
||||
|
||||
div.phpdebugbar div.phpdebugbar-widgets-sqlqueries li.phpdebugbar-widgets-list-item.phpdebugbar-widgets-sql-duplicate {
|
||||
background-color: #6f6200;
|
||||
}
|
||||
|
||||
div.phpdebugbar-widgets-messages li.phpdebugbar-widgets-list-item span.phpdebugbar-widgets-value:before {
|
||||
color: #7B7B7B;
|
||||
}
|
||||
|
||||
div.phpdebugbar-openhandler {
|
||||
border-top-color: #fa5661;
|
||||
}
|
||||
|
||||
div.phpdebugbar div.phpdebugbar-header .phpdebugbar-tab {
|
||||
border-left-color: var(--color-gray-800);
|
||||
}
|
||||
|
||||
div.phpdebugbar div.phpdebugbar-body {
|
||||
border-top-color: var(--color-gray-800);
|
||||
}
|
||||
|
||||
div.phpdebugbar a.phpdebugbar-restore-btn {
|
||||
border-right-color: var(--color-gray-800) !important;
|
||||
}
|
||||
|
||||
div.phpdebugbar span.phpdebugbar-indicator,
|
||||
div.phpdebugbar a.phpdebugbar-indicator,
|
||||
div.phpdebugbar a.phpdebugbar-close-btn {
|
||||
border-right-color: var(--color-gray-800);
|
||||
}
|
||||
|
||||
div.phpdebugbar div.phpdebugbar-panel div.phpdebugbar-widgets-status {
|
||||
background-color: var(--color-gray-900) !important;
|
||||
border-bottom-color: var(--color-gray-800) !important;
|
||||
}
|
||||
|
||||
div.phpdebugbar div.phpdebugbar-widgets-templates div.phpdebugbar-widgets-status {
|
||||
background: var(--color-gray-900) !important;
|
||||
}
|
||||
|
||||
div.phpdebugbar div.phpdebugbar-panel div.phpdebugbar-widgets-status > * {
|
||||
color: var(--color-gray-200) !important;
|
||||
}
|
||||
|
||||
div.phpdebugbar div.phpdebugbar-widgets-templates span.phpdebugbar-widgets-render-time,
|
||||
div.phpdebugbar div.phpdebugbar-widgets-templates span.phpdebugbar-widgets-memory,
|
||||
div.phpdebugbar div.phpdebugbar-widgets-templates span.phpdebugbar-widgets-param-count,
|
||||
div.phpdebugbar div.phpdebugbar-widgets-templates span.phpdebugbar-widgets-type {
|
||||
color: var(--color-gray-600) !important;
|
||||
}
|
||||
|
||||
div.phpdebugbar div.phpdebugbar-widgets-sqlqueries table.phpdebugbar-widgets-params td {
|
||||
border-color: var(--color-gray-600) !important;
|
||||
}
|
||||
|
||||
div.phpdebugbar code,
|
||||
div.phpdebugbar pre {
|
||||
color: #FFF;
|
||||
}
|
||||
|
||||
div.phpdebugbar-openhandler .phpdebugbar-openhandler-actions > a,
|
||||
div.phpdebugbar-openhandler .phpdebugbar-openhandler-actions button,
|
||||
div.phpdebugbar-openhandler .phpdebugbar-openhandler-actions > form input,
|
||||
div.phpdebugbar-openhandler .phpdebugbar-openhandler-actions > form select,
|
||||
div.phpdebugbar input[type='text'],
|
||||
div.phpdebugbar input[type='password'] {
|
||||
color: var(--color-gray-300);
|
||||
}
|
||||
|
||||
div.phpdebugbar div.phpdebugbar-widgets-exceptions li.phpdebugbar-widgets-list-item.phpdebugbar-widgets-sql-duplicate span.phpdebugbar-widgets-filename,
|
||||
div.phpdebugbar div.phpdebugbar-widgets-sqlqueries li.phpdebugbar-widgets-list-item.phpdebugbar-widgets-sql-duplicate span.phpdebugbar-widgets-database,
|
||||
div.phpdebugbar div.phpdebugbar-widgets-sqlqueries li.phpdebugbar-widgets-list-item.phpdebugbar-widgets-sql-duplicate span.phpdebugbar-widgets-duration,
|
||||
div.phpdebugbar div.phpdebugbar-widgets-sqlqueries li.phpdebugbar-widgets-list-item.phpdebugbar-widgets-sql-duplicate span.phpdebugbar-widgets-memory,
|
||||
div.phpdebugbar div.phpdebugbar-widgets-sqlqueries li.phpdebugbar-widgets-list-item.phpdebugbar-widgets-sql-duplicate span.phpdebugbar-widgets-row-count,
|
||||
div.phpdebugbar div.phpdebugbar-widgets-sqlqueries li.phpdebugbar-widgets-list-item.phpdebugbar-widgets-sql-duplicate span.phpdebugbar-widgets-copy-clipboard,
|
||||
div.phpdebugbar div.phpdebugbar-widgets-sqlqueries li.phpdebugbar-widgets-list-item.phpdebugbar-widgets-sql-duplicate span.phpdebugbar-widgets-stmt-id {
|
||||
color: var(--color-gray-500);
|
||||
}
|
||||
|
||||
div.phpdebugbar a.phpdebugbar-minimize-btn {
|
||||
background: url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%201792%201792%22%20id%3D%22chevron-down%22%3E%3Cpath%20d%3D%22M1683%20808l-742%20741q-19%2019-45%2019t-45-19l-742-741q-19-19-19-45.5t19-45.5l166-165q19-19%2045-19t45%2019l531%20531%20531-531q19-19%2045-19t45%2019l166%20165q19%2019%2019%2045.5t-19%2045.5z%22%20style%3D%22fill%3A%20%23EDF2F7%22%2F%3E%3C%2Fsvg%3E) no-repeat 6px 6px / 14px 14px;
|
||||
}
|
||||
|
||||
div.phpdebugbar a.phpdebugbar-maximize-btn {
|
||||
background: url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%201792%201792%22%20id%3D%22chevron-up%22%3E%3Cpath%20d%3D%22M1683%201331l-166%20165q-19%2019-45%2019t-45-19l-531-531-531%20531q-19%2019-45%2019t-45-19l-166-165q-19-19-19-45.5t19-45.5l742-741q19-19%2045-19t45%2019l742%20741q19%2019%2019%2045.5t-19%2045.5z%22%20style%3D%22fill%3A%20%23EDF2F7%22%2F%3E%3C%2Fsvg%3E) no-repeat 6px 6px / 14px 14px;
|
||||
}
|
||||
|
||||
div.phpdebugbar a.phpdebugbar-open-btn {
|
||||
background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAOCAYAAADJ7fe0AAABL0lEQVQ4T63RvWqEQBAA4LkjdX46WQh5hoDpFnyAgGzKWKQJdgFfIT8vIKSwCSEQHyJN4AptomAlZMXAVRuxWAwibqMGBUVygdtAplmWmf1mmVnAP8RiNDjne0KINQDsz9wCIXSwrc+AMMa6tm0hz3PozzGWyyUoirJhIISm5n1yuIRh2G3rNs+rqvo7IoTIMMbnkthqXjf9JAiCO0LIR9d1T5JQXzbMbEA8z/vEGB9TSt/KsjyURZIkeTQM43JAHMe5JYS8Zlm2appG1gDXdbFt2/44IIVS+lCW5amswBh70XX9DADEuOIjzvlaCCFrgO/7F5ZlPU8rTtP0viiKK1mhqqpU07STfrATEsfxV13Xu7JIFEU3pmlej/XjTDAA7MgiAPAOANlP5A/vN0u/AXUIgA+u4l6FAAAAAElFTkSuQmCC) no-repeat 8px 6px;
|
||||
}
|
||||
|
||||
div.phpdebugbar a.phpdebugbar-close-btn {
|
||||
background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAABUElEQVQ4T52SMUsDMRTH3xUPChHCxeko3YrUqeFGEexym3boJ9DBufhJpLODfoIbTrcuFcSxxMki3Uq5yZRAAweRVp70HdfWQZolb3i/l/x/iQd7Lm9PDjbA2Wz24HmerFarbSGEwaFaa57n+XC1WqlarXZNBxUgQsaYK+ccCCHeGWPn2GStfdFat3zfB875I8EFOBqNPpbLZRObsQnh9YktHIarUqmMoyg6wboApZTtfr9/zxhrEIw7QdbaSa/Xu1FKDTdAADiQUp6VYcpTgl4B4HsbhCRJjsIwfPN9/7hs2zn3mWXZabfb/dqRg/ZIBF2PmigzCiPbRcbpdKrQXjkTguXMKKxer8uNqw4Gg6cgCC7WT/ArAuty5vl8/hzH8eV2xmaapnec88baHooAEmaMmXQ6nVsAGO/IAQB8x0MAUGQPbSMPAAuC/gL//XV/ALsvnQ+MsaHgAAAAAElFTkSuQmCC) no-repeat 9px 6px;
|
||||
}
|
||||
|
||||
|
||||
/* Dracula Theme v1.2.5
|
||||
*
|
||||
* https://github.com/dracula/highlightjs
|
||||
*
|
||||
* Copyright 2016-present, All rights reserved
|
||||
*
|
||||
* Code licensed under the MIT license
|
||||
*
|
||||
* @author Denis Ciccale <dciccale@gmail.com>
|
||||
* @author Zeno Rocha <hi@zenorocha.com>
|
||||
*/
|
||||
|
||||
div.phpdebugbar .hljs-built_in,
|
||||
div.phpdebugbar .hljs-selector-tag,
|
||||
div.phpdebugbar .hljs-section,
|
||||
div.phpdebugbar .hljs-link {
|
||||
color: #8be9fd;
|
||||
}
|
||||
|
||||
div.phpdebugbar .hljs-keyword {
|
||||
color: #ff79c6;
|
||||
}
|
||||
|
||||
div.phpdebugbar .hljs,
|
||||
div.phpdebugbar .hljs-subst {
|
||||
color: #f8f8f2;
|
||||
}
|
||||
|
||||
div.phpdebugbar .hljs-title {
|
||||
color: #50fa7b;
|
||||
}
|
||||
|
||||
div.phpdebugbar .hljs-string,
|
||||
div.phpdebugbar .hljs-meta,
|
||||
div.phpdebugbar .hljs-name,
|
||||
div.phpdebugbar .hljs-type,
|
||||
div.phpdebugbar .hljs-attr,
|
||||
div.phpdebugbar .hljs-symbol,
|
||||
div.phpdebugbar .hljs-bullet,
|
||||
div.phpdebugbar .hljs-addition,
|
||||
div.phpdebugbar .hljs-variable,
|
||||
div.phpdebugbar .hljs-template-tag,
|
||||
div.phpdebugbar .hljs-template-variable {
|
||||
color: #f1fa8c;
|
||||
}
|
||||
|
||||
div.phpdebugbar .hljs-comment,
|
||||
div.phpdebugbar .hljs-quote,
|
||||
div.phpdebugbar .hljs-deletion {
|
||||
color: #6272a4;
|
||||
}
|
||||
|
||||
div.phpdebugbar .hljs-literal,
|
||||
div.phpdebugbar .hljs-number {
|
||||
color: #bd93f9;
|
||||
}
|
||||
806
vendor/barryvdh/laravel-debugbar/src/Resources/laravel-debugbar.css
vendored
Normal file
806
vendor/barryvdh/laravel-debugbar/src/Resources/laravel-debugbar.css
vendored
Normal file
File diff suppressed because one or more lines are too long
292
vendor/barryvdh/laravel-debugbar/src/Resources/sqlqueries/widget.js
vendored
Normal file
292
vendor/barryvdh/laravel-debugbar/src/Resources/sqlqueries/widget.js
vendored
Normal file
@ -0,0 +1,292 @@
|
||||
(function ($) {
|
||||
|
||||
var csscls = PhpDebugBar.utils.makecsscls('phpdebugbar-widgets-');
|
||||
|
||||
/**
|
||||
* Widget for the displaying sql queries
|
||||
*
|
||||
* Options:
|
||||
* - data
|
||||
*/
|
||||
var LaravelSQLQueriesWidget = PhpDebugBar.Widgets.LaravelSQLQueriesWidget = PhpDebugBar.Widget.extend({
|
||||
|
||||
className: csscls('sqlqueries'),
|
||||
|
||||
onFilterClick: function (el) {
|
||||
$(el).toggleClass(csscls('excluded'));
|
||||
|
||||
var excludedLabels = [];
|
||||
this.$toolbar.find(csscls('.filter') + csscls('.excluded')).each(function () {
|
||||
excludedLabels.push(this.rel);
|
||||
});
|
||||
|
||||
this.$list.$el.find("li[connection=" + $(el).attr("rel") + "]").toggle();
|
||||
|
||||
this.set('exclude', excludedLabels);
|
||||
},
|
||||
|
||||
onCopyToClipboard: function (el) {
|
||||
var code = $(el).parent('li').find('code').get(0);
|
||||
var copy = function () {
|
||||
try {
|
||||
document.execCommand('copy');
|
||||
alert('Query copied to the clipboard');
|
||||
} catch (err) {
|
||||
console.log('Oops, unable to copy');
|
||||
}
|
||||
};
|
||||
var select = function (node) {
|
||||
if (document.selection) {
|
||||
var range = document.body.createTextRange();
|
||||
range.moveToElementText(node);
|
||||
range.select();
|
||||
} else if (window.getSelection) {
|
||||
var range = document.createRange();
|
||||
range.selectNodeContents(node);
|
||||
window.getSelection().removeAllRanges();
|
||||
window.getSelection().addRange(range);
|
||||
}
|
||||
copy();
|
||||
window.getSelection().removeAllRanges();
|
||||
};
|
||||
select(code);
|
||||
},
|
||||
|
||||
render: function () {
|
||||
this.$status = $('<div />').addClass(csscls('status')).appendTo(this.$el);
|
||||
|
||||
this.$toolbar = $('<div></div>').addClass(csscls('toolbar')).appendTo(this.$el);
|
||||
|
||||
var filters = [], self = this;
|
||||
|
||||
this.$list = new PhpDebugBar.Widgets.ListWidget({ itemRenderer: function (li, stmt) {
|
||||
if (stmt.type === 'transaction') {
|
||||
$('<strong />').addClass(csscls('sql')).addClass(csscls('name')).text(stmt.sql).appendTo(li);
|
||||
} else {
|
||||
$('<code />').addClass(csscls('sql')).html(PhpDebugBar.Widgets.highlight(stmt.sql, 'sql')).appendTo(li);
|
||||
}
|
||||
if (stmt.width_percent) {
|
||||
$('<div></div>').addClass(csscls('bg-measure')).append(
|
||||
$('<div></div>').addClass(csscls('value')).css({
|
||||
left: stmt.start_percent + '%',
|
||||
width: Math.max(stmt.width_percent, 0.01) + '%',
|
||||
})
|
||||
).appendTo(li);
|
||||
}
|
||||
if (stmt.duration_str) {
|
||||
$('<span title="Duration" />').addClass(csscls('duration')).text(stmt.duration_str).appendTo(li);
|
||||
}
|
||||
if (stmt.memory_str) {
|
||||
$('<span title="Memory usage" />').addClass(csscls('memory')).text(stmt.memory_str).appendTo(li);
|
||||
}
|
||||
if (typeof(stmt.row_count) != 'undefined') {
|
||||
$('<span title="Row count" />').addClass(csscls('row-count')).text(stmt.row_count).appendTo(li);
|
||||
}
|
||||
if (typeof(stmt.stmt_id) != 'undefined' && stmt.stmt_id) {
|
||||
$('<span title="Prepared statement ID" />').addClass(csscls('stmt-id')).text(stmt.stmt_id).appendTo(li);
|
||||
}
|
||||
if (stmt.connection) {
|
||||
$('<span title="Connection" />').addClass(csscls('database')).text(stmt.connection).appendTo(li);
|
||||
li.attr("connection",stmt.connection);
|
||||
if ( $.inArray(stmt.connection, filters) == -1 ) {
|
||||
filters.push(stmt.connection);
|
||||
$('<a />')
|
||||
.addClass(csscls('filter'))
|
||||
.text(stmt.connection)
|
||||
.attr('rel', stmt.connection)
|
||||
.on('click', function () {
|
||||
self.onFilterClick(this); })
|
||||
.appendTo(self.$toolbar);
|
||||
if (filters.length > 1) {
|
||||
self.$toolbar.show();
|
||||
self.$list.$el.css("margin-bottom","20px");
|
||||
}
|
||||
}
|
||||
}
|
||||
if (typeof(stmt.is_success) != 'undefined' && !stmt.is_success) {
|
||||
li.addClass(csscls('error'));
|
||||
li.append($('<span />').addClass(csscls('error')).text("[" + stmt.error_code + "] " + stmt.error_message));
|
||||
}
|
||||
if (stmt.show_copy) {
|
||||
$('<span title="Copy to clipboard" />')
|
||||
.addClass(csscls('copy-clipboard'))
|
||||
.css('cursor', 'pointer')
|
||||
.on('click', function (event) {
|
||||
self.onCopyToClipboard(this);
|
||||
event.stopPropagation();
|
||||
})
|
||||
.appendTo(li);
|
||||
}
|
||||
|
||||
var table = $('<table><tr><th colspan="2">Metadata</th></tr></table>').addClass(csscls('params')).appendTo(li);
|
||||
|
||||
if (stmt.bindings && stmt.bindings.length) {
|
||||
table.append(function () {
|
||||
var icon = 'thumb-tack';
|
||||
var $icon = '<i class="phpdebugbar-fa phpdebugbar-fa-' + icon + ' phpdebugbar-text-muted"></i>';
|
||||
var $name = $('<td />').addClass(csscls('name')).html('Bindings ' + $icon);
|
||||
var $value = $('<td />').addClass(csscls('value'));
|
||||
var $span = $('<span />').addClass('phpdebugbar-text-muted');
|
||||
|
||||
var index = 0;
|
||||
var $bindings = new PhpDebugBar.Widgets.ListWidget({ itemRenderer: function (li, binding) {
|
||||
var $index = $span.clone().text(index++ + '.');
|
||||
li.append($index, ' ', binding).removeClass(csscls('list-item')).addClass(csscls('table-list-item'));
|
||||
}});
|
||||
|
||||
$bindings.set('data', stmt.bindings);
|
||||
|
||||
$bindings.$el
|
||||
.removeClass(csscls('list'))
|
||||
.addClass(csscls('table-list'))
|
||||
.appendTo($value);
|
||||
|
||||
return $('<tr />').append($name, $value);
|
||||
});
|
||||
}
|
||||
|
||||
if (stmt.hints && stmt.hints.length) {
|
||||
table.append(function () {
|
||||
var icon = 'question-circle';
|
||||
var $icon = '<i class="phpdebugbar-fa phpdebugbar-fa-' + icon + ' phpdebugbar-text-muted"></i>';
|
||||
var $name = $('<td />').addClass(csscls('name')).html('Hints ' + $icon);
|
||||
var $value = $('<td />').addClass(csscls('value'));
|
||||
|
||||
var $hints = new PhpDebugBar.Widgets.ListWidget({ itemRenderer: function (li, hint) {
|
||||
li.append(hint).removeClass(csscls('list-item')).addClass(csscls('table-list-item'));
|
||||
}});
|
||||
|
||||
$hints.set('data', stmt.hints);
|
||||
$hints.$el
|
||||
.removeClass(csscls('list'))
|
||||
.addClass(csscls('table-list'))
|
||||
.appendTo($value);
|
||||
|
||||
return $('<tr />').append($name, $value);
|
||||
});
|
||||
}
|
||||
|
||||
if (stmt.backtrace && stmt.backtrace.length) {
|
||||
table.append(function () {
|
||||
var icon = 'list-ul';
|
||||
var $icon = '<i class="phpdebugbar-fa phpdebugbar-fa-' + icon + ' phpdebugbar-text-muted"></i>';
|
||||
var $name = $('<td />').addClass(csscls('name')).html('Backtrace ' + $icon);
|
||||
var $value = $('<td />').addClass(csscls('value'));
|
||||
var $span = $('<span />').addClass('phpdebugbar-text-muted');
|
||||
|
||||
var $backtrace = new PhpDebugBar.Widgets.ListWidget({ itemRenderer: function (li, source) {
|
||||
var $parts = [
|
||||
$span.clone().text(source.index + '.'),
|
||||
' ',
|
||||
];
|
||||
|
||||
if (source.namespace) {
|
||||
$parts.push(source.namespace + '::');
|
||||
}
|
||||
|
||||
$parts.push(source.name);
|
||||
$parts.push($span.clone().text(':' + source.line));
|
||||
|
||||
li.append($parts).removeClass(csscls('list-item')).addClass(csscls('table-list-item'));
|
||||
}});
|
||||
|
||||
$backtrace.set('data', stmt.backtrace);
|
||||
|
||||
$backtrace.$el
|
||||
.removeClass(csscls('list'))
|
||||
.addClass(csscls('table-list'))
|
||||
.appendTo($value);
|
||||
|
||||
return $('<tr />').append($name, $value);
|
||||
});
|
||||
}
|
||||
|
||||
if (stmt.params && !$.isEmptyObject(stmt.params)) {
|
||||
for (var key in stmt.params) {
|
||||
if (typeof stmt.params[key] !== 'function') {
|
||||
table.append('<tr><td class="' + csscls('name') + '">' + key + '</td><td class="' + csscls('value') +
|
||||
'">' + stmt.params[key] + '</td></tr>');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
li.css('cursor', 'pointer').click(function () {
|
||||
if (table.is(':visible')) {
|
||||
table.hide();
|
||||
} else {
|
||||
table.show();
|
||||
}
|
||||
});
|
||||
}});
|
||||
this.$list.$el.appendTo(this.$el);
|
||||
|
||||
this.bindAttr('data', function (data) {
|
||||
this.$list.set('data', data.statements);
|
||||
this.$status.empty();
|
||||
var stmt;
|
||||
|
||||
// Search for duplicate statements.
|
||||
for (var sql = {}, duplicate = 0, i = 0; i < data.statements.length; i++) {
|
||||
if (data.statements[i].type === 'query') {
|
||||
stmt = data.statements[i].sql;
|
||||
if (data.statements[i].bindings && data.statements[i].bindings.length) {
|
||||
stmt += JSON.stringify(data.statements[i].bindings);
|
||||
}
|
||||
if (data.statements[i].connection) {
|
||||
stmt += '@' + data.statements[i].connection;
|
||||
}
|
||||
sql[stmt] = sql[stmt] || { keys: [] };
|
||||
sql[stmt].keys.push(i);
|
||||
}
|
||||
}
|
||||
// Add classes to all duplicate SQL statements.
|
||||
for (stmt in sql) {
|
||||
if (sql[stmt].keys.length > 1) {
|
||||
duplicate += sql[stmt].keys.length;
|
||||
|
||||
for (i = 0; i < sql[stmt].keys.length; i++) {
|
||||
this.$list.$el.find('.' + csscls('list-item')).eq(sql[stmt].keys[i])
|
||||
.addClass(csscls('sql-duplicate'))
|
||||
.addClass(csscls('sql-duplicate-' + duplicate));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var t = $('<span />').text(data.nb_statements + " statements were executed").appendTo(this.$status);
|
||||
if (data.nb_failed_statements) {
|
||||
t.append(", " + data.nb_failed_statements + " of which failed");
|
||||
}
|
||||
if (duplicate) {
|
||||
t.append(", " + duplicate + " of which were duplicated");
|
||||
t.append(", " + (data.nb_statements - duplicate) + " unique");
|
||||
|
||||
// add toggler for displaying only duplicated queries
|
||||
var duplicatedText = "Show only duplicated";
|
||||
var allText = "Show All";
|
||||
var id = "phpdebugbar-show-duplicates";
|
||||
t.append(". <a id='" + id + "'>" + duplicatedText + "</a>");
|
||||
|
||||
$(".phpdebugbar #" + id).click(function () {
|
||||
var $this = $(this);
|
||||
$this.toggleClass("shown_duplicated");
|
||||
$this.text($this.hasClass("shown_duplicated") ? allText : duplicatedText);
|
||||
$(".phpdebugbar-widgets-sqlqueries .phpdebugbar-widgets-list-item")
|
||||
.not(".phpdebugbar-widgets-sql-duplicate")
|
||||
.toggle();
|
||||
|
||||
return false;
|
||||
});
|
||||
|
||||
}
|
||||
if (data.accumulated_duration_str) {
|
||||
this.$status.append($('<span title="Accumulated duration" />').addClass(csscls('duration')).text(data.accumulated_duration_str));
|
||||
}
|
||||
if (data.memory_usage_str) {
|
||||
this.$status.append($('<span title="Memory usage" />').addClass(csscls('memory')).text(data.memory_usage_str));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
})(PhpDebugBar.$);
|
||||
98
vendor/barryvdh/laravel-debugbar/src/Resources/templates/widget.js
vendored
Normal file
98
vendor/barryvdh/laravel-debugbar/src/Resources/templates/widget.js
vendored
Normal file
@ -0,0 +1,98 @@
|
||||
(function($) {
|
||||
|
||||
var csscls = PhpDebugBar.utils.makecsscls('phpdebugbar-widgets-');
|
||||
|
||||
/**
|
||||
* Widget for the displaying templates data
|
||||
*
|
||||
* Options:
|
||||
* - data
|
||||
*/
|
||||
var TemplatesWidget = PhpDebugBar.Widgets.LaravelViewTemplatesWidget = PhpDebugBar.Widget.extend({
|
||||
|
||||
className: csscls('templates'),
|
||||
|
||||
render: function() {
|
||||
this.$status = $('<div />').addClass(csscls('status')).appendTo(this.$el);
|
||||
|
||||
this.$list = new PhpDebugBar.Widgets.ListWidget({ itemRenderer: function(li, tpl) {
|
||||
$('<span />').addClass(csscls('name')).text(tpl.name).appendTo(li);
|
||||
|
||||
if (typeof tpl.editorLink !== 'undefined' && tpl.editorLink !== null) {
|
||||
$('<a href="' + tpl.editorLink + '"></a>')
|
||||
.addClass(csscls('editor-link'))
|
||||
.on('click', function (event) {
|
||||
event.stopPropagation();
|
||||
})
|
||||
.appendTo(li);
|
||||
}
|
||||
if (typeof tpl.xdebug_link !== 'undefined' && tpl.xdebug_link !== null) {
|
||||
if (tpl.xdebug_link.ajax) {
|
||||
$('<a title="' + tpl.xdebug_link.url + '"></a>').on('click', function () {
|
||||
$.ajax(tpl.xdebug_link.url);
|
||||
}).addClass(csscls('editor-link')).appendTo(li);
|
||||
} else {
|
||||
$('<a href="' + tpl.xdebug_link.url + '"></a>').addClass(csscls('editor-link')).appendTo(li);
|
||||
}
|
||||
}
|
||||
if (tpl.render_time_str) {
|
||||
$('<span title="Render time" />').addClass(csscls('render-time')).text(tpl.render_time_str).appendTo(li);
|
||||
}
|
||||
if (tpl.memory_str) {
|
||||
$('<span title="Memory usage" />').addClass(csscls('memory')).text(tpl.memory_str).appendTo(li);
|
||||
}
|
||||
if (typeof(tpl.param_count) != 'undefined') {
|
||||
$('<span title="Parameter count" />').addClass(csscls('param-count')).text(tpl.param_count).appendTo(li);
|
||||
}
|
||||
if (typeof(tpl.type) != 'undefined' && tpl.type) {
|
||||
$('<span title="Type" />').addClass(csscls('type')).text(tpl.type).appendTo(li);
|
||||
}
|
||||
if (tpl.params && !$.isEmptyObject(tpl.params)) {
|
||||
var table = $('<table><tr><th colspan="2">Params</th></tr></table>').addClass(csscls('params')).appendTo(li);
|
||||
for (var key in tpl.params) {
|
||||
if (typeof tpl.params[key] !== 'function') {
|
||||
table.append('<tr><td class="' + csscls('name') + '">' + key + '</td><td class="' + csscls('value') +
|
||||
'"><pre><code>' + tpl.params[key] + '</code></pre></td></tr>');
|
||||
}
|
||||
}
|
||||
li.css('cursor', 'pointer').click(function() {
|
||||
if (table.is(':visible')) {
|
||||
table.hide();
|
||||
} else {
|
||||
table.show();
|
||||
}
|
||||
});
|
||||
}
|
||||
}});
|
||||
this.$list.$el.appendTo(this.$el);
|
||||
this.$callgraph = $('<div />').addClass(csscls('callgraph')).appendTo(this.$el);
|
||||
|
||||
this.bindAttr('data', function(data) {
|
||||
this.$list.set('data', data.templates);
|
||||
this.$status.empty();
|
||||
this.$callgraph.empty();
|
||||
|
||||
var sentence = data.sentence || "templates were rendered";
|
||||
$('<span />').text(data.nb_templates + " " + sentence).appendTo(this.$status);
|
||||
|
||||
if (data.accumulated_render_time_str) {
|
||||
this.$status.append($('<span title="Accumulated render time" />').addClass(csscls('render-time')).text(data.accumulated_render_time_str));
|
||||
}
|
||||
if (data.memory_usage_str) {
|
||||
this.$status.append($('<span title="Memory usage" />').addClass(csscls('memory')).text(data.memory_usage_str));
|
||||
}
|
||||
if (data.nb_blocks > 0) {
|
||||
$('<div />').text(data.nb_blocks + " blocks were rendered").appendTo(this.$status);
|
||||
}
|
||||
if (data.nb_macros > 0) {
|
||||
$('<div />').text(data.nb_macros + " macros were rendered").appendTo(this.$status);
|
||||
}
|
||||
if (typeof data.callgraph !== 'undefined') {
|
||||
this.$callgraph.html(data.callgraph);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
})(PhpDebugBar.$);
|
||||
5
vendor/barryvdh/laravel-debugbar/src/Resources/vendor/font-awesome/generator_config.txt
vendored
Normal file
5
vendor/barryvdh/laravel-debugbar/src/Resources/vendor/font-awesome/generator_config.txt
vendored
Normal file
@ -0,0 +1,5 @@
|
||||
# Font Squirrel Font-face Generator Configuration File
|
||||
# Upload this file to the generator to recreate the settings
|
||||
# you used to create these fonts.
|
||||
|
||||
{"mode":"expert","formats":["woff"],"tt_instructor":"keep","fallback":"none","fallback_custom":"100","options_subset":"none","subset_custom":"","subset_custom_range":"","subset_ot_features":"all","subset_ot_features_list":"","base64":"Y","css_stylesheet":"style.css","filename_suffix":"","emsquare":"2048","spacing_adjustment":"0","rememberme":"Y"}
|
||||
1665
vendor/barryvdh/laravel-debugbar/src/Resources/vendor/font-awesome/style.css
vendored
Normal file
1665
vendor/barryvdh/laravel-debugbar/src/Resources/vendor/font-awesome/style.css
vendored
Normal file
File diff suppressed because one or more lines are too long
156
vendor/barryvdh/laravel-debugbar/src/ServiceProvider.php
vendored
Normal file
156
vendor/barryvdh/laravel-debugbar/src/ServiceProvider.php
vendored
Normal file
@ -0,0 +1,156 @@
|
||||
<?php
|
||||
|
||||
namespace Barryvdh\Debugbar;
|
||||
|
||||
use Barryvdh\Debugbar\Middleware\DebugbarEnabled;
|
||||
use Barryvdh\Debugbar\Middleware\InjectDebugbar;
|
||||
use DebugBar\DataFormatter\DataFormatter;
|
||||
use DebugBar\DataFormatter\DataFormatterInterface;
|
||||
use Illuminate\Contracts\Http\Kernel;
|
||||
use Illuminate\Foundation\Application;
|
||||
use Illuminate\Routing\Router;
|
||||
use Illuminate\Session\SessionManager;
|
||||
use Illuminate\Support\Collection;
|
||||
use Illuminate\View\Engines\EngineResolver;
|
||||
use Barryvdh\Debugbar\Facade as DebugBar;
|
||||
|
||||
class ServiceProvider extends \Illuminate\Support\ServiceProvider
|
||||
{
|
||||
/**
|
||||
* Register the service provider.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function register()
|
||||
{
|
||||
$configPath = __DIR__ . '/../config/debugbar.php';
|
||||
$this->mergeConfigFrom($configPath, 'debugbar');
|
||||
|
||||
$this->app->alias(
|
||||
DataFormatter::class,
|
||||
DataFormatterInterface::class
|
||||
);
|
||||
|
||||
$this->app->singleton(LaravelDebugbar::class, function ($app) {
|
||||
$debugbar = new LaravelDebugbar($app);
|
||||
|
||||
if ($app->bound(SessionManager::class)) {
|
||||
$sessionManager = $app->make(SessionManager::class);
|
||||
$httpDriver = new SymfonyHttpDriver($sessionManager);
|
||||
$debugbar->setHttpDriver($httpDriver);
|
||||
}
|
||||
|
||||
return $debugbar;
|
||||
});
|
||||
|
||||
$this->app->alias(LaravelDebugbar::class, 'debugbar');
|
||||
|
||||
$this->app->singleton(
|
||||
'command.debugbar.clear',
|
||||
function ($app) {
|
||||
return new Console\ClearCommand($app['debugbar']);
|
||||
}
|
||||
);
|
||||
|
||||
$this->app->extend(
|
||||
'view.engine.resolver',
|
||||
function (EngineResolver $resolver, Application $application): EngineResolver {
|
||||
$laravelDebugbar = $application->make(LaravelDebugbar::class);
|
||||
|
||||
$shouldTrackViewTime = $laravelDebugbar->isEnabled() &&
|
||||
$laravelDebugbar->shouldCollect('time', true) &&
|
||||
$laravelDebugbar->shouldCollect('views', true) &&
|
||||
$application['config']->get('debugbar.options.views.timeline', false);
|
||||
|
||||
if (! $shouldTrackViewTime) {
|
||||
/* Do not swap the engine to save performance */
|
||||
return $resolver;
|
||||
}
|
||||
|
||||
return new class ($resolver, $laravelDebugbar) extends EngineResolver {
|
||||
private $laravelDebugbar;
|
||||
|
||||
public function __construct(EngineResolver $resolver, LaravelDebugbar $laravelDebugbar)
|
||||
{
|
||||
foreach ($resolver->resolvers as $engine => $resolver) {
|
||||
$this->register($engine, $resolver);
|
||||
}
|
||||
$this->laravelDebugbar = $laravelDebugbar;
|
||||
}
|
||||
|
||||
public function register($engine, \Closure $resolver)
|
||||
{
|
||||
parent::register($engine, function () use ($resolver) {
|
||||
return new DebugbarViewEngine($resolver(), $this->laravelDebugbar);
|
||||
});
|
||||
}
|
||||
};
|
||||
}
|
||||
);
|
||||
|
||||
Collection::macro('debug', function () {
|
||||
debug($this);
|
||||
return $this;
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Bootstrap the application events.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function boot()
|
||||
{
|
||||
$configPath = __DIR__ . '/../config/debugbar.php';
|
||||
$this->publishes([$configPath => $this->getConfigPath()], 'config');
|
||||
|
||||
$this->loadRoutesFrom(realpath(__DIR__ . '/debugbar-routes.php'));
|
||||
|
||||
$this->registerMiddleware(InjectDebugbar::class);
|
||||
|
||||
if ($this->app->runningInConsole()) {
|
||||
$this->commands(['command.debugbar.clear']);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the active router.
|
||||
*
|
||||
* @return Router
|
||||
*/
|
||||
protected function getRouter()
|
||||
{
|
||||
return $this->app['router'];
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the config path
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function getConfigPath()
|
||||
{
|
||||
return config_path('debugbar.php');
|
||||
}
|
||||
|
||||
/**
|
||||
* Publish the config file
|
||||
*
|
||||
* @param string $configPath
|
||||
*/
|
||||
protected function publishConfig($configPath)
|
||||
{
|
||||
$this->publishes([$configPath => config_path('debugbar.php')], 'config');
|
||||
}
|
||||
|
||||
/**
|
||||
* Register the Debugbar Middleware
|
||||
*
|
||||
* @param string $middleware
|
||||
*/
|
||||
protected function registerMiddleware($middleware)
|
||||
{
|
||||
$kernel = $this->app[Kernel::class];
|
||||
$kernel->pushMiddleware($middleware);
|
||||
}
|
||||
}
|
||||
144
vendor/barryvdh/laravel-debugbar/src/Storage/FilesystemStorage.php
vendored
Normal file
144
vendor/barryvdh/laravel-debugbar/src/Storage/FilesystemStorage.php
vendored
Normal file
@ -0,0 +1,144 @@
|
||||
<?php
|
||||
|
||||
namespace Barryvdh\Debugbar\Storage;
|
||||
|
||||
use DebugBar\Storage\StorageInterface;
|
||||
use Illuminate\Filesystem\Filesystem;
|
||||
use Symfony\Component\Finder\Finder;
|
||||
|
||||
/**
|
||||
* Stores collected data into files
|
||||
*/
|
||||
class FilesystemStorage implements StorageInterface
|
||||
{
|
||||
protected $dirname;
|
||||
protected $files;
|
||||
protected $gc_lifetime = 24; // Hours to keep collected data;
|
||||
protected $gc_probability = 5; // Probability of GC being run on a save request. (5/100)
|
||||
|
||||
/**
|
||||
* @param \Illuminate\Filesystem\Filesystem $files The filesystem
|
||||
* @param string $dirname Directories where to store files
|
||||
*/
|
||||
public function __construct($files, $dirname)
|
||||
{
|
||||
$this->files = $files;
|
||||
$this->dirname = rtrim($dirname, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public function save($id, $data)
|
||||
{
|
||||
if (!$this->files->isDirectory($this->dirname)) {
|
||||
if ($this->files->makeDirectory($this->dirname, 0777, true)) {
|
||||
$this->files->put($this->dirname . '.gitignore', "*\n!.gitignore\n");
|
||||
} else {
|
||||
throw new \Exception("Cannot create directory '$this->dirname'..");
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
$this->files->put($this->makeFilename($id), json_encode($data));
|
||||
} catch (\Exception $e) {
|
||||
//TODO; error handling
|
||||
}
|
||||
|
||||
// Randomly check if we should collect old files
|
||||
if (rand(1, 100) <= $this->gc_probability) {
|
||||
$this->garbageCollect();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Create the filename for the data, based on the id.
|
||||
*
|
||||
* @param $id
|
||||
* @return string
|
||||
*/
|
||||
public function makeFilename($id)
|
||||
{
|
||||
return $this->dirname . basename($id) . ".json";
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete files older then a certain age (gc_lifetime)
|
||||
*/
|
||||
protected function garbageCollect()
|
||||
{
|
||||
foreach (
|
||||
Finder::create()->files()->name('*.json')->date('< ' . $this->gc_lifetime . ' hour ago')->in(
|
||||
$this->dirname
|
||||
) as $file
|
||||
) {
|
||||
$this->files->delete($file->getRealPath());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public function get($id)
|
||||
{
|
||||
return json_decode($this->files->get($this->makeFilename($id)), true);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public function find(array $filters = [], $max = 20, $offset = 0)
|
||||
{
|
||||
// Sort by modified time, newest first
|
||||
$sort = function (\SplFileInfo $a, \SplFileInfo $b) {
|
||||
return strcmp($b->getMTime(), $a->getMTime());
|
||||
};
|
||||
|
||||
// Loop through .json files, filter the metadata and stop when max is found.
|
||||
$i = 0;
|
||||
$results = [];
|
||||
foreach (Finder::create()->files()->name('*.json')->in($this->dirname)->sort($sort) as $file) {
|
||||
if ($i++ < $offset && empty($filters)) {
|
||||
$results[] = null;
|
||||
continue;
|
||||
}
|
||||
$data = json_decode($file->getContents(), true);
|
||||
$meta = $data['__meta'];
|
||||
unset($data);
|
||||
if ($this->filter($meta, $filters)) {
|
||||
$results[] = $meta;
|
||||
}
|
||||
if (count($results) >= ($max + $offset)) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
return array_slice($results, $offset, $max);
|
||||
}
|
||||
|
||||
/**
|
||||
* Filter the metadata for matches.
|
||||
*
|
||||
* @param $meta
|
||||
* @param $filters
|
||||
* @return bool
|
||||
*/
|
||||
protected function filter($meta, $filters)
|
||||
{
|
||||
foreach ($filters as $key => $value) {
|
||||
if (!isset($meta[$key]) || fnmatch($value, $meta[$key]) === false) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public function clear()
|
||||
{
|
||||
foreach (Finder::create()->files()->name('*.json')->in($this->dirname) as $file) {
|
||||
$this->files->delete($file->getRealPath());
|
||||
}
|
||||
}
|
||||
}
|
||||
99
vendor/barryvdh/laravel-debugbar/src/Storage/SocketStorage.php
vendored
Normal file
99
vendor/barryvdh/laravel-debugbar/src/Storage/SocketStorage.php
vendored
Normal file
@ -0,0 +1,99 @@
|
||||
<?php
|
||||
|
||||
namespace Barryvdh\Debugbar\Storage;
|
||||
|
||||
use DebugBar\Storage\StorageInterface;
|
||||
|
||||
class SocketStorage implements StorageInterface
|
||||
{
|
||||
protected $hostname;
|
||||
protected $port;
|
||||
protected $socket;
|
||||
|
||||
/**
|
||||
* @param string $hostname The hostname to use for the socket
|
||||
* @param int $port The port to use for the socket
|
||||
*/
|
||||
public function __construct($hostname, $port)
|
||||
{
|
||||
$this->hostname = $hostname;
|
||||
$this->port = $port;
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
function save($id, $data)
|
||||
{
|
||||
$socketIsFresh = !$this->socket;
|
||||
|
||||
if (!$this->socket = $this->socket ?: $this->createSocket()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$encodedPayload = json_encode([
|
||||
'id' => $id,
|
||||
'base_path' => base_path(),
|
||||
'app' => config('app.name'),
|
||||
'data' => $data,
|
||||
]);
|
||||
|
||||
$encodedPayload = strlen($encodedPayload) . '#' . $encodedPayload;
|
||||
|
||||
set_error_handler([self::class, 'nullErrorHandler']);
|
||||
try {
|
||||
if (-1 !== stream_socket_sendto($this->socket, $encodedPayload)) {
|
||||
return true;
|
||||
}
|
||||
if (!$socketIsFresh) {
|
||||
stream_socket_shutdown($this->socket, \STREAM_SHUT_RDWR);
|
||||
fclose($this->socket);
|
||||
$this->socket = $this->createSocket();
|
||||
}
|
||||
if (-1 !== stream_socket_sendto($this->socket, $encodedPayload)) {
|
||||
return true;
|
||||
}
|
||||
} finally {
|
||||
restore_error_handler();
|
||||
}
|
||||
}
|
||||
|
||||
private static function nullErrorHandler($t, $m)
|
||||
{
|
||||
// no-op
|
||||
}
|
||||
|
||||
protected function createSocket()
|
||||
{
|
||||
set_error_handler([self::class, 'nullErrorHandler']);
|
||||
try {
|
||||
return stream_socket_client("tcp://{$this->hostname}:{$this->port}");
|
||||
} finally {
|
||||
restore_error_handler();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
function get($id)
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
function find(array $filters = array(), $max = 20, $offset = 0)
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
function clear()
|
||||
{
|
||||
//
|
||||
}
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user