نمایش و مدیریت کاربران لاگین کرده در لاراول

بنا به دلایل مختلف ممکنه نیاز پیدا کنیم که بدونیم کدوم کاربران ما الان لاگین کردن و چه اطلاعاتی از اونها داریم. برای مثال با چه دستگاه هایی لاگین کردن، از کجا لاگین کردن و… یا حتی محدودیت برای لاگین بخوایم بذاریم! سشن ها در لاراول در جاهای مختلفی میتونن ذخیره بشن مثل فایل ها، دیتابیس، کوکی، memcache / redis و آرایه ها (تنظیمات سشن در لاراول). برای مدیریت بهتر سشن ها اون ها رو در دیتابیس ذخیره میکنیم که امکانات زیادی به ما میده از قبیل مدیریت زمان، دسته بندی، مدیریت دستگاه ها، تعداد دستگاه ها و…

دستورات زیر رو اجرا کنین تا لاراول شما آماده بشه:

php artisan session:table
 
composer dump-autoload
 
php artisan migrate

 

حالا داخل فایل config/session.php  درایور سشن رو به database  تغییر بدین.

ایزی ایزی تمام تمام. همین! برین دیتابیس رو نگاه کنین و راحت کوئری بزنین و کاربران رو همونطور که میخواین لیست کنین، مدیریت کنین.

احتمالا نیاز پیدا کنین که کش کانفیگ رو کلیر کنین پس حتما انجامش بدین.

منبع: Display user devices there application is currently logged in and option to logout in Laravel

نصب VirtualBox 6 برو روی Ubuntu 18.04

برای نصب VirtualBox 6 بر روی اوبونتو ۱۸ ابتدا بروز رسانی های ابتدایی رو با اجرای دستورات زیر انجام بدین:

sudo apt update
sudo apt upgrade

بعد اینکه بروز رسانی انجام شد کلید های عمومی اوراکل رو به پکیج های رجیستر شده سیستم اضافه میکنیم:

wget -q https://www.virtualbox.org/download/oracle_vbox_2016.asc -O- | sudo apt-key add -
wget -q https://www.virtualbox.org/download/oracle_vbox.asc -O- | sudo apt-key add -

بعد نیاز داریم که Oracle VirtualBox PPA رو به اوبنتو اضافه کنیم، دستورات زیر رو اجرا کنین تا ضافه بشه.

sudo add-apt-repository "deb http://download.virtualbox.org/virtualbox/debian bionic contrib"

این کار یه مخزن جدید به مخازن سیستم اوبونتو اضافه میکنه. بعد اینکه اضافه کردین با دستور sudo apt update مخازن رو بروزرسانی میکنیم. اگر حین بروزرسانی با خطای زیر مواجه شدین، بهتر راه حل رفع این خطا رو از اینجا بخونین.

این خطا:
N: Skipping acquire of configured file ‘contrib/binary-i386/Packages’ as repository ‘http://download.virtualbox.org/virtualbox/debian bionic InRelease’ doesn’t support architecture ‘i386’

خب حالا که همه چی رو درست انجام دادین، با دستور sudo apt install virtualbox-6.1 راحت VirtualBox 6 رو نصب کنین.

نکته: در آموزش اصلی ورژن ۶ بود که من ۶.۱ رو نصب کردم.
نکته ۲: برای جستجو ورژن های جدید/موجود از این مقاله استفاده کنین

نصب VirtualBox 6.1 بر روی اوبونتو ۱۸

منبع زبان اصلی برای نصب VirtualBox 6 بر روی Ubuntu 18.04

چطور در میان بسته ها / برنامه های اوبونتو / لینوکس apt جستجو کنیم

برای جستجو در میان بسته های اوبونتو از دستور apt search package یا از دستور apt-cache search package استقاده میکنم. این دوتا نام بسته رو در میون همه چیز های موجود جستجو میکنن. حالا اگر خواستین نتیجه نهایی رو هم فیلتر کنین از پایپ گرپ استفاده کنیم به این صورت apt-cache search package | grep anotherFilter اگر باز نتایج نهایی زیاد بود، میتونین از پایپ لس استفاده کنین به اینصورت میشه:

apt-cache search package | grep anOtherFilter | less

