Ошибка в BladeCompiler

Ромчик
0

laravel

Доброго времени суток. После установки Laravel 5.1 столкнулся со следующей проблемой: при отображении сайта возникла ошибка: «ErrorException in BladeCompiler.php line 261:
preg_replace_callback(): Compilation failed: internal error: previously-checked referenced subpattern not found at offset 47» Система: Debian 7, PHP-5.5.25, PCRE Librery 8.36. И так решение проблемы

Открываем файл BladeCompiler.php, который находится в vendor/framework/src/illuminate/View/Compilers

В данном файле заменяем код на:

<?php namespace Illuminate\View\Compilers;
use Closure;
class BladeCompiler extends Compiler implements
CompilerInterface {
	/**
	 * All of the registered extensions.
	 *
	 * @var array
	 */
	protected $extensions = array();
	
        /**
	 * All of the available compiler functions.
	 *
	 * @var array
	 */
	protected $compilers = array(
		'Extensions',
		'Extends',
		'Comments',
		'Echos',
		'Openings',
		'Closings',
		'Else',
		'Unless',
		'EndUnless',
		'Includes',
		'Each',
		'Yields',
		'Shows',
		'Language',
		'SectionStart',
		'SectionStop',
		'SectionAppend',
		'SectionOverwrite',
	);

	/**
	 * Array of opening and closing tags for echos.
	 *
	 * @var array
	 */
	protected $contentTags = array('{{', '}}');

	/**
	 * Array of opening and closing tags for escaped
echos.
	 *
	 * @var array
	 */
	protected $escapedTags = array('{{{', '}}}');

	/**
	 * Compile the view at the given path.
	 *
	 * @param  string  $path
	 * @return void
	 */

	public function compile($path)
	{
		$contents =
$this->compileString($this->files->get($path));
		if ( ! is_null($this->cachePath))
		{
			$this->files->put($this->getCompiledPath($path),
$contents);
		}
	}

	/**
	 * Compile the given Blade template contents.
	 *
	 * @param  string  $value
	 * @return string
	 */
	public function compileString($value)
	{
		foreach ($this->compilers as $compiler)
		{
			$value = $this->{"compile{$compiler}"}($value);
		}
		return $value;
	}

	/**
	 * Register a custom Blade compiler.
	 *
	 * @param  Closure  $compiler
	 * @return void
	 */
	public function extend(Closure $compiler)
	{
		$this->extensions[] = $compiler;
	}

	/**
	 * Execute the user defined extensions.
	 *
	 * @param  string  $value
	 * @return string
	 */
	protected function compileExtensions($value)
	{
		foreach ($this->extensions as $compiler)
		{
			$value = call_user_func($compiler, $value, $this);
		}
		return $value;
	}

	/**
	 * Compile Blade template extensions into valid PHP.
	 *
	 * @param  string  $value
	 * @return string
	 */
	protected function compileExtends($value)
	{
		// By convention, Blade views using template
inheritance must begin with the
		// @extends expression, otherwise they will not be
compiled with template
		// inheritance. So, if they do not start with that we
will just return.
		if (strpos($value, '@extends') !== 0)
		{
			return $value;
		}
		$lines = preg_split("/(\r?\n)/", $value);
		// Next, we just want to split the values by lines,
and create an expression
		// to include the parent layout at the end of the
templates. Which allows
		// the sections to get registered before the parent
view gets rendered.
		$lines = $this->compileLayoutExtends($lines);
		return implode("\r\n", array_slice($lines,
1));
	}

	/**
	 * Compile the proper template inheritance for the
lines.
	 *
	 * @param  array  $lines
	 * @return array
	 */
	protected function compileLayoutExtends($lines)
	{
		$pattern = $this->createMatcher('extends');
		$lines[] = preg_replace($pattern, '$1@include$2',
$lines[0]);
		return $lines;
	}

	/**
	 * Compile Blade comments into valid PHP.
	 *
	 * @param  string  $value
	 * @return string
	 */
	protected function compileComments($value)
	{
		$pattern = sprintf('/%s--((.|\s)*?)--%s/',
$this->contentTags[0], $this->contentTags[1]);
		return preg_replace($pattern, '<?php /*$1*/ ?>',
$value);
	}

	/**
	 * Compile Blade echos into valid PHP.
	 *
	 * @param  string  $value
	 * @return string
	 */
	protected function compileEchos($value)
	{
		$difference = strlen($this->contentTags[0]) -
strlen($this->escapedTags[0]);
		if ($difference > 0)
		{
			return
$this->compileEscapedEchos($this->compileRegularEchos($value));
		}
		return
$this->compileRegularEchos($this->compileEscapedEchos($value));
	}

	/**
	 * Compile the "regular" echo statements.
	 *
	 * @param  string  $value
	 * @return string
	 */

	protected function compileRegularEchos($value)
	{
		$pattern = sprintf('/(@)?%s\s*(.+?)\s*%s/s',
$this->contentTags[0], $this->contentTags[1]);
		$callback = function($matches)
		{
			return $matches[1] ? substr($matches[0], 1) : '<?php
echo '.$this->compileEchoDefaults($matches[2]).'; ?>';
		};
		return preg_replace_callback($pattern, $callback,
$value);
	}

	/**
	 * Compile the escaped echo statements.
	 *
	 * @param  string  $value
	 * @return string
	 */
	protected function compileEscapedEchos($value)
	{
		$pattern = sprintf('/%s\s*(.+?)\s*%s/s',
$this->escapedTags[0], $this->escapedTags[1]);
		$callback = function($matches)
		{
			return '<?php echo
e('.$this->compileEchoDefaults($matches[1]).'); ?>';
		};
		return preg_replace_callback($pattern, $callback,
$value);
	}

	/**
	 * Compile the default values for the echo statement.
	 *
	 * @param  string  $value
	 * @return string
	 */
	public function compileEchoDefaults($value)
	{
		return
preg_replace('/^(?=\$)(.+?)(?:\s+or\s+)(.+?)$/s', 'isset($1) ? $1 :
$2', $value);
	}

	/**
	 * Compile Blade structure openings into valid PHP.
	 *
	 * @param  string  $value
	 * @return string
	 */
	protected function compileOpenings($value)
	{
		$pattern =
'/(?(R)\((?:[^\(\)]|(?R))*\)|(?<!\w)(\s*)@(if|elseif|foreach|for|while)(\s*(?R)+))/';
		return preg_replace($pattern, '$1<?php $2$3: ?>',
$value);
	}

	/**
	 * Compile Blade structure closings into valid PHP.
	 *
	 * @param  string  $value
	 * @return string
	 */
	protected function compileClosings($value)
	{
		$pattern =
'/(\s*)@(endif|endforeach|endfor|endwhile)(\s*)/';
		return preg_replace($pattern, '$1<?php $2; ?>$3',
$value);
	}

	/**
	 * Compile Blade else statements into valid PHP.
	 *
	 * @param  string  $value
	 * @return string
	 */
	protected function compileElse($value)
	{
		$pattern = $this->createPlainMatcher('else');
		return preg_replace($pattern, '$1<?php else:
?>$2', $value);
	}

	/**
	 * Compile Blade unless statements into valid PHP.
	 *
	 * @param  string  $value
	 * @return string
	 */
	protected function compileUnless($value)
	{
		$pattern = $this->createMatcher('unless');
		return preg_replace($pattern, '$1<?php if ( !$2):
?>', $value);
	}

	/**
	 * Compile Blade end unless statements into valid PHP.
	 *
	 * @param  string  $value
	 * @return string
	 */
	protected function compileEndUnless($value)
	{
		$pattern = $this->createPlainMatcher('endunless');
		return preg_replace($pattern, '$1<?php endif;
?>$2', $value);
	}

	/**
	 * Compile Blade include statements into valid PHP.
	 *
	 * @param  string  $value
	 * @return string
	 */
	protected function compileIncludes($value)
	{
		$pattern = $this->createOpenMatcher('include');
		$replace = '$1<?php echo $__env->make$2,
array_except(get_defined_vars(), array(\'__data\',
\'__path\')))->render(); ?>';
		return preg_replace($pattern, $replace, $value);
	}

	/**
	 * Compile Blade each statements into valid PHP.
	 *
	 * @param  string  $value
	 * @return string
	 */
	protected function compileEach($value)
	{
		$pattern = $this->createMatcher('each');
		return preg_replace($pattern, '$1<?php echo
$__env->renderEach$2; ?>', $value);
	}

	/**
	 * Compile Blade yield statements into valid PHP.
	 *
	 * @param  string  $value
	 * @return string
	 */
	protected function compileYields($value)
	{
		$pattern = $this->createMatcher('yield');
		return preg_replace($pattern, '$1<?php echo
$__env->yieldContent$2; ?>', $value);
	}

	/**
	 * Compile Blade show statements into valid PHP.
	 *
	 * @param  string  $value
	 * @return string
	 */
	protected function compileShows($value)
	{
		$pattern = $this->createPlainMatcher('show');
		return preg_replace($pattern, '$1<?php echo
$__env->yieldSection(); ?>$2', $value);
	}

	/**
	 * Compile Blade language and language choice
statements into valid PHP.
	 *
	 * @param  string  $value
	 * @return string
	 */
	protected function compileLanguage($value)
	{
		$pattern = $this->createMatcher('lang');
		$value = preg_replace($pattern, '$1<?php echo
\Illuminate\Support\Facades\Lang::get$2; ?>', $value);
		$pattern = $this->createMatcher('choice');
		return preg_replace($pattern, '$1<?php echo
\Illuminate\Support\Facades\Lang::choice$2; ?>', $value);
	}

	/**
	 * Compile Blade section start statements into valid
PHP.
	 *
	 * @param  string  $value
	 * @return string
	 */
	protected function compileSectionStart($value)
	{
		$pattern = $this->createMatcher('section');
		return preg_replace($pattern, '$1<?php
$__env->startSection$2; ?>', $value);
	}

	/**
	 * Compile Blade section stop statements into valid
PHP.
	 *
	 * @param  string  $value
	 * @return string
	 */
	protected function compileSectionStop($value)
	{
		$pattern = $this->createPlainMatcher('stop');
		$value = preg_replace($pattern, '$1<?php
$__env->stopSection(); ?>$2', $value);
		$pattern = $this->createPlainMatcher('endsection');
		return preg_replace($pattern, '$1<?php
$__env->stopSection(); ?>$2', $value);
	}

	/**
	 * Compile Blade section append statements into valid
PHP.
	 *
	 * @param  string  $value
	 * @return string
	 */
	protected function compileSectionAppend($value)
	{
		$pattern = $this->createPlainMatcher('append');
		return preg_replace($pattern, '$1<?php
$__env->appendSection(); ?>$2', $value);
	}

	/**
	 * Compile Blade section stop statements into valid
PHP.
	 *
	 * @param  string  $value
	 * @return string
	 */
	protected function compileSectionOverwrite($value)
	{
		$pattern = $this->createPlainMatcher('overwrite');
		return preg_replace($pattern, '$1<?php
$__env->stopSection(true); ?>$2', $value);
	}

	/**
	 * Get the regular expression for a generic Blade
function.
	 *
	 * @param  string  $function
	 * @return string
	 */
	public function createMatcher($function)
	{
		return '/(?<!\w)(\s*)@'.$function.'(\s*\(.*\))/';
	}

	/**
	 * Get the regular expression for a generic Blade
function.
	 *
	 * @param  string  $function
	 * @return string
	 */
	public function createOpenMatcher($function)
	{
		return '/(?<!\w)(\s*)@'.$function.'(\s*\(.*)\)/';
	}

	/**
	 * Create a plain Blade matcher.
	 *
	 * @param  string  $function
	 * @return string
	 */
	public function createPlainMatcher($function)
	{
		return '/(?<!\w)(\s*)@'.$function.'(\s*)/';
	}

	/**
	 * Sets the content tags used for the compiler.
	 *
	 * @param  string  $openTag
	 * @param  string  $closeTag
	 * @param  bool    $escaped
	 * @return void
	 */

	public function setContentTags($openTag, $closeTag,
$escaped = false)
	{
		$property = ($escaped === true) ? 'escapedTags' :
'contentTags';
		$this->{$property} = array(preg_quote($openTag),
preg_quote($closeTag));
	}

	/**
	 * Sets the escaped content tags used for the
compiler.
	 *
	 * @param  string  $openTag
	 * @param  string  $closeTag
	 * @return void
	 */

	public function setEscapedContentTags($openTag,
$closeTag)
	{
		$this->setContentTags($openTag, $closeTag, true);
	}

	/**
	* Gets the content tags used for the compiler.
	*
	* @return string
	*/
	public function getContentTags()
	{
		return $this->contentTags;
	}

	/**
	* Gets the escaped content tags used for the compiler.
	*
	* @return string
	*/
	public function getEscapedContentTags()
	{
		return $this->escapedTags;
	}
}

Вот в принципе и все.

Понравилась статья? Поделись с друзьями.
  • Add to favorites
  • Добавить ВКонтакте заметку об этой странице
  • Twitter
  • Facebook
  • Мой Мир
  • LiveJournal
  • Одноклассники
  • Блог Я.ру
  • MySpace
  • FriendFeed
  • В закладки Google
  • Google Buzz
  • Яндекс.Закладки
  • Reddit
  • StumbleUpon
  • Technorati
  • del.icio.us
  • БобрДобр
  • LinkedIn
  • Memori.ru
  • Сто закладок
  • Blogger

©2012-2020 По всем вопросам обращайтесь через форму обратной связиПолитика конфиденциальности

Яндекс.Метрика