Поскольку я пытаюсь написать модульные тесты в среде Fatfree с помощью phpunit, у меня возникла проблема с внедрением зависимостей. Я пытаюсь передать объект sql в конструктор вызывающего класса, чтобы заставить его работать, я настроил логику маршрутизации следующим образом:
routes.php
<?php
return array(
"/index/something" => array(
'class' => 'IndexController',
'action' => 'index',
'method' => 'GET',
'requireDependency'=> 0,
'mapper' => ''
),
"/@action/@name" => array (
'class' => "RandomController",
'action' => 'index',
'method' => 'GET',
'requireDependency'=> 1,
'mapper' => 'environment')
);
index.php
<?php
require('vendor/autoload.php');
// Retrieve instance of the framework
$f3=require('lib/base.php');
// Initialize
$f3->config('config/config.ini');
$configs = require 'config/routes.php';/**
* Dependency Injection for SQLMapper
*/
foreach ($configs as $url => $customParams) {
$f3->mset(
array(
'class' => $customParams['class'],
'action'=> $customParams['action'],
'mapper'=> $customParams['mapper'],
'requireDependency' => $customParams['requireDependency']
)
);$methodandUrl = $customParams['method']." ".$url;
$f3->route(
$methodandUrl,
function ($f3, $params) {
$sqlMapper = "";
$class = $f3->get('class');
$hasDependency = $f3->get('requireDependency');
if($hasDependency) {
$dependency = new DependencyController();
$sqlMapper = $dependency->returnSQLMapper($f3);
}
if(!empty($sqlMapper))
$object = new $class($f3, $sqlMapper);
else
$object = new $class($f3);
if(empty ($params['action']))
$action = $f3->get('action');
else
$action = $params['action'];
call_user_func(array($object, $action), $f3);
});
}
// Execute application
$f3->run();
IndexController.php
<?php
class IndexController {
protected $db = "";
public function index($f3) {
$view=new View;
echo $view->render('index.htm');
}
}
RandomController.php
class RandomController {
protected $className, $dp;
public function __construct($f3,$dependency) {
$this->className = $f3->get("PARAMS.name");
$this->dp = $dependency;
}
public function index($f3) {
$view=new View;
$f3->set('name', $this->className);
echo $view->render('template.htm');
}
}
Поэтому, когда я запускаю «index / что-то», он должен вызывать мою функцию индекса, однако он вызывает функцию индекса RandomController. Я не уверен, где я иду не так, кто-нибудь может мне помочь?
Обновить
Или есть какой-нибудь другой способ, которым я могу сделать внедрение зависимости?
Я выяснил проблему,
$f3->mset(
array(
'class' => $customParams['class'],
'action'=> $customParams['action'],
'mapper'=> $customParams['mapper'],
'requireDependency' => $customParams['requireDependency']
)
);
поскольку я устанавливал это в цикле, он всегда вызывал последний маршрут, так как раньше переписывал предыдущий. Так что я переместил это из цикла, как показано ниже
$f3->set('url', $configs);
Это будет содержать весь route.php, а также изменен
$urls = $f3->get('url');
foreach($urls as $url => $config){
if($f3->build($url) == $params[0]){
$f3->mset(array(
'class' => $config['class'],
'action' => $config['action'],
'requireDependency' => $config['requireDependency'],
'mapper' => $config['mapper']
));
break;
}
}
Так что не класс точно отображается на введенный URL.
Других решений пока нет …