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

0

У меня есть базовая структура, похожая на 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']);
}
}

Как видно из этого примера, было бы очень громоздкой задачей инициализировать класс прыщей на каждом контроллере. Как это делается правильно?

Теги:
model-view-controller
oop
inversion-of-control
pimple

2 ответа

3
Лучший ответ

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

Я хотел бы использовать 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);
  • 0
    Я знаю о прыщах. Но ты не ответил на мой вопрос. Потому что вы расширяете класс homeController, который, как вы можете видеть в моем примере, не расширяется. Я просто хочу иметь те же возможности, что и у symphone / laravel ... например. объявив класс http как use symfony\components\...\request затем используйте этот класс без использования нового ключевого слова.
  • 0
    Привет @Contax! Чтобы увеличить ваши шансы на получение качественных ответов, добавьте любой контент, например, требование не расширять ваш homeController в своем вопросе. То, что ваш пример ничего не расширяет, не означает, что это требование :) также, пожалуйста, прочитайте ссылку в этом ответе, большинство людей используют класс container в прыще пространства имен при использовании этой библиотеки
-2

Просто добавьте класс 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']);

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

  • 0
    Извините, но это не дает мне ответ, который мне нужен. Сначала вы расширяете HomeController, вся бизнес-логика выполняется вне контроллера. Итак, то, что я ищу, на самом деле наоборот.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню