Создание новых поставщиков услуг в Silex - PullRequest
2 голосов
/ 25 января 2012

Я уже некоторое время пользуюсь Silex без каких-либо проблем.Я смог добавить новые сервисы, создать базовые сайты и т. Д. К сожалению, я застрял на создании нового сервиса с нуля ... Я не слишком уверен, что я делаю неправильно, и я решил подтолкнутьправильное направление было бы полезно прямо сейчас.

У меня есть такая базовая структура:

cache
resources
src
  -app.php
  -autoload.php
  -config.php
  -controllers.php
  -etc
vendor
  -assetic
  -Company
    -src
      -Postback.php <-- The classes I need to load
  -silex
  -etc
views
web

Итак, в app.php:

use SilexExtension\CompanyPostbackServiceProvider;

$app->register(new CompanyPostbackServiceProvider(), array(
    'company.class_path' => __DIR__ . '/../vendor/Company/src'
));

вsrc/autoload.php:

$loader->registerNamespaces(array(
    'Symfony'           => array(__DIR__.'/../vendor/silex/vendor', __DIR__.'/../vendor'),
    'Silex'             => __DIR__.'/../vendor/silex/src',
    'SilexExtension'    => __DIR__.'/../vendor/Silex-extentions/src',
    'Assetic'           => __DIR__.'/../vendor/assetic/src',
    'Company'           => __DIR__.'/../vendor/Company/src'
));

in silex/vendor/Silex-extensions/src/SilexExtension/CompanyPostbackServiceProvider.php:

namespace SilexExtension;

use Silex\Application;
use Silex\ServiceProviderInterface;

class CompanyPostbackServiceProvider implements ServiceProviderInterface
{
    public function register(Application $app)
    {
        if ( isset( $app['company.class_path'] ) )
        {
            $app['autoloader']->registerNamespace(
                'Company', $app['company.class_path']
            );
        }
    }
}

Я пробовал несколько вариантов этого, но вызов Postback из controller.php не приводит к обнаружению классов,и объявление методов класса CompanyPostbackServiceProvider приводит только к функции регистра, которая принадлежит Silex \ Application.

Есть идеи?Я знаю, что делаю что-то глупое, но по какой-то причине оно просто не щелкает.

Спасибо!

1 Ответ

5 голосов
/ 26 января 2012

Во-первых, вы дважды регистрируете пространство имен компании, которое может привести к ошибкам, а может и нет - лучше удалить избыточность в любом случае.

Во-вторых, не рекомендуется редактировать что-либо под вендорами, как вы добавили новый класс в Silex-Extensions. Я обычно помещаю свои связанные с приложением вещи в / app (bootstrap.php, config.php, appname.php) и классы, провайдеры в / src. В этом случае ваш провайдер входит в /src/Company/Provider/FooProvider.php.

В-третьих, все, что делает ваш провайдер, это регистрирует автозагрузку - вы можете сделать это в своей начальной загрузке просто отлично, нет причин создавать провайдера. Это необходимо, если вы создаете сервис - то есть вы проходите процесс создания экземпляра класса и присваивания его индексу в $app (смотрите практически любого провайдера, который поставляется с Silex).

И, наконец, вы спрашиваете, упоминаете ли вы, что пытаетесь использовать Postback в controllers.php, но этого недостаточно. Вы добавили оператор use для него?

...