softroot.ru

/ linux, kde, archlinux, php, css, node.js, coffee script, electronics, java, libgdx/

Хакеры

На заре компьютерной эры понятием «хакер» обозначали людей, которые хорошо разбираются в программировании. Благодаря усилиям СМИ и кинорежиссёров слово «хакер» постепенно приобрело негативную окраску. Хакерами стали называть компьютерных преступников. В художественных фильмах их изображают гениями, которые могут взломать любую компьютерную систему за считанные секунды.

В реальности хакерской атаке часто предшествует длительная подготовительная работа. Преступники составляют план обхода систем безопасности коммерческих и государственных структур. Они изучают программное обеспечение, которое установлено на компьютерах потенциальных жертв и сканируют операционные системы на предмет уязвимости. Важную роль в процессе взлома играет социальная инженерия и человеческий фактор. Преступники пытаются «взять крепость изнутри», вербуя информаторов и пособников среди персонала атакуемого объекта. Хакеры редко работают в одиночку. Чаще они действуют в составе преступных группировок.

Преступники используют различные инструменты для организации информационных атак. Самым главным оружием компьютерных уголовников является вредоносное программное обеспечение. Хакеры применяют вирусы, сетевые черви и троянские программы для проникновения в память чужих компьютеров. Активно используются DDos-атаки, которые проводятся с помощью ботнетов. Злоумышленники успешно эксплуатируют «дыры» в операционных системах и прикладном программном обеспечении. Существует чёрный рынок специальных хакерских программ. Многие современные преступники не являются профессиональными программистами. Они просто покупают вирусы и трояны у людей, которые занимаются созданием вредоносного ПО.

Организации, которые стали жертвами хакеров, часто умалчивают о совершённых злодеяниях. Особенно часто играют в «молчанку» банки и другие финансовые организации. Любая негативная информация в СМИ может вызвать панику среди клиентов кредитных организаций. Такая политика затрудняет учёт совершённых преступлений.

Мотивация у хакеров может быть различной. В основном компьютерные преступники охотятся за чужими деньгами. Кто-то занимается кибершпионажем и крадёт конфиденциальную информацию. Некоторыми хакерами движет месть, а также религиозная и расовая нетерпимость. Часть хакерских группировок обслуживает политические цели и интересы различных государств. Самому большому количеству сетевых нападений подвергается США, Россия и Англия. Китай и Северная Корея являются в этом смысле «белыми пятнами». Эти страны имеют «внутренний интернет», в который не могут попасть иностранцы.

a2ensite для Nginx

Думаю многим известен a2ensite/a2dissite для включения/выключения виртуальных хостов в apache, к сожалению для nginx такого нет, хотя диретории site-enabled site-available есть (это касается только ubuntu, про другие не скажу). Эта небольшая статья призвана помочь заполнить недостающие инструменты.

Скелет скрипта я взял из своей предыдущей статьи https://softroot.ru/?go=all/pravilny-lamp-na-archlinux/
Принцип действия просто. Мы просто делаем мягкую ссылку на конфиг.

Пишем первый скрипт. Для включения.

sudo nano /usr/sbin/n2ensite
#!/bin/bash
if test -d /etc/nginx/sites-available && test -d /etc/nginx/sites-enabled  ; then
echo "-------------------------------"
else
echo "Error!! Folders /etc/nginx/sites-available & /etc/nginx/sites-enabled not fo$
exit 0
fi

avail=/etc/nginx/sites-available/$1.conf
enabled=/etc/nginx/sites-enabled

site=`ls /etc/nginx/sites-available/`

if [ "$#" != "1" ]; then
        echo "Use script: n2en site_config"
        echo -e "\nAvailable configs:\n$site"
        exit 0
else
if test -e $avail; then
sudo ln -s $avail $enabled
else
echo -e "$avail config does not exist! Please create one!\n$site"
exit 0
fi
if test -e $enabled/$1.conf; then
echo "Success!!"
echo "For test nginx config: sudo nginx -t"
echo "Now reload nginx server: sudo systemctl reload nginx"
else
echo  -e "Config $avail does not exist!\nPlease see avail configs:\n$site"
exit 0
fi
fi

Делаем скрипт исполняемым

sudo chmod +x /usr/sbin/n2ensite

Второй скрипт для выключения сайтов.

sudo nano /usr/sbin/n2dissite
#!/bin/bash
if test -d /etc/nginx/sites-available && test -d /etc/nginx/sites-enabled  ; then
echo "-------------------------------"
else
echo "Error!! Folders /etc/nginx/sites-available & etc/nginx/sites-enabled not found."
exit 0
fi

