Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 08.08.2018 18:54:38

User из ларавлел 5.6 в стороннем проекте

Добрый день.

Хочу переводить древний сайт на ларавел 5.6.

Решил делать это по роутам - через хтаксесс - просто отправлять новые роуты на другой индекс пхп - от ларавеля.
НУ и потихоньку и старые тоже.

И возникло много вопросов - по использованию компонентов ларавел отдельно от него самого.

Из них главный - чтобы начать - как сделать совместимого пользователя - чтобы чел залогиненный в старой версии был виден в новой и наоборот?

Вся суть сводится к выставлению правильных кук в старой версии для ларавеля, в ларавеле для старой версии.
Я готов переписать алгоритм в старой версии - чтобы не поддерживать 2 паралельно.

Может есть какой то пакет или алгоритм или как то по простому можно.

Не в сети

#2 09.08.2018 11:17:54

Re: User из ларавлел 5.6 в стороннем проекте

Я делал такой переход и это тот еще гемор. Если совсем коротко, то тебе нужна сессия ларавель вместо дефолтной пыховской. Далее, тебе повсеместно нужны будут сервисы и контейнер, конфигурация, а также инициированный объект реквест. Короче говоря , надо осуществлять бутстраппинг по ларавельному в твоем не-лравельном фронт-контроллере. Я это сделал через инклуд своего выстраданного файла init_laravel.php в начале каждой точки входа (у меня их стопицот). Примерно такого содержания:

app/Compatibility/laravel_init.php

<?php
/**
 * Workaround to keep Laravel session in legacy code
 */

function set_session_cookie()
{
    /* @var $session \Illuminate\Session\Store */
    /* @var $config array */
    /* @var $encrypter \Illuminate\Encryption\Encrypter */
    $session = app('session.store');
    $config = app('session')->getSessionConfig();
    $encrypter = app('encrypter');
    $expired = $config['expire_on_close'] ? 0 : time() + 60 * $config['lifetime'];
    setcookie(
        $session->getName(),
        $encrypter->encrypt($session->getId()),
        $expired,
        $config['path'],
        $config['domain'],
        isset($config['secure']) ? $config['secure'] : false,
        isset($config['http_only']) ? $config['http_only'] : true
    );
}

/* @var $app \Illuminate\Foundation\Application */
/* @var $kernel \App\Http\Kernel */
/* @var $request \Illuminate\Http\Request */
/* @var $session \Illuminate\Session\Store */

$app = require_once dirname(dirname(__DIR__)).'/bootstrap/app.php';

if (php_sapi_name() === 'cli') {
    $kernel = $app->make(Illuminate\Contracts\Console\Kernel::class);
    $input = new Symfony\Component\Console\Input\ArgvInput;
    $output = new Symfony\Component\Console\Output\ConsoleOutput;
    $kernel->bootstrap();
} else {
    // In classic Laravel app it is performing in Kernel bootstrap method which is called on request handling.
    // Since we do not use routing atm, we have to to do this work explicitly.
    $kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);
    $app->instance('request',  $request = Illuminate\Http\Request::capture());
    // Simulate entry point
    $script = '/index.php';
    $request->server->set('SCRIPT_FILENAME', dirname(dirname(__DIR__)) . '/public' . $script);
    $request->server->set('SCRIPT_NAME', $script);
    // Bootstrap: load configuration, etc.
    $kernel->bootstrap();

    // Laravel has its own session implementation
    $session = $app['session']->driver();
    try {
        $id = $app['encrypter']->decrypt($request->cookies->get($session->getName()));
    } catch (\Illuminate\Contracts\Encryption\DecryptException $e) {
        $id = null; // force to generate
    }
    $session->setId($id);
    $session->start();
    $request->setLaravelSession($session);
    if (is_null($id)) {
        set_session_cookie();
    }
    register_shutdown_function(function() use($session) {
        $session->save();
    });
}

return $app;

после этого мне доступны все сервисы ларавель в моем легаси коде. с сессионными переменными я работаю через хелпер session(), пользователь через Auth::user()

Если кто-то мжет упростить это вот все, тому куплю пива smile

Изменено artoodetoo (09.08.2018 11:19:53)


There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.

Не в сети

#3 09.08.2018 11:26:01

Re: User из ларавлел 5.6 в стороннем проекте

Ах, да

Из них главный - чтобы начать - как сделать совместимого пользователя - чтобы чел залогиненный в старой версии был виден в новой и наоборот?

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

Есть обходное решение для конвертации пароля при первом логине, но это отдельная песня. Начать все равно придется с обеспечения совместимости "на уровне ядра" -- как я выше описал.


There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.

Не в сети

#4 09.08.2018 19:30:04

Re: User из ларавлел 5.6 в стороннем проекте

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

Пока у меня такой план - при логине в старый части формировать куку\сессию не только для старой версии но и для новой.
И соответственно в новой формировать не тока для новой но и для старой.

Но скорее всего и на это забью.

Просто в старой версии сделаю вход совместимый с ларавелем - соответственно пароли да - похерим.

Можно будет делать проверку - типа если по новому не логиниться - то логиним по старому -
но пароль - хеш при этом генерим - чтобы с следующий раз логинило по новому.

По крайней мере это избавит от поддержки двух версий логинов в перспективе.

Но даже как к этому приступить тоже не совсем понимаю.

Не в сети

Подвал раздела