راهنما و منبع: How do I search for available packages from the command-line

برطرف کردن خطای Skipping acquire of configured file ‘contrib/binary-i386/Packages’

وقتی میخوایم VirtualBox 6 رو روی Ubuntu 18.04 نصب کنیم، با خطای زیر ممکنه مواجه بشیم:

N: Skipping acquire of configured file 'contrib/binary-i386/Packages' as repository 'http://download.virtualbox.org/virtualbox/debian bionic InRelease' doesn't support architecture 'i386'

دلیلشم اینه راهنمایی که از روی اون VirtualBox 6 رو نصب کردیم مناسب cpu ما نبوده و برای رفعش لازمه فایل
sudo nano /etc/apt/sources.list.d/virtualbox.list
رو ویرایش کنیم، داخل این فایل دنبال خطر زیر گردین:
deb https://download.virtualbox.org/virtualbox/debian bionic contrib
و اونو تغییر بدین به:
deb [arch=amd64] https://download.virtualbox.org/virtualbox/debian bionic contrib
که در اصل فقط اولش یه [arch=amd64]  اضافه کردیم.

من این راهنما رو از اینجا پیدا کردم و در اینجا یک بش اسکریپت برای نصب و راه اندازی راحت VirtualBox 6 وجود داره که میتونین استفاده کنین.

افزودن لاگین با جیمیل (گوگل) در لاراول

در این پست بهتون میگم چطور از پکیج Socialite استفاده کنین و به وبسایتتون لاگین با جیمیل یا… رو اضافه کنین. برای شروع نیازه که ما پکیج Socialite رو بوسیله composer نصب کنیم. راهنمای خود لاراول رو اینجا ببینین:  Laravel Socialite

نصب Socialite 

composer require laravel/socialite


کانفیک لاراول

سرویسی که میخواین (گوگل، فیسبوک، لینکداین و…) رو به config/service.php اضافه کنین.

'google' => [
    'client_id'     => env('GOOGLE_CLIENT_ID'),
    'client_secret' => env('GOOGLE_CLIENT_SECRET'),
    'redirect'      => env('GOOGLE_REDIRECT')
],

بعد اینکه پکیج جدید رو نصب کردیم سرویس پرووایدر اون رو هم به config/app.php اضافه میکنیم

/*
* Package Service Providers...
*/
Laravel\Socialite\SocialiteServiceProvider::class,

سرویس پرووایدر جایی برای راه انداری برنامه ها و پکیج هاست، خط بالا به لاراول Socialite رو برای استفاده میشناسونه.

همیشه پای یک alias هم در میونه! برای دسترسی راحتتر آلیاس اون رو هم نصب میکنیم.

'aliases' => [
    // ...
    'Socialite' => Laravel\Socialite\Facades\Socialite::class,
]

تا اینجا شما میبایست ساختار اهراز هویت رو داشته باشید و در این آموزش تصور میکنیم این مرحله رو قبلا انجام دادین.

پروژه خودتون رو در گوگل https://console.developers.google.com/projectcreate درست کنین و بعد هم یک اعتبار نامه در اینجا https://console.developers.google.com/apis/credentials درست کنین.

OAuth clinet id google console
OAuth client ID > Consent > Web application

اطلاعاتی که گرفتین رو در .env فایل خودتون وارد کنین:

GOOGLE_CLIENT_ID=000000000000-XXXXXXXXXXX.apps.googleusercontent.com
GOOGLE_CLIENT_SECRET=XXXXXXXXXXXXX
GOOGLE_REDIRECT=http://localhost:8000/callback

قراردادن آدرس برگشتی

در اینجا باید آدرس کالبک رو وارد کنین.

بعد وارد کردن این آدرس ها وارد وب روت خود بشین و روت های مخصوص ریدارکت به گوگل و بازگشت اون رو ایجاد کنین.

Route::get('/redirect', 'Auth\LoginController@redirectToProvider');
Route::get('/callback', 'Auth\LoginController@handleProviderCallback');

در خط اول رواتی (یا روتی) رو تعریف میکنیم که کاربر رو به گوگل میفرسته و خط دوم برگشت از گوگل با دریافت اطلاعات کاربر هست. حالا در LoginController.php متد هایی که تو روات تعریف کردیم رو وارد میکنیم. متد زیر مارو به گوگل ریدایرکت میکنه برای گرفتن اطلاعات کاربر.

