/**
  * @Route("/{id}", methods="DELETE", requirements={"id"="\d+"})
  * @Request({"id": "int"}, csrf=true)
  */
 public function deleteAction($id)
 {
     if ($project = Project::find($id)) {
         if (!App::user()->hasAccess('portfolio: manage portfolio')) {
             return ['error' => __('Access denied.')];
         }
         $project->delete();
     }
     return ['message' => 'success'];
 }
 /**
  * @Route("/{id}", name="id")
  */
 public function projectAction($id = 0)
 {
     if (!($project = Project::where(['id = ?', 'date < ?'], [$id, new \DateTime()])->first())) {
         App::abort(404, __('Project not found.'));
     }
     $project->intro = App::content()->applyPlugins($project->intro, ['project' => $project, 'markdown' => $project->get('markdown')]);
     $project->content = App::content()->applyPlugins($project->content, ['project' => $project, 'markdown' => $project->get('markdown')]);
     $previous = Project::getPrevious($project);
     $next = Project::getNext($project);
     return ['$view' => ['title' => __($project->title), 'name' => 'bixie/portfolio/project.php'], 'portfolio' => $this->portfolio, 'config' => $this->portfolio->config(), 'previous' => $previous, 'next' => $next, 'project' => $project];
 }
 /**
  * {@inheritdoc}
  */
 public function generate(array $parameters = [])
 {
     $id = $parameters['id'];
     if (!isset($this->cacheEntries[$id])) {
         if (!($project = Project::where(compact('id'))->first())) {
             throw new RouteNotFoundException('Project not found.');
         }
         $this->addCache($project);
     }
     $meta = $this->cacheEntries[$id];
     $parameters['slug'] = $meta['slug'];
     unset($parameters['id']);
     return $parameters;
 }
 /**
  * @Route("/project/edit", name="project/edit")
  * @Access("portfolio: manage portfolio")
  * @Request({"id": "int"})
  */
 public function editAction($id = 0)
 {
     try {
         if (!($project = Project::where(compact('id'))->first())) {
             if ($id) {
                 App::abort(404, __('Invalid project id.'));
             }
             $module = App::module('bixie/portfolio');
             $project = Project::create(['data' => [], 'tags' => [], 'date' => new \DateTime()]);
             $project->set('markdown', $module->config('markdown'));
         }
         return ['$view' => ['title' => $id ? __('Edit Project') : __('Add Project'), 'name' => 'bixie/portfolio/admin/project.php'], '$data' => ['config' => App::module('bixie/portfolio')->config(), 'project' => $project, 'tags' => Project::allTags()], 'project' => $project];
     } catch (\Exception $e) {
         App::message()->error($e->getMessage());
         return App::redirect('@portfolio/post');
     }
 }
<?php

use Bixie\Portfolio\Model\Project;
return ['name' => 'bixie/portfolio-projects', 'label' => 'Portfolio projects', 'events' => ['view.scripts' => function ($event, $scripts) use($app) {
    $scripts->register('widget-portfolio-projects', 'bixie/portfolio:app/bundle/widget-portfolio-projects.js', ['~widgets']);
}], 'render' => function ($widget) use($app) {
    $query = Project::query()->where(['status' => Project::STATUS_PUBLISHED]);
    switch ($widget->get('content_selection', 'random')) {
        case 'random':
            $query->orderBy('RAND()');
            break;
        case 'latest':
            $query->orderBy('date', 'desc');
            break;
        case 'pick':
            $query->whereInSet('id', $widget->get('items', []));
            $query->orderBy('title', 'asc');
            break;
        default:
            return 'No valid content select';
            break;
    }
    $query->limit($widget->get('count', 4));
    $projects = array_values($query->get());
    $config = $app->module('bixie/portfolio')->config();
    $teaser_config = $widget->get('teaser');
    return $app['view']('bixie/portfolio/widgets/portfolio-projects.php', compact('widget', 'projects', 'config', 'teaser_config'));
}];