Вход Регистрация
Файл: vendor/laravel/framework/src/Illuminate/Session/Store.php
Строк: 595
<?php

namespace IlluminateSession;

use 
Closure;
use 
IlluminateContractsSessionSession;
use 
IlluminateSupportArr;
use 
IlluminateSupportMessageBag;
use 
IlluminateSupportStr;
use 
IlluminateSupportTraitsMacroable;
use 
IlluminateSupportViewErrorBag;
use 
SessionHandlerInterface;
use 
stdClass;

class 
Store implements Session
{
    use 
Macroable;

    
/**
     * The session ID.
     *
     * @var string
     */
    
protected $id;

    
/**
     * The session name.
     *
     * @var string
     */
    
protected $name;

    
/**
     * The session attributes.
     *
     * @var array
     */
    
protected $attributes = [];

    
/**
     * The session handler implementation.
     *
     * @var SessionHandlerInterface
     */
    
protected $handler;

    
/**
     * The session store's serialization strategy.
     *
     * @var string
     */
    
protected $serialization 'php';

    
/**
     * Session store started status.
     *
     * @var bool
     */
    
protected $started false;

    
/**
     * Create a new session instance.
     *
     * @param  string  $name
     * @param  SessionHandlerInterface  $handler
     * @param  string|null  $id
     * @param  string  $serialization
     * @return void
     */
    
public function __construct($nameSessionHandlerInterface $handler$id null$serialization 'php')
    {
        
$this->setId($id);
        
$this->name $name;
        
$this->handler $handler;
        
$this->serialization $serialization;
    }

    
/**
     * Start the session, reading the data from a handler.
     *
     * @return bool
     */
    
public function start()
    {
        
$this->loadSession();

        if (! 
$this->has('_token')) {
            
$this->regenerateToken();
        }

        return 
$this->started true;
    }

    
/**
     * Load the session data from the handler.
     *
     * @return void
     */
    
protected function loadSession()
    {
        
$this->attributes array_merge($this->attributes$this->readFromHandler());

        
$this->marshalErrorBag();
    }

    
/**
     * Read the session data from the handler.
     *
     * @return array
     */
    
protected function readFromHandler()
    {
        if (
$data $this->handler->read($this->getId())) {
            if (
$this->serialization === 'json') {
                
$data json_decode($this->prepareForUnserialize($data), true);
            } else {
                
$data = @unserialize($this->prepareForUnserialize($data));
            }

            if (
$data !== false && is_array($data)) {
                return 
$data;
            }
        }

        return [];
    }

    
/**
     * Prepare the raw string data from the session for unserialization.
     *
     * @param  string  $data
     * @return string
     */
    
protected function prepareForUnserialize($data)
    {
        return 
$data;
    }

    
/**
     * Marshal the ViewErrorBag when using JSON serialization for sessions.
     *
     * @return void
     */
    
protected function marshalErrorBag()
    {
        if (
$this->serialization !== 'json' || $this->missing('errors')) {
            return;
        }

        
$errorBag = new ViewErrorBag;

        foreach (
$this->get('errors') as $key => $value) {
            
$messageBag = new MessageBag($value['messages']);

            
$errorBag->put($key$messageBag->setFormat($value['format']));
        }

        
$this->put('errors'$errorBag);
    }

    
/**
     * Save the session data to storage.
     *
     * @return void
     */
    
public function save()
    {
        
$this->ageFlashData();

        
$this->prepareErrorBagForSerialization();

        
$this->handler->write($this->getId(), $this->prepareForStorage(
            
$this->serialization === 'json' json_encode($this->attributes) : serialize($this->attributes)
        ));

        
$this->started false;
    }

    
/**
     * Prepare the ViewErrorBag instance for JSON serialization.
     *
     * @return void
     */
    
protected function prepareErrorBagForSerialization()
    {
        if (
$this->serialization !== 'json' || $this->missing('errors')) {
            return;
        }

        
$errors = [];

        foreach (
$this->attributes['errors']->getBags() as $key => $value) {
            
$errors[$key] = [
                
'format' => $value->getFormat(),
                
'messages' => $value->getMessages(),
            ];
        }

        
$this->attributes['errors'] = $errors;
    }

    
/**
     * Prepare the serialized session data for storage.
     *
     * @param  string  $data
     * @return string
     */
    
protected function prepareForStorage($data)
    {
        return 
$data;
    }

    
/**
     * Age the flash data for the session.
     *
     * @return void
     */
    
public function ageFlashData()
    {
        
$this->forget($this->get('_flash.old', []));

        
$this->put('_flash.old'$this->get('_flash.new', []));

        
$this->put('_flash.new', []);
    }

    
/**
     * Get all of the session data.
     *
     * @return array
     */
    
public function all()
    {
        return 
$this->attributes;
    }

    
/**
     * Get a subset of the session data.
     *
     * @param  array  $keys
     * @return array
     */
    
public function only(array $keys)
    {
        return 
Arr::only($this->attributes$keys);
    }

    
/**
     * Get all the session data except for a specified array of items.
     *
     * @param  array  $keys
     * @return array
     */
    
public function except(array $keys)
    {
        return 
Arr::except($this->attributes$keys);
    }

    
/**
     * Checks if a key exists.
     *
     * @param  string|array  $key
     * @return bool
     */
    
public function exists($key)
    {
        
$placeholder = new stdClass;

        return ! 
collect(is_array($key) ? $key func_get_args())->contains(function ($key) use ($placeholder) {
            return 
$this->get($key$placeholder) === $placeholder;
        });
    }

    
/**
     * Determine if the given key is missing from the session data.
     *
     * @param  string|array  $key
     * @return bool
     */
    
public function missing($key)
    {
        return ! 
$this->exists($key);
    }

    
/**
     * Checks if a key is present and not null.
     *
     * @param  string|array  $key
     * @return bool
     */
    
public function has($key)
    {
        return ! 
collect(is_array($key) ? $key func_get_args())->contains(function ($key) {
            return 
is_null($this->get($key));
        });
    }

    
/**
     * Get an item from the session.
     *
     * @param  string  $key
     * @param  mixed  $default
     * @return mixed
     */
    
public function get($key$default null)
    {
        return 
Arr::get($this->attributes$key$default);
    }

    
/**
     * Get the value of a given key and then forget it.
     *
     * @param  string  $key
     * @param  mixed  $default
     * @return mixed
     */
    
public function pull($key$default null)
    {
        return 
Arr::pull($this->attributes$key$default);
    }

    
/**
     * Determine if the session contains old input.
     *
     * @param  string|null  $key
     * @return bool
     */
    
public function hasOldInput($key null)
    {
        
$old $this->getOldInput($key);

        return 
is_null($key) ? count($old) > : ! is_null($old);
    }

    
/**
     * Get the requested item from the flashed input array.
     *
     * @param  string|null  $key
     * @param  mixed  $default
     * @return mixed
     */
    
public function getOldInput($key null$default null)
    {
        return 
Arr::get($this->get('_old_input', []), $key$default);
    }

    
/**
     * Replace the given session attributes entirely.
     *
     * @param  array  $attributes
     * @return void
     */
    
public function replace(array $attributes)
    {
        
$this->put($attributes);
    }

    
/**
     * Put a key / value pair or array of key / value pairs in the session.
     *
     * @param  string|array  $key
     * @param  mixed  $value
     * @return void
     */
    
public function put($key$value null)
    {
        if (! 
is_array($key)) {
            
$key = [$key => $value];
        }

        foreach (
$key as $arrayKey => $arrayValue) {
            
Arr::set($this->attributes$arrayKey$arrayValue);
        }
    }

    
/**
     * Get an item from the session, or store the default value.
     *
     * @param  string  $key
     * @param  Closure  $callback
     * @return mixed
     */
    
public function remember($keyClosure $callback)
    {
        if (! 
is_null($value $this->get($key))) {
            return 
$value;
        }

        return 
tap($callback(), function ($value) use ($key) {
            
$this->put($key$value);
        });
    }

    
/**
     * Push a value onto a session array.
     *
     * @param  string  $key
     * @param  mixed  $value
     * @return void
     */
    
public function push($key$value)
    {
        
$array $this->get($key, []);

        
$array[] = $value;

        
$this->put($key$array);
    }

    
/**
     * Increment the value of an item in the session.
     *
     * @param  string  $key
     * @param  int  $amount
     * @return mixed
     */
    
public function increment($key$amount 1)
    {
        
$this->put($key$value $this->get($key0) + $amount);

        return 
$value;
    }

    
/**
     * Decrement the value of an item in the session.
     *
     * @param  string  $key
     * @param  int  $amount
     * @return int
     */
    
public function decrement($key$amount 1)
    {
        return 
$this->increment($key$amount * -1);
    }

    
/**
     * Flash a key / value pair to the session.
     *
     * @param  string  $key
     * @param  mixed  $value
     * @return void
     */
    
public function flash(string $key$value true)
    {
        
$this->put($key$value);

        
$this->push('_flash.new'$key);

        
$this->removeFromOldFlashData([$key]);
    }

    
/**
     * Flash a key / value pair to the session for immediate use.
     *
     * @param  string  $key
     * @param  mixed  $value
     * @return void
     */
    
public function now($key$value)
    {
        
$this->put($key$value);

        
$this->push('_flash.old'$key);
    }

    
/**
     * Reflash all of the session flash data.
     *
     * @return void
     */
    
public function reflash()
    {
        
$this->mergeNewFlashes($this->get('_flash.old', []));

        
$this->put('_flash.old', []);
    }

    
/**
     * Reflash a subset of the current flash data.
     *
     * @param  array|mixed  $keys
     * @return void
     */
    
public function keep($keys null)
    {
        
$this->mergeNewFlashes($keys is_array($keys) ? $keys func_get_args());

        
$this->removeFromOldFlashData($keys);
    }

    
/**
     * Merge new flash keys into the new flash array.
     *
     * @param  array  $keys
     * @return void
     */
    
protected function mergeNewFlashes(array $keys)
    {
        
$values array_unique(array_merge($this->get('_flash.new', []), $keys));

        
$this->put('_flash.new'$values);
    }

    
/**
     * Remove the given keys from the old flash data.
     *
     * @param  array  $keys
     * @return void
     */
    
protected function removeFromOldFlashData(array $keys)
    {
        
$this->put('_flash.old'array_diff($this->get('_flash.old', []), $keys));
    }

    
/**
     * Flash an input array to the session.
     *
     * @param  array  $value
     * @return void
     */
    
public function flashInput(array $value)
    {
        
$this->flash('_old_input'$value);
    }

    
/**
     * Remove an item from the session, returning its value.
     *
     * @param  string  $key
     * @return mixed
     */
    
public function remove($key)
    {
        return 
Arr::pull($this->attributes$key);
    }

    
/**
     * Remove one or many items from the session.
     *
     * @param  string|array  $keys
     * @return void
     */
    
public function forget($keys)
    {
        
Arr::forget($this->attributes$keys);
    }

    
/**
     * Remove all of the items from the session.
     *
     * @return void
     */
    
public function flush()
    {
        
$this->attributes = [];
    }

    
/**
     * Flush the session data and regenerate the ID.
     *
     * @return bool
     */
    
public function invalidate()
    {
        
$this->flush();

        return 
$this->migrate(true);
    }

    
/**
     * Generate a new session identifier.
     *
     * @param  bool  $destroy
     * @return bool
     */
    
public function regenerate($destroy false)
    {
        return 
tap($this->migrate($destroy), function () {
            
$this->regenerateToken();
        });
    }

    
/**
     * Generate a new session ID for the session.
     *
     * @param  bool  $destroy
     * @return bool
     */
    
public function migrate($destroy false)
    {
        if (
$destroy) {
            
$this->handler->destroy($this->getId());
        }

        
$this->setExists(false);

        
$this->setId($this->generateSessionId());

        return 
true;
    }

    
/**
     * Determine if the session has been started.
     *
     * @return bool
     */
    
public function isStarted()
    {
        return 
$this->started;
    }

    
/**
     * Get the name of the session.
     *
     * @return string
     */
    
public function getName()
    {
        return 
$this->name;
    }

    
/**
     * Set the name of the session.
     *
     * @param  string  $name
     * @return void
     */
    
public function setName($name)
    {
        
$this->name $name;
    }

    
/**
     * Get the current session ID.
     *
     * @return string
     */
    
public function getId()
    {
        return 
$this->id;
    }

    
/**
     * Set the session ID.
     *
     * @param  string|null  $id
     * @return void
     */
    
public function setId($id)
    {
        
$this->id $this->isValidId($id) ? $id $this->generateSessionId();
    }

    
/**
     * Determine if this is a valid session ID.
     *
     * @param  string|null  $id
     * @return bool
     */
    
public function isValidId($id)
    {
        return 
is_string($id) && ctype_alnum($id) && strlen($id) === 40;
    }

    
/**
     * Get a new, random session ID.
     *
     * @return string
     */
    
protected function generateSessionId()
    {
        return 
Str::random(40);
    }

    
/**
     * Set the existence of the session on the handler if applicable.
     *
     * @param  bool  $value
     * @return void
     */
    
public function setExists($value)
    {
        if (
$this->handler instanceof ExistenceAwareInterface) {
            
$this->handler->setExists($value);
        }
    }

    
/**
     * Get the CSRF token value.
     *
     * @return string
     */
    
public function token()
    {
        return 
$this->get('_token');
    }

    
/**
     * Regenerate the CSRF token value.
     *
     * @return void
     */
    
public function regenerateToken()
    {
        
$this->put('_token'Str::random(40));
    }

    
/**
     * Get the previous URL from the session.
     *
     * @return string|null
     */
    
public function previousUrl()
    {
        return 
$this->get('_previous.url');
    }

    
/**
     * Set the "previous" URL in the session.
     *
     * @param  string  $url
     * @return void
     */
    
public function setPreviousUrl($url)
    {
        
$this->put('_previous.url'$url);
    }

    
/**
     * Specify that the user has confirmed their password.
     *
     * @return void
     */
    
public function passwordConfirmed()
    {
        
$this->put('auth.password_confirmed_at'time());
    }

    
/**
     * Get the underlying session handler implementation.
     *
     * @return SessionHandlerInterface
     */
    
public function getHandler()
    {
        return 
$this->handler;
    }

    
/**
     * Set the underlying session handler implementation.
     *
     * @param  SessionHandlerInterface  $handler
     * @return SessionHandlerInterface
     */
    
public function setHandler(SessionHandlerInterface $handler)
    {
        return 
$this->handler $handler;
    }

    
/**
     * Determine if the session handler needs a request.
     *
     * @return bool
     */
    
public function handlerNeedsRequest()
    {
        return 
$this->handler instanceof CookieSessionHandler;
    }

    
/**
     * Set the request on the handler instance.
     *
     * @param  IlluminateHttpRequest  $request
     * @return void
     */
    
public function setRequestOnHandler($request)
    {
        if (
$this->handlerNeedsRequest()) {
            
$this->handler->setRequest($request);
        }
    }
}
Онлайн: 0
Реклама