Merge branch '5.0'
* 5.0: [FrameworkBundle] start session on flashbag injection [Validator] Remove commas in translations [Console] Fallback to default answers when unable to read input
This commit is contained in:
commit
eda7aad51e
@ -13,8 +13,6 @@
|
||||
|
||||
<service id="session" class="Symfony\Component\HttpFoundation\Session\Session" public="true">
|
||||
<argument type="service" id="session.storage" />
|
||||
<argument type="service" id="session.attribute_bag" />
|
||||
<argument type="service" id="session.flash_bag" />
|
||||
</service>
|
||||
|
||||
<service id="Symfony\Component\HttpFoundation\Session\SessionInterface" alias="session" />
|
||||
@ -37,10 +35,14 @@
|
||||
<argument type="service" id="session.storage.metadata_bag" />
|
||||
</service>
|
||||
|
||||
<service id="session.flash_bag" class="Symfony\Component\HttpFoundation\Session\Flash\FlashBag" />
|
||||
<service id="session.flash_bag" class="Symfony\Component\HttpFoundation\Session\Flash\FlashBag">
|
||||
<factory service="session" method="getFlashBag"/>
|
||||
</service>
|
||||
<service id="Symfony\Component\HttpFoundation\Session\Flash\FlashBagInterface" alias="session.flash_bag" />
|
||||
|
||||
<service id="session.attribute_bag" class="Symfony\Component\HttpFoundation\Session\Attribute\AttributeBag" />
|
||||
<service id="session.attribute_bag" class="Symfony\Component\HttpFoundation\Session\Attribute\AttributeBag">
|
||||
<factory service="session" method="getAttributeBag"/>
|
||||
</service>
|
||||
|
||||
<service id="session.storage.mock_file" class="Symfony\Component\HttpFoundation\Session\Storage\MockFileSessionStorage">
|
||||
<argument>%kernel.cache_dir%/sessions</argument>
|
||||
|
@ -0,0 +1,36 @@
|
||||
<?php
|
||||
|
||||
namespace Symfony\Bundle\FrameworkBundle\Tests\Functional\Bundle\TestBundle\Controller;
|
||||
|
||||
use Symfony\Component\HttpFoundation\RedirectResponse;
|
||||
use Symfony\Component\HttpFoundation\Request;
|
||||
use Symfony\Component\HttpFoundation\Session\Flash\FlashBagInterface;
|
||||
use Symfony\Component\Routing\RouterInterface;
|
||||
|
||||
class InjectedFlashbagSessionController
|
||||
{
|
||||
/**
|
||||
* @var FlashBagInterface
|
||||
*/
|
||||
private $flashBag;
|
||||
|
||||
/**
|
||||
* @var RouterInterface
|
||||
*/
|
||||
private $router;
|
||||
|
||||
public function __construct(
|
||||
FlashBagInterface $flashBag,
|
||||
RouterInterface $router
|
||||
) {
|
||||
$this->flashBag = $flashBag;
|
||||
$this->router = $router;
|
||||
}
|
||||
|
||||
public function setFlashAction(Request $request, $message)
|
||||
{
|
||||
$this->flashBag->add('notice', $message);
|
||||
|
||||
return new RedirectResponse($this->router->generate('session_showflash'));
|
||||
}
|
||||
}
|
@ -18,6 +18,10 @@ session_setflash:
|
||||
path: /session_setflash/{message}
|
||||
defaults: { _controller: Symfony\Bundle\FrameworkBundle\Tests\Functional\Bundle\TestBundle\Controller\SessionController::setFlashAction }
|
||||
|
||||
injected_flashbag_session_setflash:
|
||||
path: injected_flashbag/session_setflash/{message}
|
||||
defaults: { _controller: TestBundle:InjectedFlashbagSession:setFlash}
|
||||
|
||||
session_showflash:
|
||||
path: /session_showflash
|
||||
defaults: { _controller: Symfony\Bundle\FrameworkBundle\Tests\Functional\Bundle\TestBundle\Controller\SessionController::showFlashAction }
|
||||
|
@ -69,6 +69,29 @@ class SessionTest extends AbstractWebTestCase
|
||||
$this->assertStringContainsString('No flash was set.', $crawler->text());
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests flash messages work when flashbag service is injected to the constructor.
|
||||
*
|
||||
* @dataProvider getConfigs
|
||||
*/
|
||||
public function testFlashOnInjectedFlashbag($config, $insulate)
|
||||
{
|
||||
$client = $this->createClient(['test_case' => 'Session', 'root_config' => $config]);
|
||||
if ($insulate) {
|
||||
$client->insulate();
|
||||
}
|
||||
|
||||
// set flash
|
||||
$client->request('GET', '/injected_flashbag/session_setflash/Hello%20world.');
|
||||
|
||||
// check flash displays on redirect
|
||||
$this->assertStringContainsString('Hello world.', $client->followRedirect()->text());
|
||||
|
||||
// check flash is gone
|
||||
$crawler = $client->request('GET', '/session_showflash');
|
||||
$this->assertStringContainsString('No flash was set.', $crawler->text());
|
||||
}
|
||||
|
||||
/**
|
||||
* See if two separate insulated clients can run without
|
||||
* polluting each other's session data.
|
||||
|
@ -5,3 +5,7 @@ services:
|
||||
Symfony\Bundle\FrameworkBundle\Tests\Functional\Bundle\TestBundle\Controller\SubRequestController:
|
||||
tags:
|
||||
- { name: controller.service_arguments, action: indexAction, argument: handler, id: fragment.handler }
|
||||
|
||||
Symfony\Bundle\FrameworkBundle\Tests\Functional\Bundle\TestBundle\Controller\InjectedFlashbagSessionController:
|
||||
autowire: true
|
||||
tags: ['controller.service_arguments']
|
||||
|
@ -0,0 +1,21 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Console\Exception;
|
||||
|
||||
/**
|
||||
* Represents failure to read input from stdin.
|
||||
*
|
||||
* @author Gabriel Ostrolucký <gabriel.ostrolucky@gmail.com>
|
||||
*/
|
||||
class MissingInputException extends RuntimeException implements ExceptionInterface
|
||||
{
|
||||
}
|
@ -11,6 +11,7 @@
|
||||
|
||||
namespace Symfony\Component\Console\Helper;
|
||||
|
||||
use Symfony\Component\Console\Exception\MissingInputException;
|
||||
use Symfony\Component\Console\Exception\RuntimeException;
|
||||
use Symfony\Component\Console\Formatter\OutputFormatter;
|
||||
use Symfony\Component\Console\Formatter\OutputFormatterStyle;
|
||||
@ -49,35 +50,14 @@ class QuestionHelper extends Helper
|
||||
}
|
||||
|
||||
if (!$input->isInteractive()) {
|
||||
$default = $question->getDefault();
|
||||
|
||||
if (null === $default) {
|
||||
return $default;
|
||||
}
|
||||
|
||||
if ($validator = $question->getValidator()) {
|
||||
return \call_user_func($question->getValidator(), $default);
|
||||
} elseif ($question instanceof ChoiceQuestion) {
|
||||
$choices = $question->getChoices();
|
||||
|
||||
if (!$question->isMultiselect()) {
|
||||
return isset($choices[$default]) ? $choices[$default] : $default;
|
||||
}
|
||||
|
||||
$default = explode(',', $default);
|
||||
foreach ($default as $k => $v) {
|
||||
$v = $question->isTrimmable() ? trim($v) : $v;
|
||||
$default[$k] = isset($choices[$v]) ? $choices[$v] : $v;
|
||||
}
|
||||
}
|
||||
|
||||
return $default;
|
||||
return $this->getDefaultAnswer($question);
|
||||
}
|
||||
|
||||
if ($input instanceof StreamableInputInterface && $stream = $input->getStream()) {
|
||||
$this->inputStream = $stream;
|
||||
}
|
||||
|
||||
try {
|
||||
if (!$question->getValidator()) {
|
||||
return $this->doAsk($output, $question);
|
||||
}
|
||||
@ -87,6 +67,15 @@ class QuestionHelper extends Helper
|
||||
};
|
||||
|
||||
return $this->validateAttempts($interviewer, $output, $question);
|
||||
} catch (MissingInputException $exception) {
|
||||
$input->setInteractive(false);
|
||||
|
||||
if (null === $fallbackOutput = $this->getDefaultAnswer($question)) {
|
||||
throw $exception;
|
||||
}
|
||||
|
||||
return $fallbackOutput;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@ -135,7 +124,7 @@ class QuestionHelper extends Helper
|
||||
if (false === $ret) {
|
||||
$ret = fgets($inputStream, 4096);
|
||||
if (false === $ret) {
|
||||
throw new RuntimeException('Aborted.');
|
||||
throw new MissingInputException('Aborted.');
|
||||
}
|
||||
if ($question->isTrimmable()) {
|
||||
$ret = trim($ret);
|
||||
@ -159,6 +148,36 @@ class QuestionHelper extends Helper
|
||||
return $ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return mixed
|
||||
*/
|
||||
private function getDefaultAnswer(Question $question)
|
||||
{
|
||||
$default = $question->getDefault();
|
||||
|
||||
if (null === $default) {
|
||||
return $default;
|
||||
}
|
||||
|
||||
if ($validator = $question->getValidator()) {
|
||||
return \call_user_func($question->getValidator(), $default);
|
||||
} elseif ($question instanceof ChoiceQuestion) {
|
||||
$choices = $question->getChoices();
|
||||
|
||||
if (!$question->isMultiselect()) {
|
||||
return isset($choices[$default]) ? $choices[$default] : $default;
|
||||
}
|
||||
|
||||
$default = explode(',', $default);
|
||||
foreach ($default as $k => $v) {
|
||||
$v = $question->isTrimmable() ? trim($v) : $v;
|
||||
$default[$k] = isset($choices[$v]) ? $choices[$v] : $v;
|
||||
}
|
||||
}
|
||||
|
||||
return $default;
|
||||
}
|
||||
|
||||
/**
|
||||
* Outputs the question prompt.
|
||||
*/
|
||||
@ -239,7 +258,7 @@ class QuestionHelper extends Helper
|
||||
// as opposed to fgets(), fread() returns an empty string when the stream content is empty, not false.
|
||||
if (false === $c || ('' === $ret && '' === $c && null === $question->getDefault())) {
|
||||
shell_exec(sprintf('stty %s', $sttyMode));
|
||||
throw new RuntimeException('Aborted.');
|
||||
throw new MissingInputException('Aborted.');
|
||||
} elseif ("\177" === $c) { // Backspace Character
|
||||
if (0 === $numMatches && 0 !== $i) {
|
||||
--$i;
|
||||
@ -406,7 +425,7 @@ class QuestionHelper extends Helper
|
||||
shell_exec(sprintf('stty %s', $sttyMode));
|
||||
|
||||
if (false === $value) {
|
||||
throw new RuntimeException('Aborted.');
|
||||
throw new MissingInputException('Aborted.');
|
||||
}
|
||||
if ($trimmable) {
|
||||
$value = trim($value);
|
||||
|
@ -696,7 +696,7 @@ class QuestionHelperTest extends AbstractQuestionHelperTest
|
||||
|
||||
public function testAskThrowsExceptionOnMissingInput()
|
||||
{
|
||||
$this->expectException('Symfony\Component\Console\Exception\RuntimeException');
|
||||
$this->expectException('Symfony\Component\Console\Exception\MissingInputException');
|
||||
$this->expectExceptionMessage('Aborted.');
|
||||
$dialog = new QuestionHelper();
|
||||
$dialog->ask($this->createStreamableInputInterfaceMock($this->getInputStream('')), $this->createOutputInterface(), new Question('What\'s your name?'));
|
||||
@ -704,7 +704,7 @@ class QuestionHelperTest extends AbstractQuestionHelperTest
|
||||
|
||||
public function testAskThrowsExceptionOnMissingInputForChoiceQuestion()
|
||||
{
|
||||
$this->expectException('Symfony\Component\Console\Exception\RuntimeException');
|
||||
$this->expectException('Symfony\Component\Console\Exception\MissingInputException');
|
||||
$this->expectExceptionMessage('Aborted.');
|
||||
$dialog = new QuestionHelper();
|
||||
$dialog->ask($this->createStreamableInputInterfaceMock($this->getInputStream('')), $this->createOutputInterface(), new ChoiceQuestion('Choice', ['a', 'b']));
|
||||
@ -712,7 +712,7 @@ class QuestionHelperTest extends AbstractQuestionHelperTest
|
||||
|
||||
public function testAskThrowsExceptionOnMissingInputWithValidator()
|
||||
{
|
||||
$this->expectException('Symfony\Component\Console\Exception\RuntimeException');
|
||||
$this->expectException('Symfony\Component\Console\Exception\MissingInputException');
|
||||
$this->expectExceptionMessage('Aborted.');
|
||||
$dialog = new QuestionHelper();
|
||||
|
||||
|
@ -18,7 +18,8 @@ require $vendor.'/vendor/autoload.php';
|
||||
(new Application())
|
||||
->register('app')
|
||||
->setCode(function(InputInterface $input, OutputInterface $output) {
|
||||
$output->writeln((new QuestionHelper())->ask($input, $output, new Question('Foo?')));
|
||||
$output->writeln((new QuestionHelper())->ask($input, $output, new Question('Foo?', 'foo')));
|
||||
$output->writeln((new QuestionHelper())->ask($input, $output, new Question('Bar?', 'bar')));
|
||||
})
|
||||
->getApplication()
|
||||
->setDefaultCommand('app', true)
|
||||
@ -26,3 +27,4 @@ require $vendor.'/vendor/autoload.php';
|
||||
;
|
||||
--EXPECT--
|
||||
Foo?Hello World
|
||||
Bar?bar
|
||||
|
@ -192,7 +192,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="51">
|
||||
<source>No temporary folder was configured in php.ini.</source>
|
||||
<target>Ninguna carpeta temporal fue configurada en php.ini.</target>
|
||||
<target>Ninguna carpeta temporal fue configurada en php.ini o la carpeta configurada no existe.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="52">
|
||||
<source>Cannot write temporary file to disk.</source>
|
||||
|
@ -192,7 +192,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="51">
|
||||
<source>No temporary folder was configured in php.ini.</source>
|
||||
<target>Nie skonfigurowano folderu tymczasowego w php.ini, lub skonfigurowany folder nie istnieje.</target>
|
||||
<target>Nie skonfigurowano folderu tymczasowego w php.ini lub skonfigurowany folder nie istnieje.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="52">
|
||||
<source>Cannot write temporary file to disk.</source>
|
||||
|
Reference in New Issue
Block a user