У меня есть базовая структура, похожая на mvc, и я бы хотел использовать прыщ для инъекции зависимостей, но я не знаю, как использовать его внутри рамки. Это моя структура приложения.
x-framework
- config
- app
controller
homeController.php
- core
- vendor
pimple
lib
pimple.php
- public
Теперь, в homeController.php
я хотел бы использовать Pimple, но без фактического выполнения new Pimple
как показано в этом примере.
use vendor\pimple;
class homeController
{
function index(){
$app = new Pimple();
$app['orm'] = $app->share({ return new vendor\orm; });
$orm = $app['orm'];
$orm->table('foo');
$orm->findFirst(['name'=>'john']);
}
}
Как видно из этого примера, было бы очень громоздкой задачей инициализировать класс прыщей на каждом контроллере. Как это делается правильно?
Мой ответ не был уместным, хотя принцип абстрактных классов остается интересным. Теперь:
Я хотел бы использовать Pimple, но без фактического выполнения нового Pimple, как показано в этом примере.
В какой-то момент вам нужно создать экземпляр объекта, если вы хотите его использовать.
Pimple использует контейнер для хранения и извлечения услуг и параметров:
$container = new \Pimple\Container();
// define some services
$container['session_storage'] = function ($c) {
return new SessionStorage('SESSION_ID');
};
этот пример из документа определяет анонимную функцию, которая возвращает объект хранения сеанса
Прыщи или любой контейнер могут быть доступны с использованием шаблона инъекции зависимостей.
либо передать его как параметр в индекс
function index(\Pimple $app){
или передать его homeController
constructor
function __construct(\Pimple $app){
$this->app = $app;
затем используйте его как свойство или переменную
$orm = $app['orm']; // through index() parameters
$orm = $this->app['orm']; // through constructor
абстрактные классы позволяют определить метод для всех расширяющихся классов или заставить все расширяющиеся классы определять метод.
здесь мы определяем конструктор для каждого расширяющегося класса, typehinting класс Pimple, так что php будет гарантировать, что ваш контроллер получит реальный объект прыща
abstract class Pimpleized {
function __construct(\Pimple $pimple) {
$this->app = $pimple;
}
}
тогда ваш контроллер
class homeController extends Pimpleized {
function foo() {
$this->app->accessSomePimpleMethod();
}
}
Таким образом, вам нужно только создать объект Pimple
один раз, а затем передать его вашим контроллерам:
$pimp = new Pimple();
$controller = new homeController($pimp);
Просто добавьте класс HomeController с прыщами
class HomeController extends Pimple {
public function __construct() {
$this['orm.class']= 'vendor\orm';
$this['orm'] = $this->share(function($c){ return new $c['orm.class']; });
}
}
//and use it directly just after instanciation
$controller = new HomeController();
// you can modify parameters if you need
$controller['orm.class'] = 'myothervendor\orm';
//And get class
$orm = $controller['orm'];
$orm->table('foo');
$orm->findFirst(['name'=>'john']);
я надеюсь, что ты хочешь :) приветствия
use symfony\components\...\request
затем используйте этот класс без использования нового ключевого слова.container
в прыще пространства имен при использовании этой библиотеки