Преглед изворни кода

Deps update and fix deprecated stuff

Sullivan SENECHAL пре 9 година
родитељ
комит
b6588d10de
34 измењених фајлова са 594 додато и 343 уклоњено
  1. 2 0
      app/autoload.php
  2. 8 8
      app/config/config.yml
  3. 1 1
      app/config/security.yml
  4. 9 6
      app/console
  5. 17 8
      composer.json
  6. 331 167
      composer.lock
  7. 1 1
      phpunit.xml.dist
  8. 3 2
      src/Packagist/WebBundle/Controller/ExploreController.php
  9. 6 5
      src/Packagist/WebBundle/Controller/FeedController.php
  10. 14 5
      src/Packagist/WebBundle/Controller/PackageController.php
  11. 18 18
      src/Packagist/WebBundle/Controller/WebController.php
  12. 1 1
      src/Packagist/WebBundle/Entity/User.php
  13. 46 0
      src/Packagist/WebBundle/EventListener/RegistrationListener.php
  14. 0 27
      src/Packagist/WebBundle/Form/Handler/RegistrationFormHandler.php
  15. 4 3
      src/Packagist/WebBundle/Form/Type/AbandonedType.php
  16. 8 3
      src/Packagist/WebBundle/Form/Type/AddMaintainerRequestType.php
  17. 8 3
      src/Packagist/WebBundle/Form/Type/OAuthRegistrationFormType.php
  18. 8 4
      src/Packagist/WebBundle/Form/Type/OrderByType.php
  19. 8 3
      src/Packagist/WebBundle/Form/Type/PackageType.php
  20. 4 1
      src/Packagist/WebBundle/Form/Type/ProfileFormType.php
  21. 8 3
      src/Packagist/WebBundle/Form/Type/RemoveMaintainerRequestType.php
  22. 11 5
      src/Packagist/WebBundle/Form/Type/SearchQueryType.php
  23. 5 5
      src/Packagist/WebBundle/Menu/MenuBuilder.php
  24. 2 2
      src/Packagist/WebBundle/Model/PackageManager.php
  25. 26 34
      src/Packagist/WebBundle/Resources/config/services.yml
  26. 2 2
      src/Packagist/WebBundle/Resources/views/Package/abandon.html.twig
  27. 2 2
      src/Packagist/WebBundle/Resources/views/Package/edit.html.twig
  28. 2 2
      src/Packagist/WebBundle/Resources/views/Package/submitPackage.html.twig
  29. 10 4
      src/Packagist/WebBundle/Resources/views/Package/viewPackage.html.twig
  30. 2 3
      src/Packagist/WebBundle/Resources/views/Web/searchForm.html.twig
  31. 12 4
      src/Packagist/WebBundle/Security/Provider/UserProvider.php
  32. 5 5
      src/Packagist/WebBundle/Twig/PackagistExtension.php
  33. 5 3
      web/app.php
  34. 5 3
      web/app_dev.php

+ 2 - 0
app/autoload.php

@@ -2,6 +2,8 @@
 
 use Doctrine\Common\Annotations\AnnotationRegistry;
 
+error_reporting(error_reporting() & ~E_USER_DEPRECATED);
+
 if (!$loader = @include __DIR__.'/../vendor/autoload.php') {
 
     $message = <<< EOF

+ 8 - 8
app/config/config.yml

@@ -12,7 +12,9 @@ framework:
     csrf_protection: true
     validation:      { enable_annotations: true }
     translator:      { fallback: en }
-    templating:      { engines: ['twig'], assets_version: v=%assets_version% }
+    templating:      { engines: ['twig'] }
+    assets:
+        version: v=%assets_version%
     default_locale: %locale%
     session:
         name:            packagist
@@ -26,9 +28,8 @@ framework:
 
 # Twig Configuration
 twig:
-    form:
-        resources:
-           - 'PackagistWebBundle::forms.html.twig'
+    form_themes:
+        - 'PackagistWebBundle::forms.html.twig'
     debug:            %kernel.debug%
     strict_variables: %kernel.debug%
     globals:
@@ -44,6 +45,8 @@ doctrine:
         user:     %database_user%
         password: %database_password%
         charset:  UTF8
+        # See https://github.com/sonata-project/SonataAdminBundle/issues/3342
+        server_version: 5.6
     orm:
         auto_generate_proxy_classes: %kernel.debug%
         auto_mapping: true
@@ -73,15 +76,12 @@ fos_user:
     from_email:
         address:        %mailer_from_email%
         sender_name:    %mailer_from_name%
-    registration:
-        form:
-            handler: packagist.form.handler.registration
     profile:
         form:
             type:       packagist_user_profile
 
 hwi_oauth:
-    firewall_name: main
+    firewall_names: [main]
     connect:
         account_connector: packagist.user_provider
         registration_form_handler: packagist.oauth.registration_form_handler

+ 1 - 1
app/config/security.yml

@@ -19,7 +19,7 @@ security:
                 check_path:     /login_check
                 failure_path:   null
             remember_me:
-                key: %remember_me.secret%
+                secret: %remember_me.secret%
                 user_providers: packagist
                 name: pauth
                 always_remember_me: true

+ 9 - 6
app/console

@@ -1,6 +1,11 @@
 #!/usr/bin/env php
 <?php
 
+use Composer\Autoload\ClassLoader;
+use Symfony\Bundle\FrameworkBundle\Console\Application;
+use Symfony\Component\Console\Input\ArgvInput;
+use Symfony\Component\Debug\Debug;
+
 // if you don't want to setup permissions the proper way, just uncomment the following PHP line
 // read http://symfony.com/doc/current/book/installation.html#configuration-and-setup for more information
 //umask(0000);
@@ -9,12 +14,10 @@ ini_set('date.timezone', 'UTC');
 
 set_time_limit(0);
 
-require_once __DIR__.'/bootstrap.php.cache';
-require_once __DIR__.'/AppKernel.php';
-
-use Symfony\Bundle\FrameworkBundle\Console\Application;
-use Symfony\Component\Console\Input\ArgvInput;
-use Symfony\Component\Debug\Debug;
+/**
+ * @var ClassLoader
+ */
+$loader = require __DIR__.'/autoload.php';
 
 $input = new ArgvInput();
 $env = $input->getParameterOption(array('--env', '-e'), getenv('SYMFONY_ENV') ?: 'dev');

+ 17 - 8
composer.json

@@ -20,29 +20,30 @@
           "email": "contact@packagist.org"
     },
     "autoload": {
-        "psr-4": { "Packagist\\": "src/Packagist/" }
+        "psr-4": { "Packagist\\": "src/Packagist/" },
+        "classmap": [ "app/AppKernel.php", "app/AppCache.php" ]
     },
     "require": {
         "php": ">=5.5",
-        "symfony/symfony": "^2.7",
+        "symfony/symfony": "^2.8",
         "doctrine/orm": "^2.3",
         "doctrine/doctrine-bundle": "^1.2",
         "twig/extensions": "^1.0",
         "symfony/swiftmailer-bundle": "^2.3",
         "symfony/monolog-bundle": "^2.4",
-        "sensio/distribution-bundle": "^2.3",
-        "sensio/framework-extra-bundle": "^2.3",
-        "sensio/generator-bundle": "^2.3",
+        "sensio/distribution-bundle": "^5.0",
+        "sensio/framework-extra-bundle": "^3.0",
+        "sensio/generator-bundle": "^3.0",
         "jms/security-extra-bundle": "^1.5",
         "jms/di-extra-bundle": "^1.4",
 
         "composer/composer": "^1.0@dev",
-        "friendsofsymfony/user-bundle": "^1.0",
-        "hwi/oauth-bundle": "^0.4@dev",
+        "friendsofsymfony/user-bundle": "^2.0@dev",
+        "hwi/oauth-bundle": "^0.4",
         "nelmio/solarium-bundle": "^1.0",
         "nelmio/security-bundle": "^1.0",
         "predis/predis": "^1.0",
-        "snc/redis-bundle": "^1.1.9",
+        "snc/redis-bundle": "dev-master",
         "white-october/pagerfanta-bundle": "^1.0",
         "zendframework/zend-feed": "^2.0",
         "zendframework/zend-servicemanager": "^2.0",
@@ -52,6 +53,14 @@
         "knplabs/knp-menu-bundle": "^2.0",
         "ezyang/htmlpurifier": "^4.6"
     },