/**
  * Redirect the user to the Google authentication page.
  *
  * @return \Illuminate\Http\Response
  */
public function redirectToProvider()
{
    return Socialite::driver('google')->redirect();
}

و متد بعدی دریافت اطلاعات کاربر از گوگل هست (برگشت از گوگل) که اگر ایمیل قبلا وجود داشته، ثبت نام انجام میشه و اگر وجود نداشته باشه ما اون کاربر رو ایجاد میکنیم و سپس لاگین انجام میشه:

    /**
     * Obtain the user information from Google.
     *
     * @return \Illuminate\Http\Response
     */
    public function handleProviderCallback()
    {
        try {
            $user = Socialite::driver('google')->user();
        } catch (\Exception $e) {
            return redirect('/login');
        }        // only allow people with @company.com to login
        if(explode("@", $user->email)[1] !== 'company.com'){
            return redirect()->to('/');
        }        // check if they're an existing user
        $existingUser = User::where('email', $user->email)->first();        if($existingUser){
            // log them in
            auth()->login($existingUser, true);
        } else {
            // create a new user
            $newUser                  = new User;
            $newUser->name            = $user->name;
            $newUser->email           = $user->email;
            $newUser->google_id       = $user->id;
            $newUser->avatar          = $user->avatar;
            $newUser->avatar_original = $user->avatar_original;
            $newUser->save();            auth()->login($newUser, true);
        }
        return redirect()->to('/home');
    }

 

خب تا اینجای کار شما همه کارو انجام دادین فقط بعد اینکه پکیجی رو نصب کردین حتما دامپ کنین:

php artisan clear-compiled
composer dump-autoload
php artisan optimize

اگر خواستین از آدرس های مختلفی برای کالبک استفاده کنین دستور زیر کمکتون میکنه

public function socialLogin($loginFrom){
  return Socialite::driver('google') >redirectUrl('http://your-domain.com?data=123')->redirect();
}

 

منابع:

Add Login with Google to your Laravel app
Laravel 5.5 socialite integration shows error formatRedirectUrl() must be of the type array, null given
Dynamic callback url laravel socialite

چطور در لاراول از ایمیل یا شماره موبایل برای لاگین استفاده کنیم؟ شایدم نام کاربری

برای اینکه کاربرای سایت بتونن با ایمیل یا نام کاربری یا شماره موبایل بتونن لاگین کنن (یک فیلد نام کاربری باشد که هر کدام از این ۳تا را کاربر وارد کرد بتونه لاگین کنه) تغییر خیلی کوچیکی تو متد کنترلر لاگین میدیم. برای اینکار فایل LoginController.php رو ویرایش میکنیم.

ابتدا کلاس Request رو use کنین

use Illuminate\Http\Request;

 

سپس متد credentials رو بازنویسی میکنیم.

    protected function credentials(Request $request)
    {
        $field = filter_var($request->get($this->username()), FILTER_VALIDATE_EMAIL)
            ? 'email'
            : 'mobile';

        return [
            $field => $request->get($this->username()),
            'password' => $request->password,
        ];
    }

تست شده در لاراول ۵٫۴ ۵٫۷ و ۵٫۸

منبع:
https://stackoverflow.com/questions/42708942/allow-login-using-username-or-email-in-laravel-5-4

راهنمای سریع استفاده از ربات تلگرام در لاراول Laravel Telegram Bot

در این مقاله خیلی سریع وخلاصه میریم سراغ ایجاد ربات و اتصال اون به لاراول.
توسط کد زیر پکیج کار با تلگرام رو به لاراول اضافه کنین:

composer require irazasyed/telegram-bot-sdk

حالا به آرایه providers که در مسیر config/app.php هست اضافه میکنیم.

Telegram\Bot\Laravel\TelegramServiceProvider::class,

حالا به آرایه aliases کد زیر رو اضافه میکنیم تا Telegram به فاساد هامون اضافه بشه.

 'Telegram' => Telegram\Bot\Laravel\Facades\Telegram::class,

