Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[BrowserKit] Rename Client to Browser #30541

Merged
merged 1 commit into from Mar 12, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
6 changes: 6 additions & 0 deletions UPGRADE-4.3.md
Expand Up @@ -4,6 +4,7 @@ UPGRADE FROM 4.2 to 4.3
BrowserKit
----------

* Renamed `Client` to `AbstractBrowser`
* Marked `Response` final.
* Deprecated `Response::buildHeader()`
* Deprecated `Response::getStatus()`, use `Response::getStatusCode()` instead
Expand Down Expand Up @@ -51,6 +52,11 @@ HttpFoundation
* The `FileinfoMimeTypeGuesser` class has been deprecated,
use `Symfony\Component\Mime\FileinfoMimeTypeGuesser` instead.

HttpKernel
----------

* renamed `Client` to `HttpKernelBrowser`

Messenger
---------

Expand Down
2 changes: 2 additions & 0 deletions UPGRADE-5.0.md
Expand Up @@ -4,6 +4,7 @@ UPGRADE FROM 4.x to 5.0
BrowserKit
----------

* Removed `Client`, use `AbstractBrowser` instead
* Removed the possibility to extend `Response` by making it final.
* Removed `Response::buildHeader()`
* Removed `Response::getStatus()`, use `Response::getStatusCode()` instead
Expand Down Expand Up @@ -199,6 +200,7 @@ HttpFoundation
HttpKernel
----------

* Removed `Client`, use `HttpKernelBrowser` instead
* The `Kernel::getRootDir()` and the `kernel.root_dir` parameter have been removed
* The `KernelInterface::getName()` and the `kernel.name` parameter have been removed
* Removed the first and second constructor argument of `ConfigDataCollector`
Expand Down
1 change: 1 addition & 0 deletions src/Symfony/Bundle/FrameworkBundle/CHANGELOG.md
Expand Up @@ -4,6 +4,7 @@ CHANGELOG
4.3.0
-----

* renamed `Client` to `KernelBrowser`
* Not passing the project directory to the constructor of the `AssetsInstallCommand` is deprecated. This argument will
be mandatory in 5.0.
* Deprecated the "Psr\SimpleCache\CacheInterface" / "cache.app.simple" service, use "Symfony\Contracts\Cache\CacheInterface" / "cache.app" instead
Expand Down
192 changes: 2 additions & 190 deletions src/Symfony/Bundle/FrameworkBundle/Client.php
Expand Up @@ -11,196 +11,8 @@

namespace Symfony\Bundle\FrameworkBundle;

use Symfony\Component\BrowserKit\CookieJar;
use Symfony\Component\BrowserKit\History;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Client as BaseClient;
use Symfony\Component\HttpKernel\KernelInterface;
use Symfony\Component\HttpKernel\Profiler\Profile as HttpProfile;
@trigger_error(sprintf('The "%s" class is deprecated since Symfony 4.3, use "%s" instead.', Client::class, KernelBrowser::class), E_USER_DEPRECATED);