+    "require-dev": {
+        "symfony/phpunit-bridge": "^2.7 || ^3.0"
+    },
+    "conflict": {
+        "knplabs/knp-menu": "<=2.1.0"
+    },
+    "minimum-stability": "dev",
+    "prefer-stable": true,
     "scripts": {
         "post-install-cmd": [
             "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::buildBootstrap",

Разлика између датотеке није приказан због своје велике величине
+ 331 - 167
composer.lock


+ 1 - 1
phpunit.xml.dist

@@ -11,7 +11,7 @@
     processIsolation            = "false"
     stopOnFailure               = "false"
     syntaxCheck                 = "false"
-    bootstrap                   = "app/bootstrap.php.cache" >
+    bootstrap                   = "app/autoload.php" >
 
     <testsuites>
         <testsuite name="Packagist Test Suite">

+ 3 - 2
src/Packagist/WebBundle/Controller/ExploreController.php

@@ -23,6 +23,7 @@ use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
 use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
 use Symfony\Component\HttpFoundation\JsonResponse;
 use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
 
 /**
  * @Route("/explore")
@@ -121,7 +122,7 @@ class ExploreController extends Controller
 
             /** @var Package $package */
             foreach ($packages as $package) {
-                $url = $this->generateUrl('view_package', array('name' => $package->getName()), true);
+                $url = $this->generateUrl('view_package', array('name' => $package->getName()), UrlGeneratorInterface::ABSOLUTE_URL);
 
                 $result['packages'][] = array(
                     'name' => $package->getName(),
@@ -140,7 +141,7 @@ class ExploreController extends Controller
                 if ($perPage !== 15) {
                     $params['per_page'] = $perPage;
                 }
-                $result['next'] = $this->generateUrl('browse_popular', $params, true);
+                $result['next'] = $this->generateUrl('browse_popular', $params, UrlGeneratorInterface::ABSOLUTE_URL);
             }
 
             return new JsonResponse($result);

+ 6 - 5
src/Packagist/WebBundle/Controller/FeedController.php

@@ -22,6 +22,7 @@ use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
 use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
 use Symfony\Component\HttpFoundation\Request;
 use Symfony\Component\HttpFoundation\Response;
+use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
 use Zend\Feed\Writer\Entry;
 use Zend\Feed\Writer\Feed;
 
@@ -61,7 +62,7 @@ class FeedController extends Controller
             $req,
             'Newly Submitted Packages',
             'Latest packages submitted to Packagist.',
-            $this->generateUrl('browse', array(), true),
+            $this->generateUrl('browse', array(), UrlGeneratorInterface::ABSOLUTE_URL),
             $packages
         );
 
@@ -88,7 +89,7 @@ class FeedController extends Controller
             $req,
             'New Releases',
             'Latest releases of all packages.',
-            $this->generateUrl('browse', array(), true),
+            $this->generateUrl('browse', array(), UrlGeneratorInterface::ABSOLUTE_URL),
             $packages
         );
 
@@ -115,7 +116,7 @@ class FeedController extends Controller
             $req,
             "$vendor packages",
             "Latest packages updated on Packagist of $vendor.",
-            $this->generateUrl('view_vendor', array('vendor' => $vendor), true),
+            $this->generateUrl('view_vendor', array('vendor' => $vendor), UrlGeneratorInterface::ABSOLUTE_URL),
             $packages
         );
 
@@ -142,7 +143,7 @@ class FeedController extends Controller
             $req,
             "$package releases",
             "Latest releases on Packagist of $package.",
-            $this->generateUrl('view_package', array('name' => $package), true),
+            $this->generateUrl('view_package', array('name' => $package), UrlGeneratorInterface::ABSOLUTE_URL),
             $packages
         );
 
@@ -235,7 +236,7 @@ class FeedController extends Controller
             $this->generateUrl(
                 'view_package',
                 array('name' => $package->getName()),
-                true
+                UrlGeneratorInterface::ABSOLUTE_URL
             )
         );
         $entry->setId($package->getName());

+ 14 - 5
src/Packagist/WebBundle/Controller/PackageController.php

