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

namespace IlluminateViewConcerns;

use 
IlluminateContractsViewView;
use 
IlluminateSupportStr;
use 
InvalidArgumentException;

trait 
ManagesLayouts
{
    
/**
     * All of the finished, captured sections.
     *
     * @var array
     */
    
protected $sections = [];

    
/**
     * The stack of in-progress sections.
     *
     * @var array
     */
    
protected $sectionStack = [];

    
/**
     * The parent placeholder for the request.
     *
     * @var mixed
     */
    
protected static $parentPlaceholder = [];

    
/**
     * The parent placeholder salt for the request.
     *
     * @var string
     */
    
protected static $parentPlaceholderSalt;

    
/**
     * Start injecting content into a section.
     *
     * @param  string  $section
     * @param  string|null  $content
     * @return void
     */
    
public function startSection($section, $content = null)
    {
        if (
$content === null) {
            if (
ob_start()) {
                
$this->sectionStack[] = $section;
            }
        } else {
            
$this->extendSection($section, $content instanceof View ? $content : e($content));
        }
    }

    
/**
     * Inject inline content into a section.
     *
     * @param  string  $section
     * @param  string  $content
     * @return void
     */
    
public function inject($section, $content)
    {
        
$this->startSection($section, $content);
    }

    
/**
     * Stop injecting content into a section and return its contents.
     *
     * @return string
     */
    
public function yieldSection()
    {
        if (empty(
$this->sectionStack)) {
            return 
'';
        }

        return 
$this->yieldContent($this->stopSection());
    }

    
/**
     * Stop injecting content into a section.
     *
     * @param  bool  $overwrite
     * @return string
     *
     * @throws InvalidArgumentException
     */
    
public function stopSection($overwrite = false)
    {
        if (empty(
$this->sectionStack)) {
            throw new 
InvalidArgumentException('Cannot end a section without first starting one.');
        }

        
$last = array_pop($this->sectionStack);

        if (
$overwrite) {
            
$this->sections[$last] = ob_get_clean();
        } else {
            
$this->extendSection($last, ob_get_clean());
        }

        return 
$last;
    }

    
/**
     * Stop injecting content into a section and append it.
     *
     * @return string
     *
     * @throws InvalidArgumentException
     */
    
public function appendSection()
    {
        if (empty(
$this->sectionStack)) {
            throw new 
InvalidArgumentException('Cannot end a section without first starting one.');
        }

        
$last = array_pop($this->sectionStack);

        if (isset(
$this->sections[$last])) {
            
$this->sections[$last] .= ob_get_clean();
        } else {
            
$this->sections[$last] = ob_get_clean();
        }

        return 
$last;
    }

    
/**
     * Append content to a given section.
     *
     * @param  string  $section
     * @param  string  $content
     * @return void
     */
    
protected function extendSection($section, $content)
    {
        if (isset(
$this->sections[$section])) {
            
$content = str_replace(static::parentPlaceholder($section), $content, $this->sections[$section]);
        }

        
$this->sections[$section] = $content;
    }

    
/**
     * Get the string contents of a section.
     *
     * @param  string  $section
     * @param  string  $default
     * @return string
     */
    
public function yieldContent($section, $default = '')
    {
        
$sectionContent = $default instanceof View ? $default : e($default);

        if (isset(
$this->sections[$section])) {
            
$sectionContent = $this->sections[$section];
        }

        
$sectionContent = str_replace('@@parent', '--parent--holder--', $sectionContent);

        return 
str_replace(
            
'--parent--holder--', '@parent', str_replace(static::parentPlaceholder($section), '', $sectionContent)
        );
    }

    
/**
     * Get the parent placeholder for the current request.
     *
     * @param  string  $section
     * @return string
     */
    
public static function parentPlaceholder($section = '')
    {
        if (! isset(static::
$parentPlaceholder[$section])) {
            
$salt = static::parentPlaceholderSalt();

            static::
$parentPlaceholder[$section] = '##parent-placeholder-'.hash('xxh128', $salt.$section).'##';
        }

        return static::
$parentPlaceholder[$section];
    }

    
/**
     * Get the parent placeholder salt.
     *
     * @return string
     */
    
protected static function parentPlaceholderSalt()
    {
        if (! static::
$parentPlaceholderSalt) {
            return static::
$parentPlaceholderSalt = Str::random(40);
        }

        return static::
$parentPlaceholderSalt;
    }

    
/**
     * Check if section exists.
     *
     * @param  string  $name
     * @return bool
     */
    
public function hasSection($name)
    {
        return 
array_key_exists($name, $this->sections);
    }

    
/**
     * Check if section does not exist.
     *
     * @param  string  $name
     * @return bool
     */
    
public function sectionMissing($name)
    {
        return ! 
$this->hasSection($name);
    }

    
/**
     * Get the contents of a section.
     *
     * @param  string  $name
     * @param  string|null  $default
     * @return mixed
     */
    
public function getSection($name, $default = null)
    {
        return 
$this->getSections()[$name] ?? $default;
    }

    
/**
     * Get the entire array of sections.
     *
     * @return array
     */
    
public function getSections()
    {
        return 
$this->sections;
    }

    
/**
     * Flush all of the sections.
     *
     * @return void
     */
    
public function flushSections()
    {
        
$this->sections = [];
        
$this->sectionStack = [];
    }
}
Онлайн: 2
Реклама