حالا که سرویس و فاساد اون رو اضافه کردیم فایل کانفیگ تلگرام رو با دستور زیر انتشار میدیم (میاریم به فولدر config)

php artisan vendor:publish --provider="Telegram\Bot\Laravel\TelegramServiceProvider"

حالا میریم به تلگرام و ربات پدرخانده @BotFather رو استارت میزنیم با دستور /newbot یک ربات جدید ایجاد میکنیم. اول اسم ربات و دوم نام کاربری اون رو وارد میکنیم در آخر هم وقتی ربات به درستی ایجاد شد، تلگرام کد token HTTP API میده که بهش تو فایل .env نیاز داریم و به صورت زیر در این فایل وارد میکنیم:

TELEGRAM_BOT_TOKEN=525012101:AAEwy9R1SCpq0V_Bpkgqm9Z4nbrWZaNt_Kg

خب حالا نیاز به یک کانال تلگرام داریم که رباتمون رو داخلش ادد کنیم.

به فایل config/telegram.php میریم و در قسمت ربات های نام رباتمون رو مینویسیم (قسمت username). کد زیر

'bots' => [
    'mybot' => [
        'username' => 'tutsforwebbot',
        'token' => env('TELEGRAM_BOT_TOKEN', ''),
        'certificate_path' => env('TELEGRAM_CERTIFICATE_PATH', ''),
        'webhook_url' => env('TELEGRAM_WEBHOOK_URL', ''),
        'commands' => [
        ],
    ],
],

برای بروز رسانی کشمون هم از دستور زیر استفاده میکنیم:

php artisan config:cache

در تلگرام هر چت (کانال، چت، گروه پی وی یا…) یه اتاق گفتگو حساب میشه و برای ارسال پیام توسط رباط ما نیاز به شماره اون اتاق داریم که البته اسمش chat_id هست. برای اینکه شماره اتاق گفتگو رو پیدا کنیم و کار با رباط تلگرام یه کنترلر برای رباط تلگرام ایجاد میکنیم:

php artisan make:controller TelegramBotController

و کد های زیر رو به کنترلرمون اضافه میکنیم

<?php
 
namespace App\Http\Controllers;
 
use Telegram\Bot\Laravel\Facades\Telegram;
 
class TelegramBotController extends Controller
{
    public function updatedActivity()
    {
        $activity = Telegram::getUpdates();
        dd($activity);
    }
}

کد بالا پیام های اتاق گفتگو رو بصورت لاگ نمایش میده و همچنین شماره اون رو. با مسیر زیر کنترلرمون رو فعال میکنیم:

Route::get('/updated-activity', 'TelegramBotController@updatedActivity');

حالا به مرورگر میریم و آدرس /updated-activity رو تایپ میکنیم، اگر کانال ما خالی باشه مقدار [] برمیگرده ولی وقتی یک پیام ایجاد کنیم (خودمون یک پیام در کانال منتشر کنیم) و دوباره تست میگیریم. خروجی شبیه این میشه:

array:1 [▼
  ۰ => Update {#348 ▼
    #items: array:2 [▼
      "update_id" => 21432106
      "channel_post" => array:4 [▼
        "message_id" => 12
        "chat" => array:4 [▼
          "id" => -1001361379586
          "title" => "Hamidreza bot test"
          "username" => "hamidrezabot_test"
          "type" => "channel"
        ]
        "date" => 1568741639
        "text" => "SalamDonya"
      ]
    ]
  }
]

اگر قبلا پیامی در گروه فرستاده بودین آخرین ایندکس رو چک کنین. در این آرایه در قسمت ایندکس chat قسمت id یک شماره نوشته شده -۱۰۰۱۳۶۱۳۷۹۵۸۶ این شماره رو کپی میکنیم و در فایل .env متغیر زیر رو اضافه میکنیم

TELEGRAM_CHANNEL_ID=-1001361379586

و سپس کش رو دوباره ریفرش میکنیم

php artisan config:cache

حالا به کنترلر TelegramBotController متد زیر رو اضافه میکنیم

public function sendMessage()
    {
        Telegram::sendMessage([
            'chat_id' => -1001361379586,//env('TELEGRAM_CHANNEL_ID', ''),
            'parse_mode' => 'HTML',
            'text' => 'اولین پیام تست ربات تلگرام'
        ]);
    }