@@ -20,6 +20,7 @@ use Packagist\WebBundle\Form\Type\AddMaintainerRequestType;
 use Packagist\WebBundle\Form\Type\PackageType;
 use Packagist\WebBundle\Form\Type\RemoveMaintainerRequestType;
 use Predis\Connection\ConnectionException;
+use Symfony\Component\Form\Extension\Core\Type\TextType;
 use Symfony\Component\HttpFoundation\RedirectResponse;
 use Symfony\Component\HttpFoundation\Request;
 use Symfony\Component\HttpFoundation\JsonResponse;
@@ -105,7 +106,10 @@ class PackageController extends Controller
         $package = new Package;
         $package->setEntityRepository($this->getDoctrine()->getRepository('PackagistWebBundle:Package'));
         $package->setRouter($this->get('router'));
-        $form = $this->createForm(new PackageType(), $package);
+        $form = $this->createForm(PackageType::class, $package, [
+            'action' => $this->generateUrl('submit'),
+            'method' => 'POST',
+        ]);
         $user = $this->getUser();
         $package->addMaintainer($user);
 
@@ -762,7 +766,9 @@ class PackageController extends Controller
         }
 
         $form = $this->createFormBuilder($package, array("validation_groups" => array("Update")))
-            ->add("repository", "text")
+            ->add('repository', TextType::class)
+            ->setMethod('POST')
+            ->setAction($this->generateUrl('edit_package', ['name' => $package->getName()]))
             ->getForm();
 
         $form->handleRequest($req);
@@ -800,7 +806,7 @@ class PackageController extends Controller
             throw new AccessDeniedException;
         }
 
-        $form = $this->createForm(new AbandonedType());
+        $form = $this->createForm(AbandonedType::class);
         $form->handleRequest($request);
         if ($form->isValid()) {
             $package->setAbandoned(true);
@@ -1015,7 +1021,7 @@ class PackageController extends Controller
 
         if ($this->isGranted('ROLE_EDIT_PACKAGES') || $package->getMaintainers()->contains($user)) {
             $maintainerRequest = new MaintainerRequest();
-            return $this->createForm(new AddMaintainerRequestType(), $maintainerRequest);
+            return $this->createForm(AddMaintainerRequestType::class, $maintainerRequest, ['method' => 'POST']);
         }
     }
 
@@ -1027,7 +1033,10 @@ class PackageController extends Controller
 
         if ($this->isGranted('ROLE_EDIT_PACKAGES') || $package->getMaintainers()->contains($user)) {
             $maintainerRequest = new MaintainerRequest();
-            return $this->createForm(new RemoveMaintainerRequestType(), $maintainerRequest, array('package'=>$package));
+            return $this->createForm(RemoveMaintainerRequestType::class, $maintainerRequest, array(
+                'package' => $package,
+                'method'  => 'POST',
+            ));
         }
     }
 

+ 18 - 18
src/Packagist/WebBundle/Controller/WebController.php

@@ -21,6 +21,7 @@ use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
 use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
 use Symfony\Component\HttpFoundation\JsonResponse;
 use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
 
 /**
  * @author Jordi Boggiano <j.boggiano@seld.be>
@@ -38,16 +39,17 @@ class WebController extends Controller
 
     public function searchFormAction(Request $req)
     {
-        $form = $this->createForm(new SearchQueryType, new SearchQuery);
+        $form = $this->createForm(SearchQueryType::class, new SearchQuery(), [
+            'action' => $this->generateUrl('search.ajax'),
+            'method' => 'GET',
+        ]);
 
         $filteredOrderBys = $this->getFilteredOrderedBys($req);
         $normalizedOrderBys = $this->getNormalizedOrderBys($filteredOrderBys);
 
         $this->computeSearchQuery($req, $filteredOrderBys);
 
-        if ($req->query->has('search_query')) {
-            $form->submit($req);
-        }
+        $form->handleRequest($req);
 
         $orderBysViewModel = $this->getOrderBysViewModel($req, $normalizedOrderBys);
         return $this->render('PackagistWebBundle:Web:searchForm.html.twig', array(
@@ -62,7 +64,7 @@ class WebController extends Controller
      */
     public function searchAction(Request $req)
     {
-        $form = $this->createForm(new SearchQueryType, new SearchQuery);
+        $form = $this->createForm(SearchQueryType::class, new SearchQuery());
 
         $filteredOrderBys = $this->getFilteredOrderedBys($req);
         $normalizedOrderBys = $this->getNormalizedOrderBys($filteredOrderBys);
@@ -107,18 +109,16 @@ class WebController extends Controller
                 $select->addSorts($normalizedOrderBys);
             }
 
