ACC SHELL
<?php
/**
* This file is part of the Nette Framework (http://nette.org)
* Copyright (c) 2004 David Grudl (http://davidgrudl.com)
* @package Nette\Application
*/
/**
* Default presenter loader.
*
* @author David Grudl
* @package Nette\Application
*/
class NPresenterFactory extends NObject implements IPresenterFactory
{
/** @var bool */
public $caseSensitive = FALSE;
/** @var string */
private $baseDir;
/** @var array */
private $cache = array();
/** @var NDIContainer */
private $container;
/**
* @param string
*/
public function __construct($baseDir, NDIContainer $container)
{
$this->baseDir = $baseDir;
$this->container = $container;
}
/**
* Creates new presenter instance.
* @param string presenter name
* @return IPresenter
*/
public function createPresenter($name)
{
$presenter = $this->container->createInstance($this->getPresenterClass($name));
if (method_exists($presenter, 'setContext')) {
$this->container->callMethod(array($presenter, 'setContext'));
}
foreach (array_reverse(get_class_methods($presenter)) as $method) {
if (substr($method, 0, 6) === 'inject') {
$this->container->callMethod(array($presenter, $method));
}
}
if ($presenter instanceof NPresenter && $presenter->invalidLinkMode === NULL) {
$presenter->invalidLinkMode = $this->container->parameters['debugMode'] ? NPresenter::INVALID_LINK_WARNING : NPresenter::INVALID_LINK_SILENT;
}
return $presenter;
}
/**
* Generates and checks presenter class name.
* @param string presenter name
* @return string class name
* @throws NInvalidPresenterException
*/
public function getPresenterClass(& $name)
{
if (isset($this->cache[$name])) {
list($class, $name) = $this->cache[$name];
return $class;
}
if (!is_string($name) || !NStrings::match($name, '#^[a-zA-Z\x7f-\xff][a-zA-Z0-9\x7f-\xff:]*\z#')) {
throw new NInvalidPresenterException("Presenter name must be alphanumeric string, '$name' is invalid.");
}
$class = $this->formatPresenterClass($name);
if (!class_exists($class)) {
// internal autoloading
$file = $this->formatPresenterFile($name);
if (is_file($file) && is_readable($file)) {
NLimitedScope::load($file, TRUE);
}
if (!class_exists($class)) {
throw new NInvalidPresenterException("Cannot load presenter '$name', class '$class' was not found in '$file'.");
}
}
$reflection = new NClassReflection($class);
$class = $reflection->getName();
if (!$reflection->implementsInterface('IPresenter')) {
throw new NInvalidPresenterException("Cannot load presenter '$name', class '$class' is not IPresenter implementor.");
}
if ($reflection->isAbstract()) {
throw new NInvalidPresenterException("Cannot load presenter '$name', class '$class' is abstract.");
}
// canonicalize presenter name
$realName = $this->unformatPresenterClass($class);
if ($name !== $realName) {
if ($this->caseSensitive) {
throw new NInvalidPresenterException("Cannot load presenter '$name', case mismatch. Real name is '$realName'.");
} else {
$this->cache[$name] = array($class, $realName);
$name = $realName;
}
} else {
$this->cache[$name] = array($class, $realName);
}
return $class;
}
/**
* Formats presenter class name from its name.
* @param string
* @return string
*/
public function formatPresenterClass($presenter)
{
return strtr($presenter, ':', '_') . 'Presenter';
return str_replace(':', 'Module\\', $presenter) . 'Presenter';
}
/**
* Formats presenter name from class name.
* @param string
* @return string
*/
public function unformatPresenterClass($class)
{
return strtr(substr($class, 0, -9), '_', ':');
return str_replace('Module\\', ':', substr($class, 0, -9));
}
/**
* Formats presenter class file name.
* @param string
* @return string
*/
public function formatPresenterFile($presenter)
{
$path = '/' . str_replace(':', 'Module/', $presenter);
return $this->baseDir . substr_replace($path, '/presenters', strrpos($path, '/'), 0) . 'Presenter.php';
}
}
ACC SHELL 2018