Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
Добрый день.
Хочу переводить древний сайт на ларавел 5.6.
Решил делать это по роутам - через хтаксесс - просто отправлять новые роуты на другой индекс пхп - от ларавеля.
НУ и потихоньку и старые тоже.
И возникло много вопросов - по использованию компонентов ларавел отдельно от него самого.
Из них главный - чтобы начать - как сделать совместимого пользователя - чтобы чел залогиненный в старой версии был виден в новой и наоборот?
Вся суть сводится к выставлению правильных кук в старой версии для ларавеля, в ларавеле для старой версии.
Я готов переписать алгоритм в старой версии - чтобы не поддерживать 2 паралельно.
Может есть какой то пакет или алгоритм или как то по простому можно.
Не в сети
Я делал такой переход и это тот еще гемор. Если совсем коротко, то тебе нужна сессия ларавель вместо дефолтной пыховской. Далее, тебе повсеместно нужны будут сервисы и контейнер, конфигурация, а также инициированный объект реквест. Короче говоря , надо осуществлять бутстраппинг по ларавельному в твоем не-лравельном фронт-контроллере. Я это сделал через инклуд своего выстраданного файла 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()
Если кто-то мжет упростить это вот все, тому куплю пива
Изменено artoodetoo (09.08.2018 11:19:53)
There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.
Не в сети
Ах, да
Из них главный - чтобы начать - как сделать совместимого пользователя - чтобы чел залогиненный в старой версии был виден в новой и наоборот?
Буквально "совместимого" будет сложно. Проще всего скопировать старую таблицу в новую, понимая что пароли станут невалидными и потребуется процедура восстановления для каждого.
Есть обходное решение для конвертации пароля при первом логине, но это отдельная песня. Начать все равно придется с обеспечения совместимости "на уровне ядра" -- как я выше описал.
There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.
Не в сети
Ну пока я планирую в старую часть сайта ларавел не использовать вообще - ибо согласен - гемор изрядный.
Пока у меня такой план - при логине в старый части формировать куку\сессию не только для старой версии но и для новой.
И соответственно в новой формировать не тока для новой но и для старой.
Но скорее всего и на это забью.
Просто в старой версии сделаю вход совместимый с ларавелем - соответственно пароли да - похерим.
Можно будет делать проверку - типа если по новому не логиниться - то логиним по старому -
но пароль - хеш при этом генерим - чтобы с следующий раз логинило по новому.
По крайней мере это избавит от поддержки двух версий логинов в перспективе.
Но даже как к этому приступить тоже не совсем понимаю.
Не в сети
Страницы 1