.env
, то без второго параметра$dotenv = Dotenv\Dotenv::createImmutable(dirname(__DIR__));
.env
должен располагаться на один уровень выше файла, в котором вы это написали.$dotenv = Dotenv\Dotenv::createImmutable(dirname(__DIR__), 'my_env');
.my_env
:root {
--color1: white;
}
body.dark {
--color1: black;
}
<body>
<script>
if (localStorage.getItem('theme') === 'dark') document.body.classList.add('dark');
</script>
<li class="nav-item theme-switcher-outer">
<a class="nav-link theme-switcher" href="javascript:switchTheme()">
<i class="fa fa-sun theme-switcher__light"></i>
<i class="fa fa-moon theme-switcher__dark"></i>
</a>
</li>
.theme-switcher {
&__light { display: none; }
&__dark { }
body.dark & {
&__light { display: inline; }
&__dark { display: none; }
}
}
function switchTheme() {
document.body.classList.toggle('dark');
localStorage.setItem('theme', document.body.classList.contains('dark') ? 'dark' : 'light');
}
Разве не проще и отпимизированее просто перезаписывать колонку в таблице юзеров с ролями?
users
roles
permissions
role_user
permission_role
permission_user (опционально)
@supports {}
if (!("classList" in document.documentElement)) {
// Пишем свою реализацию
}
worker.slow()
оборачивается в новую функцию-декоратор. Декоратор выполняет некую работу, вызывает оригинальную функцию, с ее результатом может выполнить еще какую-то работу, и возвращает итоговый результат.worker.slow = cachingDecorator(worker.slow, hash);
worker.slow
у вас уже не оригинал, а декоратор. Т.е. эта функцияfunction() {
let key = hash(arguments); // (*)
if (cache.has(key)) {
return cache.get(key);
}
let result = func.call(this, ...arguments); // (**)
cache.set(key, result);
return result;
};
arguments
.function cachingDecorator(func, hash) {
let cache = new Map();
return function(arg1, arg2) { // явно указать аргументы
let key = hash(arg1, arg2); // (*)
if (cache.has(key)) {
return cache.get(key);
}
let result = func.call(this, arg1, arg2); // (**)
cache.set(key, result);
return result;
};
}
::-webkit-scrollbar-*
. Можно сделать достаточно симпатичные скроллбары. Примеры можно загуглить, например, на кодпене.-return $this->price()->first()?->toObject();
+if ($obj = $this->price()->first()) {
+ return $obj->toObject();
+}
+return null;
-int|string|float$amount = null,
+$amount = null,