avail=/etc/nginx/sites-enabled/$1.conf
enabled=/etc/nginx/sites-enabled
site=`ls /etc/nginx/sites-enabled`

if [ "$#" != "1" ]; then
        echo "Use script: n2dissite site_config"
        echo -e "\nEnabled configs: \n$site"
        exit 0
else
if test -e $avail; then
sudo rm  $avail
else
echo -e "$avail config does not exist! Exiting"
exit 0
fi
if test -e $enabled/$1.conf; then
echo "Error!! Could not remove $avail config!"
else
echo  -e "Success! $avail has been removed!\nsudo systemctl reload nginx"
exit 0
fi
fi
fi

Делаем скрипт исполняемым

sudo chmod +x /usr/sbin/n2dissite

Для себя я для краткости именую скрипты как n2en и n2di.
На этом всё.

2017   linux   server

Правильный LAMP на archlinux

Актуально на апрель 2016. Версия apache, php, mysql:

$ httpd -v
Server version: Apache/2.4.20 (Unix)
Server built:   Apr 11 2016 10:04:04

$ php -v
PHP 7.0.5 (cli) (built: Apr  2 2016 23:10:23) ( NTS )
Copyright (c) 1997-2016 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2016 Zend Technologies

$ mysql -V
mysql  Ver 15.1 Distrib 10.1.13-MariaDB, for Linux (x86_64) using readline 5.1


Я не буду подробно акцентироват внимание на конфигурировании, лишь общие настройки.
Для начала следует обновить все пакеты

sudo pacman -Syu

Ставим всё необходимое, а именно apache, php, mysql, openssl (если необходим доступ по https) и т. д.

sudo pacman -S apache php php-apache mysql openssl

Если mysql не стоял ранее:

sudo systemctl start mysqld
sudo mysql_secure_installation

Можно попробовать проверить работоспособность сервера базы

mysql -u root -p



Мне нравится способ конфигурирования apache в ubuntu, поэтому переделаем настройки на убунтуподобность)
Открываем httpd.conf

sudo nano /etc/httpd/conf/httpd.conf

и в конец файла добавляем:

