2016-01-11 4 views
10

Так что Laravel сохраняет свои собственные файлы сеансов, когда кто-то обращается к веб-сайту в папке/storage/framework/sessions. Каждый из этих имен файла сеанса представляет собой произвольно генерируемое альфа-числовое уникальное имя. Но я хотел бы как-то переименовать файлы и указать свое собственное имя. У меня есть два варианта.Изменение имен файлов сеанса в Laravel 5.1

  • Изменить имя файла вручную, как только файл сеанса создается (с помощью создания, копирования, замены)
  • Найти функцию, которая случайным образом генерирует алфавитно-цифровое имя и изменить его с моим собственным путем установления уникального имени для каждого файла (этот метод может иметь меньше осложнений)

Моя главная цель - переименовать файл сеанса каждого пользователя в свой собственный идентификатор пользователя, который хранится в моем db. Таким образом, имена по-прежнему уникальны, единственное отличие состоит в том, что я могу искать файлы легче, чем если бы у них были случайные буквенно-цифровые имена.

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

EDIT: Решил обновить здесь то, что я решил сделать в конце концов. Я решил не использовать встроенные файлы сеансов, созданные Laravel, и понял, что сделать мой собственный файл намного проще, и вместо этого каждый клиент будет обращаться к нему. Спасибо всем!

ответ

1

В Laravel есть несколько классов менеджера, которые управляют созданием компонентов на основе драйверов . К ним относятся кеш, сеанс, проверка подлинности и компоненты очереди. Класс менеджера отвечает для создания конкретной реализации драйвера на основе конфигурации приложения . Например, класс SessionManager может создавать файлы, базу данных, файлы cookie и различные другие реализации драйверов .

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

Для расширения Laravel с водителем пользовательского сеанса, мы будем использовать метод расширения зарегистрировать наш пользовательский код:

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

Реализовать SessionHandlerInterface

приложение/Поставщики/AppServiceProvider.php

<?php 
namespace App\Providers; 

use Session; 
use Illuminate\Support\ServiceProvider; 
use App\Handlers\MyFileHandler; 

class AppServiceProvider extends ServiceProvider 
{ 
    public function boot() 
    { 
     Session::extend('file', function($app) 
     { 
      return new MyFileHandler(); 
     }); 
    } 
} 

Обратите внимание, что наш обычай водитель сессии должен реализовывать SessionHandlerInterface. Этот интерфейс содержит всего несколько простых методов, которые нам нужно реализовать.

приложение/Манипуляторы/MyFileHandler.php

<?php 
namespace App\Handlers; 

use SessionHandlerInterface; 

class MyFileHandler implements SessionHandlerInterface { 

    public function open($savePath, $sessionName) {} 
    public function close() {} 
    public function read($sessionId) {} 
    public function write($sessionId, $data) {} 
    public function destroy($sessionId) {} 
    public function gc($lifetime) {} 

} 

Или вы можете расширить MyFileHandler от FileSessionHandler и переопределить соответствующие методы.

Продлить FileSessionHandler

приложение/Поставщики/AppServiceProvider.php

<?php 
namespace App\Providers; 

use Session; 
use Illuminate\Support\ServiceProvider; 
use Illuminate\Session\FileSessionHandler; 
use App\Handlers\MyFileHandler; 

class AppServiceProvider extends ServiceProvider 
{ 
    public function boot() 
    { 
     Session::extend('file', function($app) 
     { 
      $path = $app['config']['session.files']; 
      return new MyFileHandler($app['files'], $path); 
     }); 
    } 
} 

приложение/Манипуляторы/MyFileHandler.php

<?php 
namespace App\Handlers; 

use Illuminate\Filesystem\Filesystem; 
use Illuminate\Session\FileSessionHandler; 

class MyFileHandler extends FileSessionHandler 
{ 
    public function __construct(Filesystem $files, $path) 
    { 
     parent::__construct($files, $path); 
    } 
} 

Вы можете найти больше в сессии разделе Расширение рамочный документ.

https://laravel.com/docs/5.0/extending#session

+0

Спасибо за ответ. Однако, где именно указано имя файла? Это часть «myfile» в функции загрузки? Если это так, используя 'myfile' там, не будет ли это статическим именем для всех файлов сеанса, так как я сомневаюсь, что загрузка будет вызвана более одного раза? Я что-то упускаю? –

0

Если конечная цель поиска по именам файлов сессии; вам не нужно их менять. Вы можете сохранить имена файлов сеанса в таблице базы данных (или другой файл по вашему выбору). Вы можете использовать this link для получения имен файлов.

Одна колонка -> имена файлов магазин сессии

другие столбцы -> сохранить другую информацию, что вы хотите

Таким образом, вы можете искать и находить быстрые файлы с помощью SQL.

+0

Это альтернатива, конечно. Но это связано с созданием новых файлов и сохранением информации о сеансе в нем или даже в базах данных. Моему требованию я должен постоянно запускать запросы для извлечения из базы данных почти каждые 5-10 секунд. Файлы могут быть быстрее, но я думал, что если я могу получить доступ к уже существующим файлам, зачем создавать новые файлы и делать то же самое? –

0

использование промежуточного слоя для запроса

\Illuminate\Session\Middleware\StartSession::class 

Route::group(['middleware' => [\Illuminate\Session\Middleware\StartSession::class]], function() { 

}); 
Смежные вопросы