Jump to content

Help implementing Slim


NotionCommotion

Recommended Posts

How can I get rid of the Factory class and instead put in in closure, and shorten $this->get('Factory')->get('Accounts')->read()) to something like $this->factory('Accounts')->read())?

 

Also, please provide constructive criticism of the below code other than my preliminary user authentication and logoff.

 

Thank you

<?php 
namespace Administrator;


session_start();
use \Psr\Http\Message\ServerRequestInterface as Request;
use \Psr\Http\Message\ResponseInterface as Response;


spl_autoload_register(function ($classname) {
    $parts = explode('\\', $classname);
    require __DIR__."/../src/classes/".end($parts).".php";
});
require __DIR__.'/../vendor/autoload.php';


$app = new \Slim\App([
    'settings' => [
        'displayErrorDetails' => true, // set to false in production
        'addContentLengthHeader' => false, // Allow the web server to send the content-length header
        'determineRouteBeforeAppMiddleware' => true,
        'config' => parse_ini_file(__DIR__.'/../config.ini',true),
    ],
]);


$c = $app->getContainer();
$c['pdo'] = function ($c) {
    $db = $c->get('settings')['config']['db'];
    return new \PDO("mysql:host={$db['host']};dbname={$db['dbname']};charset={$db['charset']}",$db['username'],$db['password'],array(\PDO::ATTR_EMULATE_PREPARES=>false,\PDO::MYSQL_ATTR_USE_BUFFERED_QUERY=>true,\PDO::ATTR_ERRMODE=>\PDO::ERRMODE_EXCEPTION,\PDO::ATTR_DEFAULT_FETCH_MODE=>\PDO::FETCH_OBJ)); 
};
$c['logger'] = function ($c) {
    $l = $c->get('settings')['config']['logger'];
    $logger = new \Monolog\Logger($l['name']);
    $logger->pushProcessor(new \Monolog\Processor\UidProcessor());
    $logger->pushHandler(new \Monolog\Handler\StreamHandler($l['path'], \Monolog\Logger::DEBUG));
    return $logger;
};
$c['view'] = function ($c) {
    $view = new \Slim\Views\Twig(__DIR__.'/../src/templates', [
        //'cache' => 'path/to/cache'    // See auto_reload option
        'debug' => true,
        'strict_variables'=> true
    ]);
    $view->addExtension(new \Slim\Views\TwigExtension(
        $c['router'],
        $c['request']->getUri()
    ));
    $view->addExtension(new \Twig_Extension_Debug());
    return $view;
};
$c['Factory'] = function($c) {
    return new Factory($c->get('pdo'),$c->get('logger'));
};


$app->get('/accounts', function (Request $request, Response $response) {
    return $this->view->render($response, 'accounts.html', $this->get('Factory')->get('Accounts')->read());
});
$app->get('/', function (Request $request, Response $response) {
    return $this->view->render($response, 'accounts.html', $this->get('Factory')->get('Accounts')->read());
});


$app->get('/logoff', function (Request $request, Response $response) {
    unset($_SESSION['auth']);
    return $this->view->render($response, 'logon.html');
});


$app->add(function(Request $request, Response $response, $next) {


    if(isset($_SESSION['auth'])) {
        return $next($request, $response);
    }
    else {
        //Obviously improve
        $post=$request->getParsedBody();
        $db=[
            'Michael'=>'michael',
            'nextUser'=>'nextPassword'
        ];
        if(isset($post['username'],$post['password'],$db[$post['username']]) && $db[$post['username']]==$post['password'])  {
            $_SESSION['auth']=true;
            return $this->view->render($response, 'accounts.html', $this->get('Factory')->get('Accounts')->read());
        }
        else {
            return $this->view->render($response, 'logon.html');
        }
    }
});


$app->run();
<?php
namespace Administrator;
class Factory
{
    protected $pdo, $logger;


    public function __construct($pdo, $logger)
    {
        $this->pdo=$pdo;
        $this->logger=$logger;
    }


    public function get($class)
    {
        $class='\Administrator\\'.$class;
        return new $class($this->pdo, $this->logger);
    }
}

 

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.