IncludeOptional conf/sites-enabled/*.conf
IncludeOptional conf/mods-enabled/*.conf

Это позволит подхватывать все конфиги из {sites, mods}-enabled директорий.


Теперь создадим указанные каталоги:

sudo mkdir /etc/httpd/conf/{sites-available,sites-enabled,mods-available,mods-enabled}

Для включения/выключения сайтов создадим скрипт.
Я не стал брать скрипты из ubuntu из-за их монстроузости, вместо этого в интернете нашёл вполне подходящие для наших целей.

Первый скрипт. «Включает» выбранный конфиг сайта.

sudo nano /usr/sbin/a2ensite
#!/bin/bash
if test -d /etc/httpd/conf/sites-available && test -d /etc/httpd/conf/sites-enabled  ; then
echo "-------------------------------"
else
echo "Error!! Folders /etc/httpd/conf/sites-available & etc/httpd/conf/sites-enabled not found."
exit 0
fi

avail=/etc/httpd/conf/sites-available/$1.conf
enabled=/etc/httpd/conf/sites-enabled
site=`ls /etc/httpd/conf/sites-available/`

if [ "$#" != "1" ]; then
        echo "Use script: a2ensite site_config"
        echo -e "\nAvailable virtual hosts:\n$site"
        exit 0
else
if test -e $avail; then
sudo ln -s $avail $enabled
else
echo -e "$avail virtual host does not exist! Please create one!\n$site"
exit 0
fi
if test -e $enabled/$1.conf; then
echo "Success!! Now restart Apache server: sudo systemctl restart httpd"
else
echo  -e "Virtual host $avail does not exist!\nPlease see avail virtual hosts:\n$site"
exit 0
fi
fi

Делаем скрипт выполняемым.

sudo chmod +x /usr/sbin/a2ensite



Второй скрипт. «Выключает» выбранный конфиг сайта.

sudo nano /usr/sbin/a2dissite
#!/bin/bash
if test -d /etc/httpd/conf/sites-available && test -d /etc/httpd/conf/sites-enabled  ; then
echo "-------------------------------"
else
echo "Error!! Folders /etc/httpd/conf/sites-available & etc/httpd/conf/sites-enabled not found."
exit 0
fi

avail=/etc/httpd/conf/sites-enabled/$1.conf
enabled=/etc/httpd/conf/sites-enabled
site=`ls /etc/httpd/conf/sites-enabled`

if [ "$#" != "1" ]; then
        echo "Use script: a2dissite site_config"
        echo -e "\nEnabled virtual hosts: \n$site"
        exit 0
else
if test -e $avail; then
sudo rm  $avail
else
echo -e "$avail virtual host does not exist! Exiting"
exit 0
fi
if test -e $enabled/$1.conf; then
echo "Error!! Could not remove $avail virtual host!"
else
echo  -e "Success! $avail has been removed!\nsudo systemctl restart httpd"
exit 0
fi
fi

Делаем скрипт выполняемым.

sudo chmod +x /usr/sbin/a2dissite


Теперь создадим скрипты включения/отключения модулей

sudo nano /usr/sbin/a2enmod
#!/bin/bash
if test -d /etc/httpd/conf/mods-available && test -d /etc/httpd/conf/mods-enabled  ; then
echo "-------------------------------"
else
echo "Error!! Folders /etc/httpd/conf/mods-available & etc/httpd/conf/mods-enabled not found."
exit 0
fi

avail=/etc/httpd/conf/mods-available/$1.conf
enabled=/etc/httpd/conf/mods-enabled
mods=`ls /etc/httpd/conf/mods-available/`

if [ "$#" != "1" ]; then
        echo "Use script: a2enmod mod_name"
        echo -e "\nAvailable mods config:\n$mods"
        exit 0
else
if test -e $avail; then
sudo ln -s $avail $enabled
else
echo -e "$avail mod not exist! Please create one!\n$mods"
exit 0
fi
if test -e $enabled/$1.conf; then
echo "Success!! Now restart Apache server: sudo systemctl restart httpd"
else
echo  -e "Mod $avail does not exist!\nPlease see avail mods:\n$mods"
exit 0
fi
fi

Делаем скрипт выполняемым.

sudo chmod +x /usr/sbin/a2enmod



И второй скрипт (ну или 4 =) )

sudo nano /usr/sbin/a2dismod
#!/bin/bash
if test -d /etc/httpd/conf/mods-available && test -d /etc/httpd/conf/mods-enabled  ; then
echo "-------------------------------"
else
echo "Error!! Folders /etc/httpd/conf/mods-available & etc/httpd/conf/mods-enabled not found."
exit 0
fi

avail=/etc/httpd/conf/mods-enabled/$1.conf
enabled=/etc/httpd/conf/mods-enabled
mods=`ls /etc/httpd/conf/mods-enabled`

if [ "$#" != "1" ]; then
        echo "Use script: a2dismod mod_config"
        echo -e "\nEnabled mods: \n$mods"
        exit 0
else
if test -e $avail; then
sudo rm  $avail
else
echo -e "$avail mod does not exist! Exiting"
exit 0
fi
if test -e $enabled/$1.conf; then
echo "Error!! Could not remove $avail mod!"
else
echo  -e "Success! $avail has been removed!\nsudo systemctl restart httpd"
exit 0
fi
fi

Делаем скрипт выполняемым.

sudo chmod +x /usr/sbin/a2dismod


Создаём виртуальный хост

sudo nano /etc/httpd/conf/sites-available/localhost.conf

Пример конфигурации:

<VirtualHost *:80>
    DocumentRoot "/mnt/srv/www/localhost/public"
    <Directory "/mnt/srv/www/localhost/public">
        Options FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>
    ServerName localhost
    ErrorLog "/mnt/srv/www/logs/localhost.error.log"
    CustomLog "/mnt/srv/www/logs/localhost.access.log" combined
</VirtualHost>

Теперь его можно включить

sudo a2ensite localhost
$ sudo a2ensite localhost
-------------------------------
Success!! Now restart Apache server: sudo systemctl restart httpd

и добавить в /ets/hosts адрес если это требуется, попробовать запустить/перезапустить apache (как подсказывает скрипт)


Я попробовал перезапустить apache, и на данном этапе у меня всё работает.
Нужно уже браться за мод ssl. Но сначала напишем скрипт создания сертификатов, и создадим их.

sudo nano /usr/sbin/agenssl
#!/bin/bash
if test -d /etc/httpd/conf/ssl ; then
echo "..."
else
echo "make dir..."
mkdir /etc/httpd/conf/ssl
fi

cd /etc/httpd/conf/ssl

echo -e "Enter your virtual host FQDN"
read cert

openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:2048 -out $cert.key
chmod 600 $cert.key
openssl req -new -key $cert.key -out $cert.csr
openssl x509 -req -days 365 -in $cert.csr -signkey $cert.key -out $cert.crt

echo -e " The certificate "$cert" has been generated!\nPlease link it to Apache SSL available website!"

ls -all /etc/httpd/conf/ssl
exit 0

Сделаем скрипт выполняемым

sudo chmod +x /usr/sbin/agenssl



Можно смело запускать. Из обязательного нужно заполнить «Common Name (e. g. server FQDN or YOUR name) []», указав в качестве имени адрес сайта.

sudo agenssl
$ sudo agenssl
...
Enter your virtual host FQDN
localhost
.....................+++
..............................................................................+++
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:RU
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:localhost
Email Address []:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Signature ok
subject=/C=RU/ST=Some-State/O=Internet Widgits Pty Ltd/CN=localhost
Getting Private key
The certificate localhost has been generated!

Please link it to Apache SSL available website!
drwxr-xr-x 2 root root 4096 апр 19 23:43 .
drwxr-xr-x 8 root root 4096 апр 19 21:27 ..
-rw-r--r-- 1 root root 1164 апр 19 23:43 localhost.crt
-rw-r--r-- 1 root root  985 апр 19 23:43 localhost.csr
-rw------- 1 root root 1704 апр 19 23:42 localhost.key


Мод ssl

sudo nano /etc/httpd/conf/mods-enabled/ssl.conf
LoadModule ssl_module modules/mod_ssl.so
LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
Listen 443
SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5
SSLPassPhraseDialog  builtin
SSLSessionCache        "shmcb:/run/httpd/ssl_scache(512000)"
SSLSessionCacheTimeout  300

Включаем его

sudo a2enmod ssl
$ sudo a2enmod ssl
-------------------------------
Success!! Now restart Apache server: sudo systemctl restart httpd



Попробуем добавить конфигурацию виртуального хоста с ssl

sudo nano /etc/httpd/conf/sites-available/localhost-ssl.conf
<VirtualHost *:443>
    ServerAdmin webmaster@localhost
    ServerName localhost
    DocumentRoot /mnt/srv/www/localhost/public

    LogLevel info ssl:warn

    <Directory "/mnt/srv/www/localhost/public">
        Options FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>

    ErrorLog "/mnt/srv/logs//localhost.error.log"
    CustomLog "/mnt/srv/logs/localhost.access.log" combined

    SSLEngine on
    SSLCertificateFile      /etc/httpd/conf/ssl/localhost.crt
    SSLCertificateKeyFile   /etc/httpd/conf/ssl/localhost.key

    <FilesMatch "\.(cgi|shtml|phtml|php)$">
        SSLOptions +StdEnvVars
    </FilesMatch>

    BrowserMatch "MSIE [2-6]" \
        nokeepalive ssl-unclean-shutdown \
        downgrade-1.0 force-response-1.0

    BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown
</VirtualHost>

Перезапускаем apach и пробуем наш https

sudo systemctl restart httpd
2016   snippets   umi cms   xslt

Пост о локали, кедах, арче и забытом методе KISS

Вот уже битый час я не мог понять с какого перепугу моя локаль установлена в cu_RU.US-ASCII
Да и чёрт бы с ней, но ведь некоторые программы из под юзера мешает запускать.
Перечитал все мануалы, облазил форумы, но ни о этой локале не о багах связанных с этим толком ничего не написано. Перерыл все возможные системные файлы, прошелестел в домашней директории, но ничего.

Я уже было отчаялся и пошёл по самому простому пути (хотя это было логичней), поискать cu_RU.US-ASCII

Через минуту grep весело моргнул строчкой на экране.

~/.config/plasma-localerc

с содержимым

[Formats]
LANG=cu_RU.US-ASCII

[Translations]
LANGUAGE=ru

«Тьфу ты...», подумал я. Поправил кодировку, удалил ~/.config/plasma-locale-settings.sh и ушёл в ребут для верности...

2016   archlinux   kde   linux   locale

Blender. Старое.



Старые работы в Bender. Какие-то по туториалам, какие-то собственные.

Справочник по методам коллекции Laravel



Изначально данный материал планировался как мини статья о методах коллекций, но потом всё скатилось в банальный перевод оригинальной документации.

Статья в разработке. Осталось дописать несколько методов и навигацию ;)



Как создать коллекцию из массива?
Очень просто:

// Допустим у нас есть такой массив
$myArray = [
    'one' => 'first',
    'two' => 'second',
    'three' => 'the third'
];

// Создаём коллекцию
$collection = collect($myArray);



Методы для работы с коллекциями



all() Возвращает базовый массив коллекции
avg() Среднее значение всех элементов коллекции
chank() Разбить коллекцию на множество мелкий коллекций





Метод all
Метод all() вернёт базовый массив коллекции

$myArray = [
    'one' => 'first',
    'two' => 'second',
    'three' => 'the third'
];

$collection = collect($myArray);
$collection->all();

// Результат
array:3 [▼
    "one" => "first"
    "two" => "second"
    "three" => "the third"
]



Метод avg
Посчитать среднее значение всех элементов коллекции

$collection = collect([0, 10]);
dd($collection->avg());

//Результат
5

Если коллекция содержит вложенные массивы или объекты, то вам необходимо передать ключ по которому будет считаться среднее значение

$myArray = [
    ['name' => 'one', 'amount' => '10'],
    ['name' => 'two', 'amount'=> '2']
];
$collection = collect($myArray);

dd($collection->avg('amount'));

//Результат
6



Метод chank
Разобьёт коллекцию на множество мелкий коллекций

$myArray = [
    'one' => 'first',
    'two' => 'second',
    'three' => 'the third'
];

$collection = collect($myArray);
dd($collection->chunk(2) );

// Результат
Collection {#17 ▼
  #items: array:2 [▼
    0 => Collection {#15 ▼
      #items: array:2 [▼
        "one" => "first"
        "two" => "second"
      ]
    }
    1 => Collection {#16 ▼
      #items: array:1 [▼
        "three" => "the third"
      ]
    }
  ]
}



Метод collapse
Позволяет собрать одну коллекцию из множества коллекций

$myArray = [
    [
        'one' => 'first',
        'two' => 'second',
    ],
    [
        'three' => 'the third'
    ]
];
$collection = collect($myArray);

dd( $collection->collapse() );

// Результат
Collection {#15 ▼
  #items: array:3 [▼
    "one" => "first"
    "two" => "second"
    "three" => "the third"
  ]
}



Метод contains
Проверяет, содержит ли коллекция нужное значение. Проверка осуществляется по значениям ключей.

$myArray = [
    'one' => 'first',
    'two' => 'second',
    'three' => 'the third'
];

$collection = collect($myArray);

dump( $collection->contains('first') ); // true
dump( $collection->contains('one') ); // false

// Результат
true
false



Метод count
count позволяет сосчитать количество элементов коллекции

$collection = collect([1, 2, 3]);
dd( $collection->count() );

// Результат
3



Метод diff
Метод diff сравнивает коллекцию с другой коллекцией или массивом

$collection = collect([1, 2, 3, 4, 5]);
$diff = $collection->diff([2, 4, 6, 8]);
dd( $diff->all());

//Результат
array:3 [▼
  0 => 1
  2 => 3
  4 => 5
]



Метод each
Что бы перебрать каждый элемент коллекции воспользуетесь методом each

$myArray = [
    'one' => 'first',
    'two' => 'second',
    'three' => 'the third'
];

$collection = collect($myArray);
$collection->each(function ($item, $key) {
    dump($item . ' -> ' . $key);
});

// Результат
"first -> one"
"second -> two"
"the third -> three"



Метод every
А что бы создать новую коллекцию содержащую только каждый N элемент начиная с первого — every

$collection = collect(['a', 'b', 'c', 'd', 'e', 'f']);

dd( $collection->every(4));

// Результат
Collection {#15 ▼
  #items: array:2 [▼
    0 => "a"
    1 => "e"
  ]
}

Вторым аргументом можно указать смещение

$collection = collect(['a', 'b', 'c', 'd', 'e', 'f']);

dd($collection->every(4, 1));

// Результат
Collection {#15 ▼
  #items: array:2 [▼
    0 => "b"
    1 => "f"
  ]
}



Метод except
Исключить из коллекции элементы можно с помощью метода except

$myArray = [
    'one' => 'first',
    'two' => 'second',
    'three' => 'the third'
];
$collection = collect($myArray);

dd($collection->except('two'));

// Результат
Collection {#15 ▼
  #items: array:2 [▼
    "one" => "first"
    "three" => "the third"
  ]
}



Метод filter
Метод фильтрует коллекцию с помощью функции колбэка сохраняя лишь те элементы при обработке которых колбэк вернул true

$collection = collect([1, 2, 3, 4]);

$filtered = $collection->filter(function ($value, $key) {
    return $value > 2;
});

dd($filtered);

// Результат
Collection {#16 ▼
  #items: array:2 [▼
    2 => 3
    3 => 4
  ]
}



Метод first
Работает так же как и filter, только возвращает первый элемент при обработке которого колбэк вернул true

$collection = collect([1, 2, 3, 4]);

$filtered = $collection->first(function ($key, $value) {
    return $value > 2;
});

dd($filtered);

// Результат
3
Обратите внимание, что первый аргумент функции колбэка (в отличии от колбэка filter) является ’ключ’, второй ’значение’. У фильтра наоборот.



Метод flatten
Данный метод сделает плоским многомерную коллекцию

$myArray = [
    [
        'one' => 'first',
        'two' => [
            'second', 'the third'
        ]
    ]
];
$collection = collect($myArray);

$flattened = $collection->flatten();
dd( $flattened );

// Результат
Collection {#15 ▼
  #items: array:3 [▼
    0 => "first"
    1 => "second"
    2 => "the third"
  ]
}



Метод flip
Поменяет местами ключи и значения в коллеции

$myArray = [
    'one' => 'first',
    'two' => 'second'
];
$collection = collect($myArray);

dd( $collection->flip());

// Результат
Collection {#15 ▼
  #items: array:2 [▼
    "first" => "one"
    "second" => "two"
  ]
}



Метод forget
Удалить элемент из коллекции по ключу можно с помощью данного метода

$myArray = [
    'one' => 'first',
    'two' => 'second'
];
$collection = collect($myArray);

$collection->forget('one');

dd($collection);

// Результат
Collection {#14 ▼
  #items: array:1 [▼
    "two" => "second"
  ]
}
Обратите внимание, что данный метод, в отличии от большинства, не создаёт новую коллекцию, а изменяет базовую.



Метод forPage
Создаёт новую коллекцию в которой будут присутствовать элементы заданной страницы. Метод первым аргументом принимает номер страницы, вторым количество элементов на ней.

$collection = collect([1, 2, 3, 4, 5, 6, 7, 8, 9]);

dump($collection->forPage(2, 3));
dump($collection->forPage(3, 3));

// Результат
Collection {#15 ▼
  #items: array:3 [▼
    3 => 4
    4 => 5
    5 => 6
  ]
}
Collection {#15 ▼
  #items: array:3 [▼
    6 => 7
    7 => 8
    8 => 9
  ]
}



Метод get
Данный метод возвращает значение по ключу. Если ключа не существует, то будет возвращён null либо значение по умолчанию

$myArray = [
    'one' => 'first',
    'two' => 'second'
];
$collection = collect($myArray);

dd($collection->get('one'));

// Результат
"first"

Для установки значения по умолчанию передайте необходимое значение вторым аргументом.

$myArray = [
    'one' => 'first',
    'two' => 'second'
];
$collection = collect($myArray);

dd($collection->get('three', 'nothing'));

// Результат
"nothing"

Вы так же можете указать в качестве второго аргумента колбэк функцию, результат работы которой будет возвращён, в случае если значение не найдено.

$myArray = [
    'one' => 'first',
    'two' => 'second'
];
$collection = collect($myArray);

$get = $collection->get('three', function () {
    return 'result';
});

dd($get);

// Результат
"result"



Метод groupBy
Группирует элементы коллекции по ключу

$collection = collect([
    ['user' => 'one',   'action' => 'buy'],
    ['user' => 'one',   'action' => 'pay'],
    ['user' => 'two',   'action' => 'pay'],
    ['user' => 'three', 'action' => 'buy'],
    ['user' => 'three', 'action' => 'buy'],
]);

$grouped = $collection->groupBy('action');

dd($grouped);

// Результат
Collection {#18 ▼
  #items: array:2 [▼
    "buy" => Collection {#16 ▼
      #items: array:3 [▼
        0 => array:2 [▼
          "user" => "one"
          "action" => "buy"
        ]
        1 => array:2 [▼
          "user" => "three"
          "action" => "buy"
        ]
        2 => array:2 [▼
          "user" => "three"
          "action" => "buy"
        ]
      ]
    }
    "pay" => Collection {#17 ▼
      #items: array:2 [▼
        0 => array:2 [▼
          "user" => "one"
          "action" => "pay"
        ]
        1 => array:2 [▼
          "user" => "two"
          "action" => "pay"
        ]
      ]
    }
  ]
}



Метод has
Проверяет существование ключа

$collection = collect(['one' => 1, 'two' => 2]);

dump($collection->has('one')); // true
dump($collection->has('ololo')); // false

// Результат
true
false



Метод implode
Объединяет элементы коллекции. Передаваемые в метод аргументы зависят от типа коллекции.
Если коллекция объект или массив, то первый аргумент должен указывать на ключ, второй — строка с помощью которой будет произведена склейка.

$collection = collect([
    ['user' => 'one',   'action' => 'buy'],
    ['user' => 'one',   'action' => 'pay'],
    ['user' => 'two',   'action' => 'pay'],
    ['user' => 'three', 'action' => 'buy'],
    ['user' => 'three', 'action' => 'buy'],
]);

dd($collection->implode('action', ', '));

// Результат
"buy, pay, pay, buy, buy"

Если коллекция содержит строки или числа, то указываем единственный аргумент, строка с помощью которой будет произведена склейка.

dd(collect([1, 2, 3, 4, 5])->implode('-'));

// Результат
"1-2-3-4-5"



Метод intersect
Метод удаляет любые пересекающиеся значения, которые не присутствуют в данном массиве или коллекции:

$collection = collect(['one', 'two', 'three']);

dd($collection->intersect(['one', 'three', 'hmm']));

// Результат
Collection {#15 ▼
  #items: array:2 [▼
    0 => "one"
    2 => "three"
  ]
}



Метод isEmpty
Пуста ли коллекция.

dump(collect([])->isEmpty()); // true
dump(collect([1, 2, 3, 4, 5])->isEmpty()); // false

// Результат
true
false



Метод keyBy
Устанавливает в качестве ключа элемента коллекции выбранное значение ключа
(не знаю как лучше описать, смотрите пример =) )

$collection = collect([
    ['product_id' => 'prod-100', 'name' => 'desk'],
    ['product_id' => 'prod-200', 'name' => 'chair'],
]);

dd ($collection->keyBy('product_id'));

// Результат
Collection {#16 ▼
  #items: array:2 [▼
    "prod-100" => array:2 [▼
      "product_id" => "prod-100"
      "name" => "desk"
    ]
    "prod-200" => array:2 [▼
      "product_id" => "prod-200"
      "name" => "chair"
    ]
  ]
}



Метод keys
Метод возвращает все ключи коллекции

$collection = collect([
    'first' => ['product_id' => 'prod-100', 'name' => 'Desk'],
    'second' => ['product_id' => 'prod-200', 'name' => 'Chair'],
]);

dd($collection->keys());

// Результат
Collection {#15 ▼
  #items: array:2 [▼
    0 => "first"
    1 => "second"
  ]
}



Метод last
Возвращает последний элемент коллекции при обработке которого колбек вернул истину (true)
(Данный метод обратный методу first)

$collection = collect([1, 2, 3, 4]);

$last = $collection->last(function ($key, $value) {
    return $value > 2;
});

dd($last);

// Результат
4



Метод map
Метод map передаёт в функцию колбека каждый элемент и создаёт новую коллекцию обработанную этим колбеком.

$collection = collect([1, 2, 3, 4, 5]);

$map = $collection->map(function ($item, $key) {
    return $item * 2;
});

dd($map);

// Результат
Collection {#16 ▼
  #items: array:5 [▼
    0 => 2
    1 => 4
    2 => 6
    3 => 8
    4 => 10
  ]
}



Метод max
Возвращает максимальное значение в коллекции

dump(collect([['foo' => 10], ['foo' => 20]])->max('foo')); // 20
dump(collect([1, 2, 3, 4, 5])->max()); // 5

// Результат
20
5



Метод merge
Производит слияние массива с коллекцией, перезаписывая при этом одноимённые ключи. Цифровые ключи добавляются в конец коллекции.

$collection = collect(['product_id' => 1, 'name' => 'Desk']);

dd($collection->merge(['price' => 100, 'discount' => false]));

// Результат
Collection {#15 ▼
  #items: array:4 [▼
    "product_id" => 1
    "name" => "Desk"
    "price" => 100
    "discount" => false
  ]
}



Метод min
Возвращает минимальное значение в коллекции

dump(collect([['foo' => 10], ['foo' => 20]])->min('foo')); // 10
dump(collect([1, 2, 3, 4, 5])->min()); // 1

// Результат
10
1



Метод only
Метод возвращает только указанные элементы.
(Работает только с «простыми» коллекциями)

$collection = collect(['name' => 'one', 'amount' => 10, 'price'  => 5]);

dd( $collection->only(['amount', 'price']) );

// Результат
Collection {#15 ▼
  #items: array:2 [▼
    "amount" => 10
    "price" => 5
  ]
}



Метод pluck
Возвращает все значения ключей коллекции по указанному ключу

$collection = collect([
    ['product_id' => 'prod-100', 'name' => 'Desk'],
    ['product_id' => 'prod-200', 'name' => 'Chair'],
    ['product_id' => 'prod-300', 'name' => 'Chair'],
]);

dd($collection->pluck('name'));

// Результат
Collection {#15 ▼
  #items: array:3 [▼
    0 => "Desk"
    1 => "Chair"
    2 => "Chair"
  ]
}

Вторым аргументом вы можете указать наименование ключа значение которого будет использоваться в качестве ключа новой коллекции

$collection = collect([
    ['product_id' => 'prod-100', 'name' => 'Desk'],
    ['product_id' => 'prod-200', 'name' => 'Chair'],
    ['product_id' => 'prod-300', 'name' => 'Chair'],
]);

dd($collection->pluck('name', 'product_id'));

// Результат
Collection {#15 ▼
  #items: array:3 [▼
    "prod-100" => "Desk"
    "prod-200" => "Chair"
    "prod-300" => "Chair"
  ]
}



Метод pop
Метод удаляет и возвращает (проще говоря вытаскивает) последний элемент коллекции. Данный метод изменяет оригинальную коллекцию.

$collection = collect([1, 2, 3, 4, 5]);

dump($collection->pop()); // возвращает 5 и удаляет этот элемент из коллекции

dump($collection->all());

// Результат
5

array:4 [▼
  0 => 1
  1 => 2
  2 => 3
  3 => 4
]



Метод prepend
Добавляет элемент в начало коллекции. Данный метод изменяет оригинальную коллекцию.

$collection = collect([1, 2, 3, 4, 5]);

$collection->prepend(5); 

dump($collection->all());

// Результат
array:6 [▼
  0 => 5
  1 => 1
  2 => 2
  3 => 3
  4 => 4
  5 => 5
]

Второй переданный аргумент задаст имя нового ключа

$collection = collect([1, 2, 3, 4, 5]);

$collection->prepend(5, 'five'); 

dump($collection->all());

// Результат
array:6 [▼
  "five" => 5
  0 => 1
  1 => 2
  2 => 3
  3 => 4
  4 => 5
]



Метод pull
Метод извлекает из коллекции произвольный элемент по ключу. Данный метод изменяет оригинальную коллекцию.

$collection = collect(['product_id' => 'prod-100', 'name' => 'Desk']);

dump($collection->pull('name')); // "Desk"

dump($collection->all());

// Результат
 "Desk"

array:1 [▼
  "product_id" => "prod-100"
]



Метод push
Добавляет элемент в конец коллекции. Данный метод изменяет оригинальную коллекцию.

$collection = collect([1, 2, 3, 4]);

dump($collection->push(5));

dd($collection->all());

Результат

Collection {#14 ▼
  #items: array:5 [▼
    0 => 1
    1 => 2
    2 => 3
    3 => 4
    4 => 5
  ]
}

array:5 [▼
  0 => 1
  1 => 2
  2 => 3
  3 => 4
  4 => 5
]



Метод put
Устанавливает заданный ключ и значение в коллекции. Данный метод изменяет оригинальную коллекцию.

$collection = collect(['product_id' => 1, 'name' => 'Desk']);

dd($collection->put('price', 100));

// Результат
Collection {#14 ▼
  #items: array:3 [▼
    "product_id" => 1
    "name" => "Desk"
    "price" => 100
  ]
}



Метод random
Возвращает случайный элемент из коллекции

$collection = collect([1, 2, 3, 4, 5]);

dd($collection->random());

// Результат (Конечно же будет разный)
5



Метод reduce



Метод reject



Метод reverse



Метод search



Метод shift



Метод shuffle



Метод slice



Метод sort



Метод sortBy сортирует коллекцию по указанному ключу

$collection = collect([
    ['name' => 'Desk', 'price' => 200],
    ['name' => 'Chair', 'price' => 100],
    ['name' => 'Bookcase', 'price' => 150],
]);

$sorted = $collection->sortBy('price');

$sorted->values()->all();

/*
    [
        ['name' => 'Chair', 'price' => 100],
        ['name' => 'Bookcase', 'price' => 150],
        ['name' => 'Desk', 'price' => 200],
    ]
*/

Сортируемая коллекция сохраняет оригинальные ключи массива.
Вы можете использовать Callback для указания как сортировать

$collection = collect([
    ['name' => 'Desk', 'colors' => ['Black', 'Mahogany']],
    ['name' => 'Chair', 'colors' => ['Black']],
    ['name' => 'Bookcase', 'colors' => ['Red', 'Beige', 'Brown']],
]);

$sorted = $collection->sortBy(function ($product, $key) {
    return count($product['colors']);
});

$sorted->values()->all();

/*
    [
        ['name' => 'Chair', 'colors' => ['Black']],
        ['name' => 'Desk', 'colors' => ['Black', 'Mahogany']],
        ['name' => 'Bookcase', 'colors' => ['Red', 'Beige', 'Brown']],
    ]
*/



Метод sortByDesc



Метод splice



Метод sum



Метод take



Метод toArray



Метод toJson



Метод transform



Метод unique



Метод values



Метод where



Метод whereLoose



Метод whereIn



Метод whereInLoose



Метод zip

Ctrl + ↓ Ранее