-            if ($req->query->has('search_query')) {
-                $form->submit($req);
+            $form->handleRequest($req);
 
-                if ($form->isValid()) {
-                    $escapedQuery = $select->getHelper()->escapeTerm($form->getData()->getQuery());
-                    $escapedQuery = preg_replace('/(^| )\\\\-(\S)/', '$1-$2', $escapedQuery);
-                    $escapedQuery = preg_replace('/(^| )\\\\\+(\S)/', '$1+$2', $escapedQuery);
-                    if ((substr_count($escapedQuery, '"') % 2) == 0) {
-                        $escapedQuery = str_replace('\\"', '"', $escapedQuery);
-                    }
-                    $select->setQuery($escapedQuery);
+            if ($form->isValid()) {
+                $escapedQuery = $select->getHelper()->escapeTerm($form->getData()->getQuery());
+                $escapedQuery = preg_replace('/(^| )\\\\-(\S)/', '$1-$2', $escapedQuery);
+                $escapedQuery = preg_replace('/(^| )\\\\\+(\S)/', '$1+$2', $escapedQuery);
+                if ((substr_count($escapedQuery, '"') % 2) == 0) {
+                    $escapedQuery = str_replace('\\"', '"', $escapedQuery);
                 }
+                $select->setQuery($escapedQuery);
             }
 
             $paginator = new Pagerfanta(new SolariumAdapter($solarium, $select));
@@ -162,9 +162,9 @@ class WebController extends Controller
 
                 foreach ($paginator as $package) {
                     if (ctype_digit((string) $package->id)) {
-                        $url = $this->generateUrl('view_package', array('name' => $package->name), true);
+                        $url = $this->generateUrl('view_package', array('name' => $package->name), UrlGeneratorInterface::ABSOLUTE_URL);
                     } else {
-                        $url = $this->generateUrl('view_providers', array('name' => $package->name), true);
+                        $url = $this->generateUrl('view_providers', array('name' => $package->name), UrlGeneratorInterface::ABSOLUTE_URL);
                     }
 
                     $row = array(
@@ -197,7 +197,7 @@ class WebController extends Controller
                     if ($perPage !== 15) {
                         $params['per_page'] = $perPage;
                     }
-                    $result['next'] = $this->generateUrl('search', $params, true);
+                    $result['next'] = $this->generateUrl('search', $params, UrlGeneratorInterface::ABSOLUTE_URL);
                 }
 
                 return JsonResponse::create($result)->setCallback($req->query->get('callback'));

+ 1 - 1
src/Packagist/WebBundle/Entity/User.php

@@ -14,7 +14,7 @@ namespace Packagist\WebBundle\Entity;
 
 use Doctrine\Common\Collections\ArrayCollection;
 use Doctrine\ORM\Mapping as ORM;
-use FOS\UserBundle\Entity\User as BaseUser;
+use FOS\UserBundle\Model\User as BaseUser;
 
 /**
  * @ORM\Entity(repositoryClass="Packagist\WebBundle\Entity\UserRepository")

+ 46 - 0
src/Packagist/WebBundle/EventListener/RegistrationListener.php

@@ -0,0 +1,46 @@
+<?php
+
+namespace Packagist\WebBundle\EventListener;
+
+use FOS\UserBundle\Event\FormEvent;
+use FOS\UserBundle\FOSUserEvents;
+use FOS\UserBundle\Util\TokenGenerator;
+use Packagist\WebBundle\Entity\User;
+use Symfony\Component\EventDispatcher\EventSubscriberInterface;
+
+/**
+ * @author Sullivan Senechal <soullivaneuh@gmail.com>
+ */
+class RegistrationListener implements EventSubscriberInterface
+{
+    /**
+     * @var TokenGenerator
+     */
+    private $tokenGenerator;
+
+    /**
+     * @param TokenGenerator $tokenGenerator
+     */
+    public function __construct(TokenGenerator $tokenGenerator)
+    {
+        $this->tokenGenerator = $tokenGenerator;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public static function getSubscribedEvents()
+    {
+        return [
+            FOSUserEvents::REGISTRATION_SUCCESS => 'onRegistrationSuccess'
+        ];
+    }
+
+    public function onRegistrationSuccess(FormEvent $event)
+    {
+        /** @var User $user */
+        $user = $event->getForm()->getData();
+        $apiToken = substr($this->tokenGenerator->generateToken(), 0, 20);
+        $user->setApiToken($apiToken);
+    }
+}

+ 0 - 27
src/Packagist/WebBundle/Form/Handler/RegistrationFormHandler.php

@@ -1,27 +0,0 @@
-<?php
-
-/*
- * This file is part of Packagist.
- *
- * (c) Jordi Boggiano <j.boggiano@seld.be>
- *     Nils Adermann <naderman@naderman.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Packagist\WebBundle\Form\Handler;
-
-use FOS\UserBundle\Form\Handler\RegistrationFormHandler as BaseHandler;
-use FOS\UserBundle\Model\UserInterface;
-
-class RegistrationFormHandler extends BaseHandler
-{
-    protected function onSuccess(UserInterface $user, $confirmation)
-    {
-        $apiToken = substr($this->tokenGenerator->generateToken(), 0, 20);
-        $user->setApiToken($apiToken);
-
-        parent::onSuccess($user, $confirmation);
-    }
-}

+ 4 - 3
src/Packagist/WebBundle/Form/Type/AbandonedType.php

@@ -13,6 +13,7 @@
 namespace Packagist\WebBundle\Form\Type;
 
 use Symfony\Component\Form\AbstractType;
+use Symfony\Component\Form\Extension\Core\Type\TextType;
 use Symfony\Component\Form\FormBuilderInterface;
 
 /**
@@ -32,7 +33,7 @@ class AbandonedType extends AbstractType
     {
         $builder->add(
             'replacement',
-            'text',
+            TextType::class,
             array(
                 'required' => false,
                 'label'    => 'Replacement package',
@@ -42,9 +43,9 @@ class AbandonedType extends AbstractType
     }
 
     /**
-     * @return string
+     * {@inheritdoc}
      */
-    public function getName()
+    public function getBlockPrefix()
     {
         return 'package';
     }

+ 8 - 3
src/Packagist/WebBundle/Form/Type/AddMaintainerRequestType.php

@@ -12,6 +12,8 @@
 
 namespace Packagist\WebBundle\Form\Type;
 
+use FOS\UserBundle\Form\Type\UsernameFormType;
+use Packagist\WebBundle\Form\Model\MaintainerRequest;
 use Symfony\Component\Form\AbstractType;
 use Symfony\Component\Form\FormBuilderInterface;
 use Symfony\Component\OptionsResolver\OptionsResolver;
@@ -23,17 +25,20 @@ class AddMaintainerRequestType extends AbstractType
 {
     public function buildForm(FormBuilderInterface $builder, array $options)
     {
-        $builder->add('user', 'fos_user_username');
+        $builder->add('user', UsernameFormType::class);
     }
 
     public function configureOptions(OptionsResolver $resolver)
     {
         $resolver->setDefaults(array(
-            'data_class' => 'Packagist\WebBundle\Form\Model\MaintainerRequest',
+            'data_class' => MaintainerRequest::class,
         ));
     }
 
-    public function getName()
+    /**
+     * {@inheritdoc}
+     */
+    public function getBlockPrefix()
     {
         return 'add_maintainer_form';
     }

+ 8 - 3
src/Packagist/WebBundle/Form/Type/OAuthRegistrationFormType.php

@@ -12,7 +12,9 @@
 
 namespace Packagist\WebBundle\Form\Type;
 
+use Packagist\WebBundle\Entity\User;
 use Symfony\Component\Form\AbstractType;
+use Symfony\Component\Form\Extension\Core\Type\EmailType;
 use Symfony\Component\Form\FormBuilderInterface;
 use Symfony\Component\OptionsResolver\OptionsResolver;
 
@@ -22,20 +24,23 @@ class OAuthRegistrationFormType extends AbstractType
     {
         $builder
             ->add('username', null, array('label' => 'form.username', 'translation_domain' => 'FOSUserBundle'))
-            ->add('email', 'email', array('label' => 'form.email', 'translation_domain' => 'FOSUserBundle'))
+            ->add('email', EmailType::class, array('label' => 'form.email', 'translation_domain' => 'FOSUserBundle'))
         ;
     }
 
     public function configureOptions(OptionsResolver $resolver)
     {
         $resolver->setDefaults(array(
-            'data_class' => 'Packagist\WebBundle\Entity\User',
+            'data_class' => User::class,
             'intention'  => 'registration',
             'validation_groups' => array('Default', 'Profile'),
         ));
     }
 
-    public function getName()
+    /**
+     * {@inheritdoc}
+     */
+    public function getBlockPrefix()
     {
         return 'packagist_oauth_user_registration';
     }

+ 8 - 4
src/Packagist/WebBundle/Form/Type/OrderByType.php

@@ -12,7 +12,9 @@
 
 namespace Packagist\WebBundle\Form\Type;
 
+use Packagist\WebBundle\Form\Model\OrderBy;
 use Symfony\Component\Form\AbstractType;
+use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
 use Symfony\Component\Form\FormBuilderInterface;
 use Symfony\Component\OptionsResolver\OptionsResolver;
 
@@ -24,7 +26,7 @@ class OrderByType extends AbstractType
     public function buildForm(FormBuilderInterface $builder, array $options)
     {
         $builder->add('sort');
-        $builder->add('order', 'choice', array(
+        $builder->add('order', ChoiceType::class, array(
             'choices' => array(
                 'asc' => 'asc',
                 'desc' => 'desc'
@@ -35,13 +37,15 @@ class OrderByType extends AbstractType
     public function configureOptions(OptionsResolver $resolver)
     {
         $resolver->setDefaults(array(
-            'data_class' => 'Packagist\WebBundle\Form\Model\OrderBy',
+            'data_class' => OrderBy::class,
             'csrf_protection' => false,
         ));
     }
 
-
-    public function getName()
+    /**
+     * {@inheritdoc}
+     */
+    public function getBlockPrefix()
     {
         return 'order_by';
     }

+ 8 - 3
src/Packagist/WebBundle/Form/Type/PackageType.php

@@ -12,7 +12,9 @@
 
 namespace Packagist\WebBundle\Form\Type;
 
+use Packagist\WebBundle\Entity\Package;
 use Symfony\Component\Form\AbstractType;
+use Symfony\Component\Form\Extension\Core\Type\TextType;
 use Symfony\Component\Form\FormBuilderInterface;
 use Symfony\Component\OptionsResolver\OptionsResolver;
 
@@ -23,7 +25,7 @@ class PackageType extends AbstractType
 {
     public function buildForm(FormBuilderInterface $builder, array $options)
     {
-        $builder->add('repository', 'text', array(
+        $builder->add('repository', TextType::class, array(
             'label' => 'Repository URL (Git/Svn/Hg)',
             'attr'  => array(
                 'placeholder' => 'i.e.: git://github.com/composer/composer.git',
@@ -34,11 +36,14 @@ class PackageType extends AbstractType
     public function configureOptions(OptionsResolver $resolver)
     {
         $resolver->setDefaults(array(
-            'data_class' => 'Packagist\WebBundle\Entity\Package',
+            'data_class' => Package::class,
         ));
     }
 
-    public function getName()
+    /**
+     * {@inheritdoc}
+     */
+    public function getBlockPrefix()
     {
         return 'package';
     }

+ 4 - 1
src/Packagist/WebBundle/Form/Type/ProfileFormType.php

@@ -29,7 +29,10 @@ class ProfileFormType extends BaseType
         ));
     }
 
-    public function getName()
+    /**
+     * {@inheritdoc}
+     */
+    public function getBlockPrefix()
     {
         return 'packagist_user_profile';
     }

+ 8 - 3
src/Packagist/WebBundle/Form/Type/RemoveMaintainerRequestType.php

@@ -15,6 +15,8 @@ namespace Packagist\WebBundle\Form\Type;
 use Doctrine\ORM\EntityRepository;
 use Packagist\WebBundle\Entity\Package;
 use Packagist\WebBundle\Entity\User;
+use Packagist\WebBundle\Form\Model\MaintainerRequest;
+use Symfony\Bridge\Doctrine\Form\Type\EntityType;
 use Symfony\Component\Form\AbstractType;
 use Symfony\Component\Form\FormBuilderInterface;
 use Symfony\Component\OptionsResolver\OptionsResolver;
@@ -26,7 +28,7 @@ class RemoveMaintainerRequestType extends AbstractType
 {
     public function buildForm(FormBuilderInterface $builder, array $options)
     {
-        $builder->add('user', 'entity', array(
+        $builder->add('user', EntityType::class, array(
             'class' => 'PackagistWebBundle:User',
             'query_builder' => function(EntityRepository $er) use ($options) {
                 return $er->getPackageMaintainersQueryBuilder($options['package'], $options['excludeUser']);
@@ -39,11 +41,14 @@ class RemoveMaintainerRequestType extends AbstractType
         $resolver->setRequired(array('package'));
         $resolver->setDefaults(array(
             'excludeUser' => null,
-            'data_class' => 'Packagist\WebBundle\Form\Model\MaintainerRequest'
+            'data_class' => MaintainerRequest::class
         ));
     }
 
-    public function getName()
+    /**
+     * {@inheritdoc}
+     */
+    public function getBlockPrefix()
     {
         return 'remove_maintainer_form';
     }

+ 11 - 5
src/Packagist/WebBundle/Form/Type/SearchQueryType.php

@@ -12,7 +12,10 @@
 
 namespace Packagist\WebBundle\Form\Type;
 
+use Packagist\WebBundle\Form\Model\SearchQuery;
 use Symfony\Component\Form\AbstractType;
+use Symfony\Component\Form\Extension\Core\Type\CollectionType;
+use Symfony\Component\Form\Extension\Core\Type\SearchType;
 use Symfony\Component\Form\FormBuilderInterface;
 use Symfony\Component\OptionsResolver\OptionsResolver;
 
@@ -23,9 +26,9 @@ class SearchQueryType extends AbstractType
 {
     public function buildForm(FormBuilderInterface $builder, array $options)
     {
-        $builder->add('query', 'search');
-        $builder->add('orderBys', 'collection', array(
-            'type' => new OrderByType(),
+        $builder->add('query', SearchType::class);
+        $builder->add('orderBys', CollectionType::class, array(
+            'entry_type' => OrderByType::class,
             'allow_add' => true,
             'allow_delete' => true,
             'prototype' => false,
@@ -35,12 +38,15 @@ class SearchQueryType extends AbstractType
     public function configureOptions(OptionsResolver $resolver)
     {
         $resolver->setDefaults(array(
-            'data_class' => 'Packagist\WebBundle\Form\Model\SearchQuery',
+            'data_class' => SearchQuery::class,
             'csrf_protection' => false,
         ));
     }
 
-    public function getName()
+    /**
+     * {@inheritdoc}
+     */
+    public function getBlockPrefix()
     {
         return 'search_query';
     }

+ 5 - 5
src/Packagist/WebBundle/Menu/MenuBuilder.php

@@ -11,15 +11,15 @@ class MenuBuilder
     private $username;
 
     /**
-     * @param FactoryInterface $factory
-     * @param TokenStorageInterface $securityContext
+     * @param FactoryInterface      $factory
+     * @param TokenStorageInterface $tokenStorage
      */
-    public function __construct(FactoryInterface $factory, TokenStorageInterface $securityContext)
+    public function __construct(FactoryInterface $factory, TokenStorageInterface $tokenStorage)
     {
         $this->factory = $factory;
 
-        if ($securityContext->getToken() && $securityContext->getToken()->getUser()) {
-            $this->username = $securityContext->getToken()->getUser()->getUsername();
+        if ($tokenStorage->getToken() && $tokenStorage->getToken()->getUser()) {
+            $this->username = $tokenStorage->getToken()->getUser()->getUsername();
         }
     }
 

+ 2 - 2
src/Packagist/WebBundle/Model/PackageManager.php

@@ -64,7 +64,7 @@ class PackageManager
                 try {
                     $this->mailer->send($message);
                 } catch (\Swift_TransportException $e) {
-                    $this->logger->err('['.get_class($e).'] '.$e->getMessage());
+                    $this->logger->error('['.get_class($e).'] '.$e->getMessage());
 
                     return false;
                 }
@@ -93,7 +93,7 @@ class PackageManager
         try {
             $this->mailer->send($message);
         } catch (\Swift_TransportException $e) {
-            $this->logger->err('['.get_class($e).'] '.$e->getMessage());
+            $this->logger->error('['.get_class($e).'] '.$e->getMessage());
 
             return false;
         }

+ 26 - 34
src/Packagist/WebBundle/Resources/config/services.yml

@@ -1,7 +1,7 @@
 services:
     packagist.twig.extension:
         class: Packagist\WebBundle\Twig\PackagistExtension
-        arguments: [ @doctrine ]
+        arguments: [ '@doctrine' ]
         tags:
             - { name: twig.extension }
 
@@ -15,43 +15,42 @@ services:
         tags:
             - { name: kernel.event_listener, event: kernel.response, method: onResponse }
 
+    packagist.registration_listener:
+        class: Packagist\WebBundle\EventListener\RegistrationListener
+        arguments: [ '@fos_user.util.token_generator' ]
+        tags:
+            - { name: kernel.event_subscriber }
+
     packagist.package_dumper:
         class: Packagist\WebBundle\Package\SymlinkDumper
-        arguments: [ @doctrine, @filesystem, @router, "%kernel.root_dir%/../web/", "%packagist_metadata_dir%", "%packagist_dumper_compress%" ]
+        arguments: [ '@doctrine', '@filesystem', '@router', "%kernel.root_dir%/../web/", "%packagist_metadata_dir%", "%packagist_dumper_compress%" ]
 
     packagist.user_provider:
         class: Packagist\WebBundle\Security\Provider\UserProvider
         public: false
-        arguments: ["@fos_user.user_manager"]
+        arguments: ["@fos_user.user_manager", "@fos_user.user_provider.username_email"]
 
     packagist.user_repository:
         class: Packagist\WebBundle\Entity\UserRepository
-        factory_service: doctrine
-        factory_method: getRepository
+        factory: ['@doctrine', getRepository]
         arguments: ["PackagistWebBundle:User"]
 
     packagist.package_repository:
         class: Packagist\WebBundle\Entity\PackageRepository
-        factory_service: doctrine
-        factory_method: getRepository
+        factory: ['@doctrine', getRepository]
         arguments: ["PackagistWebBundle:Package"]
 
     packagist.package_updater:
         class: Packagist\WebBundle\Package\Updater
-        arguments: [@doctrine]
-
-    packagist.form.handler.registration:
-        class: Packagist\WebBundle\Form\Handler\RegistrationFormHandler
-        parent: fos_user.registration.form.handler.default
-        scope: request
+        arguments: ['@doctrine']
 
     fos_user.util.user_manipulator:
         class: Packagist\WebBundle\Util\UserManipulator
-        arguments: [@fos_user.user_manager, @fos_user.util.token_generator]
+        arguments: ['@fos_user.user_manager', '@fos_user.util.token_generator']
 
     packagist.oauth.registration_form_handler:
         class: Packagist\WebBundle\Form\Handler\OAuthRegistrationFormHandler
-        arguments: [@fos_user.user_manager, @fos_user.util.token_generator]
+        arguments: ['@fos_user.user_manager', '@fos_user.util.token_generator']
 
     packagist.oauth.registration_form_type:
         class: Packagist\WebBundle\Form\Type\OAuthRegistrationFormType
@@ -59,8 +58,7 @@ services:
             - { name: form.type, alias: packagist_oauth_user_registration }
 
     packagist.oauth.registration_form:
-        factory_method: create
-        factory_service: form.factory
+        factory: ['@form.factory', create]
         class: Symfony\Component\Form\Form
         arguments:
             - 'packagist_oauth_user_registration'
@@ -68,22 +66,22 @@ services:
     packagist.download_manager:
         class: Packagist\WebBundle\Model\DownloadManager
         arguments:
-            - @snc_redis.default_client
+            - '@snc_redis.default_client'
 
     packagist.favorite_manager:
         class: Packagist\WebBundle\Model\FavoriteManager
         arguments:
-            - @snc_redis.default_client
-            - @packagist.package_repository
-            - @packagist.user_repository
+            - '@snc_redis.default_client'
+            - '@packagist.package_repository'
+            - '@packagist.user_repository'
 
     packagist.package_manager:
         class: Packagist\WebBundle\Model\PackageManager
         arguments:
-            - @doctrine.orm.entity_manager
-            - @mailer
-            - @twig
-            - @logger
+            - '@doctrine.orm.entity_manager'
+            - '@mailer'
+            - '@twig'
+            - '@logger'
             - { from: %mailer_from_email%, fromName: %mailer_from_name% }
 
     packagist.profile.form.type:
@@ -94,23 +92,17 @@ services:
 
     packagist.menu_builder:
         class: Packagist\WebBundle\Menu\MenuBuilder
-        arguments: [@knp_menu.factory, @security.token_storage]
+        arguments: ['@knp_menu.factory', '@security.token_storage']
 
     packagist.menu.user:
         class: Knp\Menu\MenuItem
-        factory_service: packagist.menu_builder
-        factory_method: createUserMenu
-        arguments: ["@request"]
-        scope: request
+        factory: ['@packagist.menu_builder', createUserMenu]
         tags:
             - { name: knp_menu.menu, alias: user_menu }
 
     packagist.menu.profile:
         class: Knp\Menu\MenuItem
-        factory_service: packagist.menu_builder
-        factory_method: createProfileMenu
-        arguments: ["@request"]
-        scope: request
+        factory: ['@packagist.menu_builder', createProfileMenu]
         tags:
             - { name: knp_menu.menu, alias: profile_menu }
 

+ 2 - 2
src/Packagist/WebBundle/Resources/views/Package/abandon.html.twig

@@ -8,11 +8,11 @@
 </h2>
 
 <section class="row">
-    <form method="post" {{ form_enctype(form) }} class="col-sm-6">
+    {{ form_start(form, { attr: { class: 'col-sm-6' } }) }}
         {{ form_widget(form) }}
 
         <input class="btn btn-block btn-default btn-lg" type="submit" value="Abandon Package" />
-    </form>
+    {{ form_end(form) }}
 
     <div class="col-sm-6">
         <p>You are about to mark this package as abandoned. This will alert users that this package will no longer be maintained.</p>

+ 2 - 2
src/Packagist/WebBundle/Resources/views/Package/edit.html.twig

@@ -8,10 +8,10 @@
 <h2 class="title">Edit {{ package.name }}</h2>
 
 <section class="row">
-    <form class="col-md-6" action="{{ path('edit_package', {'name': package.name}) }}" method="POST" {{ form_enctype(form) }}>
+    {{ form_start(form, { attr: { class: 'col-md-6' } }) }}
         {{ form_widget(form) }}
 
         <input class="btn btn-block btn-primary btn-lg" id="submit" type="submit" value="Update" />
-    </form>
+    {{ form_end(form) }}
 </section>
 {% endblock %}

+ 2 - 2
src/Packagist/WebBundle/Resources/views/Package/submitPackage.html.twig

@@ -10,13 +10,13 @@
 <h2 class="title">Submit package</h2>
 
 <section class="row">
-    <form class="col-md-6" id="submit-package-form" action="{{ path('submit') }}" data-check-url="{{ path('submit.fetch_info') }}" method="POST" {{ form_enctype(form) }}>
+    {{ form_start(form, { attr: { class: 'col-md-6', data-check-url: path('submit.fetch_info') } }) }}
         {{ form_widget(form) }}
 
         {{ form_rest(form) }}
 
         <input class="btn btn-block btn-success btn-lg" id="submit" type="submit" value="Submit" />
-    </form>
+    {{ form_end(form) }}
 
     <div class="col-md-6">
         <p>Please make sure you have read the package <a href="{{ path('about') }}#naming-your-package">naming conventions</a> before submitting your package. The authoritative name of your package will be taken from the composer.json file inside the master branch or trunk of your repository, and it can not be changed after that.</p>

+ 10 - 4
src/Packagist/WebBundle/Resources/views/Package/viewPackage.html.twig

@@ -165,7 +165,10 @@
             {% if addMaintainerForm is defined or removeMaintainerForm is defined %}
                 <div class="row">
                     {% if addMaintainerForm is defined %}
-                        <form id="add-maintainer-form" class="col-sm-6 col-md-3 col-md-offset-9 {{ show_add_maintainer_form|default(false) ? '': 'hidden' }}" action="{{ path('add_maintainer', {'name': package.name}) }}" method="POST" {{ form_enctype(addMaintainerForm) }}>
+                        {{ form_start(addMaintainerForm, {
+                            attr: { id: 'add-maintainer-form', class: 'col-sm-6 col-md-3 col-md-offset-9 ' ~ (show_add_maintainer_form|default(false) ? '': 'hidden') },
+                            action: path('add_maintainer', { 'name': package.name })
+                        }) }}
                             <div>
                                 <h4>Add Maintainer</h4>
                                 <p>
@@ -176,11 +179,14 @@
                                 {{ form_rest(addMaintainerForm) }}
                                 <input class="btn btn-block btn-success btn-lg" type="submit" value="Add Maintainer" />
                             </div>
-                        </form>
+                        {{ form_end(addMaintainerForm) }}
                     {% endif %}
 
                     {% if removeMaintainerForm is defined %}
-                        <form id="remove-maintainer-form" class="col-sm-6 col-md-3 col-md-offset-9 {{ show_remove_maintainer_form|default(false) ? '': 'hidden' }}" action="{{ path('remove_maintainer', {'name': package.name}) }}" method="POST" {{ form_enctype(removeMaintainerForm) }}>
+                        {{ form_start(removeMaintainerForm, {
+                            attr: { id: 'remove-maintainer-form', class: 'col-sm-6 col-md-3 col-md-offset-9 ' ~ (show_remove_maintainer_form|default(false) ? '': 'hidden') },
+                            action: path('remove_maintainer', { 'name': package.name })
+                        }) }}
                             <div>
                                 <h4>Remove Maintainer</h4>
                                 <p>
@@ -191,7 +197,7 @@
                                 {{ form_rest(removeMaintainerForm) }}
                                 <input class="btn btn-block btn-danger btn-lg" type="submit" value="Remove Maintainer" />
                             </div>
-                        </form>
+                        {{ form_end(removeMaintainerForm) }}
                     {% endif %}
                 </div>
             {% endif %}

+ 2 - 3
src/Packagist/WebBundle/Resources/views/Web/searchForm.html.twig

@@ -1,4 +1,4 @@
-<form id="search-form" action="{{ path('search.ajax') }}" method="GET" {{ form_enctype(searchForm) }} autocomplete="off">
+{{ form_start(searchForm, { attr: { id: 'search-form', autocomplete: 'off' } }) }}
     <div class="{% if orderBys is defined %}sortable{% endif %} row">
         <div class="hidden">{{ form_errors(searchForm.query) }}</div>
         <div class="{% if searchForm.vars.value.query is empty %}col-xs-12{% else %}col-xs-8{% endif %} js-search-field-wrapper col-md-9">
@@ -29,5 +29,4 @@
         </div>
         {{ form_rest(searchForm) }}
     </div>
-</form>
-
+{{ form_end(searchForm) }}

+ 12 - 4
src/Packagist/WebBundle/Security/Provider/UserProvider.php

@@ -13,6 +13,7 @@
 namespace Packagist\WebBundle\Security\Provider;
 
 use FOS\UserBundle\Model\UserManagerInterface;
+use FOS\UserBundle\Security\EmailUserProvider;
 use HWI\Bundle\OAuthBundle\OAuth\Response\UserResponseInterface;
 use HWI\Bundle\OAuthBundle\Security\Core\Exception\AccountNotLinkedException;
 use HWI\Bundle\OAuthBundle\Security\Core\User\OAuthAwareUserProviderInterface;
@@ -28,12 +29,19 @@ class UserProvider implements OAuthAwareUserProviderInterface, UserProviderInter
      */
     private $userManager;
 
+    /**
+     * @var EmailUserProvider
+     */
+    private $userProvider;
+
     /**
      * @param UserManagerInterface $userManager
+     * @param EmailUserProvider    $userProvider
      */
-    public function __construct(UserManagerInterface $userManager)
+    public function __construct(UserManagerInterface $userManager, EmailUserProvider $userProvider)
     {
         $this->userManager = $userManager;
+        $this->userProvider = $userProvider;
     }
 
     /**
@@ -88,7 +96,7 @@ class UserProvider implements OAuthAwareUserProviderInterface, UserProviderInter
      */
     public function loadUserByUsername($usernameOrEmail)
     {
-        $user = $this->userManager->findUserByUsernameOrEmail($usernameOrEmail);
+        $user = $this->userProvider->loadUserByUsername($usernameOrEmail);
 
         if (!$user) {
             throw new UsernameNotFoundException(sprintf('No user with name or email "%s" was found.', $usernameOrEmail));
@@ -102,7 +110,7 @@ class UserProvider implements OAuthAwareUserProviderInterface, UserProviderInter
      */
     public function refreshUser(UserInterface $user)
     {
-        return $this->userManager->refreshUser($user);
+        return $this->userProvider->refreshUser($user);
     }
 
     /**
@@ -110,6 +118,6 @@ class UserProvider implements OAuthAwareUserProviderInterface, UserProviderInter
      */
     public function supportsClass($class)
     {
-        return $this->userManager->supportsClass($class);
+        return $this->userProvider->supportsClass($class);
     }
 }

+ 5 - 5
src/Packagist/WebBundle/Twig/PackagistExtension.php

@@ -19,17 +19,17 @@ class PackagistExtension extends \Twig_Extension
     public function getTests()
     {
         return array(
-            'existing_package' => new \Twig_Test_Method($this, 'packageExistsTest'),
-            'existing_provider' => new \Twig_Test_Method($this, 'providerExistsTest'),
-            'numeric' => new \Twig_Test_Method($this, 'numericTest'),
+            new \Twig_SimpleTest('existing_package', [$this, 'packageExistsTest']),
+            new \Twig_SimpleTest('existing_provider', [$this, 'providerExistsTest']),
+            new \Twig_SimpleTest('numeric', [$this, 'numericTest']),
         );
     }
 
     public function getFilters()
     {
         return array(
-            'prettify_source_reference' => new \Twig_Filter_Method($this, 'prettifySourceReference'),
-            'gravatar_hash' => new \Twig_Filter_Method($this, 'generateGravatarHash')
+            new \Twig_SimpleFilter('prettify_source_reference', [$this, 'prettifySourceReference']),
+            new \Twig_SimpleFilter('gravatar_hash', [$this, 'generateGravatarHash'])
         );
     }
 

+ 5 - 3
web/app.php

@@ -5,7 +5,11 @@ ini_set('date.timezone', 'UTC');
 use Symfony\Component\ClassLoader\ApcClassLoader;
 use Symfony\Component\HttpFoundation\Request;
 
-$loader = include __DIR__.'/../app/bootstrap.php.cache';
+/**
+ * @var \Symfony\Component\ClassLoader\ClassLoader
+ */
+$loader = include __DIR__.'/../app/autoload.php';
+include_once __DIR__.'/../app/bootstrap.php.cache';
 
 // Use APC for autoloading to improve performance.
 if (function_exists('apc_store')) {
@@ -14,8 +18,6 @@ if (function_exists('apc_store')) {
     $apcLoader->register(true);
 }
 
-include __DIR__.'/../app/AppKernel.php';
-
 $kernel = new AppKernel('prod', false);
 $kernel->loadClassCache();
 $request = Request::createFromGlobals();

+ 5 - 3
web/app_dev.php

@@ -2,6 +2,7 @@
 
 ini_set('date.timezone', 'UTC');
 
+use Composer\Autoload\ClassLoader;
 use Symfony\Component\HttpFoundation\Request;
 use Symfony\Component\Debug\Debug;
 
@@ -19,11 +20,12 @@ if (isset($_SERVER['HTTP_CLIENT_IP'])
     exit('You are not allowed to access this file. Check '.basename(__FILE__).' for more information.');
 }
 
-$loader = require_once __DIR__.'/../app/bootstrap.php.cache';
+/**
+ * @var ClassLoader
+ */
+$loader = require_once __DIR__.'/../app/autoload.php';
 Debug::enable();
 
-require_once __DIR__.'/../app/AppKernel.php';
-
 $kernel = new AppKernel('dev', true);
 $kernel->loadClassCache();
 $request = Request::createFromGlobals();

Неке датотеке нису приказане због велике количине промена