/**
* Client simulates a browser and makes requests to a Kernel object.
*
* @author Fabien Potencier <fabien@symfony.com>
*/
class Client extends BaseClient
class Client extends KernelBrowser
{
private $hasPerformedRequest = false;
private $profiler = false;
private $reboot = true;

/**
* {@inheritdoc}
*/
public function __construct(KernelInterface $kernel, array $server = [], History $history = null, CookieJar $cookieJar = null)
{
parent::__construct($kernel, $server, $history, $cookieJar);
}

/**
* Returns the container.
*
* @return ContainerInterface|null Returns null when the Kernel has been shutdown or not started yet
*/
public function getContainer()
{
return $this->kernel->getContainer();
}

/**
* Returns the kernel.
*
* @return KernelInterface
*/
public function getKernel()
{
return $this->kernel;
}

/**
* Gets the profile associated with the current Response.
*
* @return HttpProfile|false A Profile instance
*/
public function getProfile()
{
if (!$this->kernel->getContainer()->has('profiler')) {
return false;
}

return $this->kernel->getContainer()->get('profiler')->loadProfileFromResponse($this->response);
}

/**
* Enables the profiler for the very next request.
*
* If the profiler is not enabled, the call to this method does nothing.
*/
public function enableProfiler()
{
if ($this->kernel->getContainer()->has('profiler')) {
$this->profiler = true;
}
}

/**
* Disables kernel reboot between requests.
*
* By default, the Client reboots the Kernel for each request. This method
* allows to keep the same kernel across requests.
*/
public function disableReboot()
{
$this->reboot = false;
}

/**
* Enables kernel reboot between requests.
*/
public function enableReboot()
{
$this->reboot = true;
}

/**
* {@inheritdoc}
*
* @param Request $request A Request instance
*
* @return Response A Response instance
*/
protected function doRequest($request)
{
// avoid shutting down the Kernel if no request has been performed yet
// WebTestCase::createClient() boots the Kernel but do not handle a request
if ($this->hasPerformedRequest && $this->reboot) {
$this->kernel->shutdown();
} else {
$this->hasPerformedRequest = true;
}

if ($this->profiler) {
$this->profiler = false;

$this->kernel->boot();
$this->kernel->getContainer()->get('profiler')->enable();
}

return parent::doRequest($request);
}

/**
* {@inheritdoc}
*
* @param Request $request A Request instance
*
* @return Response A Response instance
*/
protected function doRequestInProcess($request)
{
$response = parent::doRequestInProcess($request);

$this->profiler = false;

return $response;
}

/**
* Returns the script to execute when the request must be insulated.
*
* It assumes that the autoloader is named 'autoload.php' and that it is
* stored in the same directory as the kernel (this is the case for the
* Symfony Standard Edition). If this is not your case, create your own
* client and override this method.
*
* @param Request $request A Request instance
*
* @return string The script content
*/
protected function getScript($request)
{
$kernel = var_export(serialize($this->kernel), true);
$request = var_export(serialize($request), true);
$errorReporting = error_reporting();

$requires = '';
foreach (get_declared_classes() as $class) {
if (0 === strpos($class, 'ComposerAutoloaderInit')) {
$r = new \ReflectionClass($class);
$file = \dirname(\dirname($r->getFileName())).'/autoload.php';
if (file_exists($file)) {
$requires .= 'require_once '.var_export($file, true).";\n";
}
}
}

if (!$requires) {
throw new \RuntimeException('Composer autoloader not found.');
}

$requires .= 'require_once '.var_export((new \ReflectionObject($this->kernel))->getFileName(), true).";\n";

$profilerCode = '';
if ($this->profiler) {
$profilerCode = '$kernel->getContainer()->get(\'profiler\')->enable();';
}

$code = <<<EOF
<?php

error_reporting($errorReporting);

$requires

\$kernel = unserialize($kernel);
\$kernel->boot();
$profilerCode

\$request = unserialize($request);
EOF;

return $code.$this->getHandleScript();
}
}
Expand Up @@ -22,7 +22,7 @@
use Symfony\Bundle\FrameworkBundle\Routing\AnnotatedRouteControllerLoader;
use Symfony\Bundle\FrameworkBundle\Routing\RedirectableUrlMatcher;
use Symfony\Bundle\FullStack;
use Symfony\Component\BrowserKit\Client;
use Symfony\Component\BrowserKit\AbstractBrowser;
use Symfony\Component\Cache\Adapter\AbstractAdapter;
use Symfony\Component\Cache\Adapter\AdapterInterface;
use Symfony\Component\Cache\Adapter\ArrayAdapter;
Expand Down Expand Up @@ -207,7 +207,7 @@ public function load(array $configs, ContainerBuilder $container)
if (!empty($config['test'])) {
$loader->load('test.xml');

if (!class_exists(Client::class)) {
if (!class_exists(AbstractBrowser::class)) {
$container->removeDefinition('test.client');
}
}
Expand Down