1. Go to this page and download the library: Download shaggy8871/yurly library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
shaggy8871 / yurly example snippets
namespace Myapp\Controllers;
use Yurly\Core\Controller;
use Yurly\Inject\Request\Get;
use Yurly\Inject\Response\{Twig, Json};
class Index extends Controller
{
/**
* This is the home page
*/
public function routeDefault(Get $request, Twig $response): array
{
return [
'title' => 'Welcome to Yurly',
'content' => 'You\'re on the home page. You can customize this view in Myapp/Views/Index/default.html.twig.'
];
}
/**
* This is an example about us page
*/
public function routeAbout(Get $request, Twig $response): array
{
return [
'title' => 'About Us',
'content' => 'You can customize this page in <Yourapp>/Views/Index/about.html.twig.'
];
}
/**
* This is an example route with JSON response
*/
public function routeJson(Get $request, Json $response): array
{
return [
'title' => 'JSON',
'content' => 'This will be output in JSON format',
'params' => $request->toArray(), // be aware - unsanitised!
];
}
}
namespace Myapp\Controllers;
use Yurly\Core\Controller;
use Yurly\Inject\Request\RouteParams;
use Yurly\Inject\Response\Json;
class Example extends Controller
{
/**
* @canonical /example/:uest->
namespace Myapp\Controllers;
use Yurly\Core\Controller;
use Yurly\Inject\Request\Request;
use Yurly\Inject\Response\Json;
class Example extends Controller
{
public function routeDefault(Request $request, Json $response)
{
// GET parameters
$getParams = $request->get();
// POST parameters
$postParameters = $request->post();
/**
* You can access get/post parameters via:
* - $getParams->paramName
* - $postParams->paramName
*/
}
}
namespace Myapp\Middleware;
use Yurly\Core\{Url, Context};
trait Auth
{
public function isLoggedIn(Url $url, Context $context): ?string
{
$caller = $context->getCaller();
$annotations = $caller->getAnnotations();
// The @role docblock isn't icate(array $roles): bool
{
// Add your auth code here
}
}
namespace Myapp\Controllers;
use Yurly\Core\Controller;
use Yurly\Inject\Request\Get;
use Yurly\Inject\Response\Twig;
use Myapp\Middleware\Auth;
class Admin extends Controller
{
use Auth;
/**
* @before isLoggedIn
* @role admin
*/
public function routeDefault(Get $request, Twig $response): array
{
return [
'message' => 'Welcome!'
];
}
}
namespace Myapp\Controllers;
use Yurly\Core\Controller;
use Yurly\Inject\Response\Twig;
use Yurly\Middleware\MiddlewareState;
use Myapp\Models\User;
use Myapp\Models\AdminPermissions;
class Admin extends Controller
{
private $user;
private $permissions;
/**
* @before isLoggedIn, hasPermission
*/
public function routeDefault(Twig $response): array
{
return [
'user' => $this->user,
'permissions' => $this->permissions,
];
}
public function isLoggedIn(MiddlewareState $state): ?string
{
$this->user = User::getLoggedIn();
if (!($this->user instanceof User)) {
// Don't call hasPermission, go straight to login route
$state->stop();
return 'User::routeLogin';
}
return null;
}
public function hasPermission(MiddlewareState $state): ?string
{
$this->permissions = AdminPermissions::getPermissions($this->user);
if (empty($this->permissions)) {
// Go to access denied route
$state->stop();
return 'User::routeAccessDenied';
}
return null;
}
}
namespace Myapp\Models;
class User
{
public $fname;
public $lname;
//... more props
// Example find method
public static function findById(int $id): ?self
{
if ($id == 1) {
$instance = new static();
$instance->fname = 'First name';
$instance->lname = 'Last name';
return $instance;
}
return null;
}
}
namespace Myapp\Inject\Request;
use Yurly\Inject\Request\RouteParams;
use Myapp\Models\User;
class UserFinder extends RouteParams
{
public function find(): ?User
{
$userId = filter_var($this->id, FILTER_VALIDATE_INT);
if ($userId) {
return User::findById($userId);
}
return null;
}
}
namespace Myapp\Inject\Response;
use Yurly\Inject\Response\Json;
use Myapp\Models\User;
class UserJsonDataMapper extends Json
{
/**
* Render parameters with data mapping
*/
public function render($params = null): void
{
if ($params instanceof User) {
parent::render([
'first_name' => $params->fname,
'last_name' => $params->lname,
]);
return;
}
parent::render([
'error' => 'User Not Found'
]);
}
}
namespace Myapp\Controllers;
use Yurly\Core\Controller;
use Myapp\Inject\Request\UserFinder;
use Myapp\Inject\Response\UserJsonDataMapper;
use Myapp\Models\User as UserModel;
class User extends Controller
{
/**
* @canonical /user/:id
*/
public function routeDefault(UserFinder $request, UserJsonDataMapper $response): ?UserModel
{
return $request->find();
}
}
namespace Myapp;
use Yurly\Core\Project;
use DI\Container;
class Config
{
public function __construct(Project $project)
{
$container = new Container();
$project->addContainer($container);
}
}
class Index extends Controller
{
/**
* Yurly\Core\Project must always be the first parameter
*/
public function __construct(Project $project, \Myapp\Models\User $user)
{
// $user is instantiated and ready
parent::__construct($project);
}
public function routeWithDI(\Myapp\Models\User $user)
{
// $user is instantiated and ready
}
}
namespace Myapp;
use Yurly\Core\{Project, Url};
use Yurly\Core\Interfaces\RouteResolverInterface;
use Yurly\Core\Utils\RegExp;
class RouteResolver implements RouteResolverInterface
{
public function resolve(Project $project, Url $url)
{
$routes = [
[
'match' => new RegExp('/^\/[a-z0-9]+\/product\/[a-z0-9]+\/?$/'),
'route' => 'Products::routeSearch',
],
//... add your match/routes here
];
foreach($routes as $route) {
if ($route['match']->matches($url->requestUri)) {
return $route['route'];
}
}
}
}
Yurly\Core\{Project, Init};
$projects = [
new Project('www.site1.com', 'Site1', './src'),
new Project('www.site1.com', 'Site2', './src'),
];
$app = new Init($projects);
// Start 'em up
$app->run();
// Array of hosts per project:
$projects = [
new Project(['www.site1.com', 'dev.site1.com'], 'Site1', './src'),
new Project(['www.site2.com', 'dev.site2.com'], 'Site2', './src'),
];
use Yurly\Core\Utils\RegExp;
// RegExp helper class:
$projects = [
new Project(new RegExp('/^.*\.site1\.com$/'), 'Site1', './src'),
new Project(new RegExp('/^.*\.site2\.com$/'), 'Site2', './src'),
];
namespace Tests\Controllers;
use Yurly\Test\TestCase;
class ExampleTest extends TestCase
{
public function testRoute()
{
$response = $this
->setProjectNamespace('Myapp')
->setProjectPath('./src')
->setUrl('/')
->getRouteResponse();
$this->assertEquals($response, ['message' => 'Welcome!']);
}
}
namespace Tests\Controllers;
use Yurly\Test\TestCase;
class ExampleTest extends TestCase
{
public function testRoute()
{
$this->expectOutputString('<h1>Welcome to Yurly!</h1>');
$response = $this
->setProjectNamespace('Myapp')
->setProjectPath('./src')
->setUrl('/')
->callRoute();
}
}
namespace Tests\Controllers;
use Yurly\Test\TestCase;
use Yurly\Inject\Request\Get;
class ExampleTest extends TestCase
{
public function testRouteWithRequestMock()
{
$this
->setProjectNamespace('Myapp')
->setProjectPath('./src')
->setUrl('/');
$mockRequest = $this->getRequestMock(Get::class, function(Get $self) {
$self->setProps(['hello' => 'World']);
});
$response = $this
->getRouteResponse([
Get::class => $mockRequest
]);
$this->assertEquals($response, ['message' => 'World']);
}
}