Как интегрировать прыщ в пользовательские рамки MVC?

У меня есть базовый фреймворк, похожий на mvc, и я хотел бы использовать pimple для внедрения зависимости, но я не знаю, как использовать его внутри фреймворка. Это моя структура приложения.

x-framework
  - config
  - app
      controller
         homeController.php
  - core
  - vendor
     pimple
       lib
         pimple.php
  - public

Сейчас в homeController.php Я хотел бы использовать прыщ, но на самом деле не делая 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 на каждом контроллере. Как это сделать правильно?

2 ответа

Решение

Мой ответ не был актуален, хотя принцип абстрактных классов остается интересным. Сейчас:

Я хотел бы использовать 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конструктор

function __construct(\Pimple $app){
  $this->app = $app;

затем использовать его как свойство или переменную

$orm = $app['orm']; // through index() parameters
$orm = $this->app['orm']; // through constructor

абстрактные классы позволяют вам определять метод для каждого расширяющего класса или заставлять каждый расширяющий класс определять метод.

здесь мы определяем конструктор для каждого расширяющегося класса, печатая класс Pimple так, чтобы php гарантировал, что ваш контроллер получит реальный объект pimple

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']);

я надеюсь, что ты хочешь:) ура

Другие вопросы по тегам