البته من مستقیم شماره chat_id رو وارد کردم ولی شما میتنین از متغیر محیطی .env استفاده کنین که کدشو کامنت کردم.
آدرس sendMessage رو در روت خودمون وارد میکنیم و بعد در مرورگر تست میکنیم.

Route::get('/sendMessage', 'TelegramBotController@sendMessage');

 

منبع: https://tutsforweb.com/sending-notifications-to-telegram-messenger-with-laravel

چطور با استفاده از فایل .htaccess آدرس www در ابتدای دامنه را حذف کنیم؟

برای حذف www از ابتدای آدرس دامنه میتونین کد زیر رو به فایل .htaccess خودتون اضافه کنین:

<IfModule mod_rewrite.c>
    RewriteBase /
	RewriteEngine On
	RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
	RewriteRule ^(.*)$ http://%1/$1 [R=301,L]
</IfModule>

اگر مطلب چطور با استفاده از فایل .htaccess ترافیک پرتکل HTTP را به HTTPS منتقل کنیم؟ رو خونده باشید و بخواین از هر دو کد استفاده کنین، کد زیر ترکیبی از هر دو کد هست. و اینکه خط ۶ و ۷ رو هم میتونید حذف کنین، به عبارتی نیازی نیست چون در خط ۵ تمامیه درخواست ها به پرتکل https منتقل شده.

<IfModule mod_rewrite.c>
	RewriteEngine On
	RewriteBase /
	RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
	RewriteRule ^(.*)$ https://%1/$1 [R=301,L]
	RewriteCond %{HTTPS} off
	RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
</IfModule>

 

چطور با استفاده از فایل .htaccess ترافیک پرتکل HTTP را به HTTPS منتقل کنیم؟

با قرار دادن کن زیر به راحتی میشه ترافیک رو از HTTP به HTTPS منتقل کرد:

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{HTTPS} off
    RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
</IfModule>

اگه مطلب چطور با استفاده از فایل .htaccess آدرس www در ابتدای دامنه را حذف کنیم؟ رو خونده باشید و بخواین از هر دو کد استفاده کنین، کد زیر ترکیبی از هر دو کد هست. و اینکه خط ۶ و ۷ رو هم میتونید حذف کنین، به عبارتی نیازی نیست چون در خط ۵ تمامیه درخواست ها به پرتکل https منتقل شده.

<IfModule mod_rewrite.c>
	RewriteEngine On
	RewriteBase /
	RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
	RewriteRule ^(.*)$ https://%1/$1 [R=301,L]
	RewriteCond %{HTTPS} off
	RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
</IfModule>

 

تغییر مسیر پوشه public لاراول به public_html و دسته بندی و جمع کردن سایر فایل ها و پوشه ها در یک فولدر

در این آموزش برسی میکنیم چطور پوشه public لاراول رو به public_html یا هر نام دیگه ای تغییر بدیم و سپس بقیه فایل ها رو درون یک فولدر بریزیم و با نامی مجزا در کنار public_html داشته باشیم (برای عدم دستری از روت سایت به فایل ها و پوشه های لاراول)

فرض کنین میخوام برای پروژم فقط دو فولدر public_html و laravel داشته باشم که بجز public_html همه فایل ها و فولدر های قدیم داخل laravel باشند:

۱. ابتدا فایل index.php از فولدر public رو ادیت میکنیم

//دو خط زیر رو تغییر مسیر بدید به آدرس جدیدتون
require __DIR__.'/../laravel/vendor/autoload.php';
$app = require_once __DIR__.'/../laravel/bootstrap/app.php';

۲. فایل AppServiceProvider.php که در مسیر app/Providers هست رو ویرایش میکنیم و کد زیر رو به متد register اضافه و آدرس دهی مناسب میکنیم.

$this->app->bind('path.public', function() {
    return realpath(base_path().'/../public_html');
});

۳. فایل server.php از روت پروژه رو ویرایش میکنیم و در ۲ قسمت باید آدرس جدیمون رو قرار بدیم.

if ($uri !== '/' && file_exists(__DIR__.'/../public_html'.$uri)) {
    return false;
}

require_once __DIR__.'/../public_html/index.php';

 

موفق باشید