introducing OCP\AppFramework\App

This commit is contained in:
Thomas Müller 2013-08-21 01:02:15 +02:00
parent 911bd3c16f
commit 38f9df4293
6 changed files with 348 additions and 3 deletions

View File

@ -25,6 +25,7 @@
namespace OC\AppFramework; namespace OC\AppFramework;
use OC\AppFramework\DependencyInjection\DIContainer; use OC\AppFramework\DependencyInjection\DIContainer;
use OCP\AppFramework\IAppContainer;
/** /**
@ -45,7 +46,7 @@ class App {
* @param DIContainer $container an instance of a pimple container. * @param DIContainer $container an instance of a pimple container.
*/ */
public static function main($controllerName, $methodName, array $urlParams, public static function main($controllerName, $methodName, array $urlParams,
DIContainer $container) { IAppContainer $container) {
$container['urlParams'] = $urlParams; $container['urlParams'] = $urlParams;
$controller = $container[$controllerName]; $controller = $container[$controllerName];

View File

@ -23,6 +23,7 @@
namespace OC\AppFramework\Core; namespace OC\AppFramework\Core;
use OCP\AppFramework\IApi;
/** /**
@ -32,7 +33,7 @@ namespace OC\AppFramework\Core;
* Should you find yourself in need for more methods, simply inherit from this * Should you find yourself in need for more methods, simply inherit from this
* class and add your methods * class and add your methods
*/ */
class API { class API implements IApi{
private $appName; private $appName;

View File

@ -32,9 +32,11 @@ use OC\AppFramework\Middleware\MiddlewareDispatcher;
use OC\AppFramework\Middleware\Security\SecurityMiddleware; use OC\AppFramework\Middleware\Security\SecurityMiddleware;
use OC\AppFramework\Utility\SimpleContainer; use OC\AppFramework\Utility\SimpleContainer;
use OC\AppFramework\Utility\TimeFactory; use OC\AppFramework\Utility\TimeFactory;
use OCP\AppFramework\IApi;
use OCP\AppFramework\IAppContainer;
class DIContainer extends SimpleContainer { class DIContainer extends SimpleContainer implements IAppContainer{
/** /**
@ -45,6 +47,8 @@ class DIContainer extends SimpleContainer {
$this['AppName'] = $appName; $this['AppName'] = $appName;
$this->registerParameter('ServerContainer', \OC::$server);
$this['API'] = $this->share(function($c){ $this['API'] = $this->share(function($c){
return new API($c['AppName']); return new API($c['AppName']);
}); });
@ -119,4 +123,19 @@ class DIContainer extends SimpleContainer {
} }
/**
* @return IApi
*/
function getCoreApi()
{
return $this->query('API');
}
/**
* @return \OCP\Core\IServerContainer
*/
function getServer()
{
return $this->query('ServerContainer');
}
} }

View File

@ -0,0 +1,61 @@
<?php
namespace OCP\AppFramework;
/**
* Class App
* @package OCP\AppFramework
*
* Any application must inherit this call - all controller instances to be used are
* to be registered using IContainer::registerService
*/
class App {
public function __construct($appName) {
$this->container = new \OC\AppFramework\DependencyInjection\DIContainer($appName);
}
private $container;
/**
* @return IAppContainer
*/
public function getContainer() {
return $this->container;
}
/**
* This function is called by the routing component to fire up the frameworks dispatch mechanism.
*
* Example code in routes.php of the task app:
* $this->create('tasks_index', '/')->get()->action(
* function($params){
* $app = new TaskApp();
* $app->dispatch('PageController', 'index', $params);
* }
* );
*
*
* Example for for TaskApp implementation:
* class TaskApp extends \OCP\AppFramework\App {
*
* public function __construct(){
* parent::__construct('tasks');
*
* $this->getContainer()->registerService('PageController', function(IAppContainer $c){
* $a = $c->query('API');
* $r = $c->query('Request');
* return new PageController($a, $r);
* });
* }
* }
*
* @param string $controllerName the name of the controller under which it is
* stored in the DI container
* @param string $methodName the method that you want to call
* @param array $urlParams an array with variables extracted from the routes
*/
public function dispatch($controllerName, $methodName, array $urlParams) {
\OC\AppFramework\App::main($controllerName, $methodName, $urlParams, $this->container);
}
}

View File

@ -0,0 +1,238 @@
<?php
/**
* ownCloud - App Framework
*
* @author Bernhard Posselt
* @copyright 2012 Bernhard Posselt nukeawhale@gmail.com
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
* License as published by the Free Software Foundation; either
* version 3 of the License, or any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
*
* You should have received a copy of the GNU Affero General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
*/
namespace OCP\AppFramework;
/**
* A few very basic and frequently used API functions are combined in here
*/
interface IApi {
/**
* used to return the appname of the set application
* @return string the name of your application
*/
function getAppName();
/**
* Creates a new navigation entry
* @param array $entry containing: id, name, order, icon and href key
*/
function addNavigationEntry(array $entry);
/**
* Gets the userid of the current user
* @return string the user id of the current user
*/
function getUserId();
/**
* Sets the current navigation entry to the currently running app
*/
function activateNavigationEntry();
/**
* Adds a new javascript file
* @param string $scriptName the name of the javascript in js/ without the suffix
* @param string $appName the name of the app, defaults to the current one
*/
function addScript($scriptName, $appName = null);
/**
* Adds a new css file
* @param string $styleName the name of the css file in css/without the suffix
* @param string $appName the name of the app, defaults to the current one
*/
function addStyle($styleName, $appName = null);
/**
* shorthand for addScript for files in the 3rdparty directory
* @param string $name the name of the file without the suffix
*/
function add3rdPartyScript($name);
/**
* shorthand for addStyle for files in the 3rdparty directory
* @param string $name the name of the file without the suffix
*/
function add3rdPartyStyle($name);
/**
* Looks up a system-wide defined value
* @param string $key the key of the value, under which it was saved
* @return string the saved value
*/
function getSystemValue($key);
/**
* Sets a new system-wide value
* @param string $key the key of the value, under which will be saved
* @param string $value the value that should be stored
*/
function setSystemValue($key, $value);
/**
* Looks up an app-specific defined value
* @param string $key the key of the value, under which it was saved
* @return string the saved value
*/
function getAppValue($key, $appName = null);
/**
* Writes a new app-specific value
* @param string $key the key of the value, under which will be saved
* @param string $value the value that should be stored
*/
function setAppValue($key, $value, $appName = null);
/**
* Shortcut for setting a user defined value
* @param string $key the key under which the value is being stored
* @param string $value the value that you want to store
* @param string $userId the userId of the user that we want to store the value under, defaults to the current one
*/
function setUserValue($key, $value, $userId = null);
/**
* Shortcut for getting a user defined value
* @param string $key the key under which the value is being stored
* @param string $userId the userId of the user that we want to store the value under, defaults to the current one
*/
function getUserValue($key, $userId = null);
/**
* Returns the translation object
* @return \OC_L10N the translation object
*
* FIXME: returns private object / should be retrieved from teh ServerContainer
*/
function getTrans();
/**
* Used to abstract the owncloud database access away
* @param string $sql the sql query with ? placeholder for params
* @param int $limit the maximum number of rows
* @param int $offset from which row we want to start
* @return \OCP\DB a query object
*
* FIXME: returns non public interface / object
*/
function prepareQuery($sql, $limit=null, $offset=null);
/**
* Used to get the id of the just inserted element
* @param string $tableName the name of the table where we inserted the item
* @return int the id of the inserted element
*
* FIXME: move to db object
*/
function getInsertId($tableName);
/**
* Returns the URL for a route
* @param string $routeName the name of the route
* @param array $arguments an array with arguments which will be filled into the url
* @return string the url
*/
function linkToRoute($routeName, $arguments=array());
/**
* Returns an URL for an image or file
* @param string $file the name of the file
* @param string $appName the name of the app, defaults to the current one
*/
function linkTo($file, $appName=null);
/**
* Returns the link to an image, like link to but only with prepending img/
* @param string $file the name of the file
* @param string $appName the name of the app, defaults to the current one
*/
function imagePath($file, $appName = null);
/**
* Makes an URL absolute
* @param string $url the url
* @return string the absolute url
*
* FIXME: function should live in Request / Response
*/
function getAbsoluteURL($url);
/**
* links to a file
* @param string $file the name of the file
* @param string $appName the name of the app, defaults to the current one
* @deprecated replaced with linkToRoute()
* @return string the url
*/
function linkToAbsolute($file, $appName = null);
/**
* Checks if an app is enabled
* @param string $appName the name of an app
* @return bool true if app is enabled
*/
public function isAppEnabled($appName);
/**
* Writes a function into the error log
* @param string $msg the error message to be logged
* @param int $level the error level
*
* FIXME: add logger instance to ServerContainer
*/
function log($msg, $level = null);
/**
* Returns a template
* @param string $templateName the name of the template
* @param string $renderAs how it should be rendered
* @param string $appName the name of the app
* @return \OCP\Template a new template
*/
function getTemplate($templateName, $renderAs='user', $appName=null);
}

View File

@ -0,0 +1,25 @@
<?php
namespace OCP\AppFramework;
use OCP\AppFramework\IApi;
use OCP\Core\IContainer;
/**
* Class IAppContainer
* @package OCP\AppFramework
*
* This container interface provides short cuts for app developers to access predefined app service.
*/
interface IAppContainer extends IContainer{
/**
* @return IApi
*/
function getCoreApi();
/**
* @return \OCP\Core\IServerContainer
*/
function getServer();
}