webkid/cms
Composer 安装命令:
composer require webkid/cms
包简介
Easy to use and light weight cms based on Laravel 5.5
README 文档
README
composer require webkid/cms
Implement Webkid\Cms\Models\Roleable trait to User model
Copy assets to your public folder
php artisan vendor:publish
Run migrations
php artisan migrate
Add role_id to fillable array of User model
protected $fillable = [ 'name', 'email', 'password', 'role_id' ];
Go to public/vendor/cms folder and run
bower install
Optional
Generate admin user via console
php artisan cms:admin:create
To use multi lang add Language middleware to web group
'web' => [ ... \Webkid\Cms\Middleware\Language::class ],
Add exception cookie lang to App\Http\Middleware\EncryptCookies\
protected $except = [ 'lang' ];
Add language switcher to your website.
Be sure that languages are in your config/langs.php
<ul> <li><a href="/setLang/ua">ua</a></li> <li><a href="/setLang/ru">ru</a></li> <li><a href="/setLang/en">en</a></li> </ul>
Example of controller
public function home() { $page = $this->landingPageRepository->getByToken('home'); if(!$page) abort(404); $fields = $this->landingPageRepository->transformPage($page); $files = $page->files; $seo_title = $this->getSeoAttributeFromFields($fields, 'seo_title'); $seo_description = $this->getSeoAttributeFromFields($fields, 'seo_description'); $sliderCollection = $this->landingPageRepository->getByTokenAndSection('home', 'home_slider'); $sliderItems = $this->landingPageRepository->getFullInfoFromCollectionOfPages($sliderCollection->toArray()); $settings = $this->settings; $fields['video_id'] = false; if(isset($fields['video_url'])) { $fields['video_id'] = $this->get_youtube_video_id($fields['video_url']); } return view('pages/home', compact('fields', 'files', 'sliderItems') + compact('seo_title', 'seo_description', 'settings')); }
Example of dashboard extension
<?php namespace App\Http\Controllers\Api\Dashboard; use App\File; use App\Http\Controllers\ControllerTraits\ApiTrait; use App\__SAMPLE__Recipe as Recipe; use App\Repositories\__SAMPLE__RecipeRepository as RecipeRepository; use App\Services\Transformer\__SAMPLE__RecipeTransformer as RecipeTransformer; use App\Traits\FileSaver; use App\Traits\Paginatable; use Illuminate\Http\Request; use App\Http\Requests; use App\Http\Controllers\Controller; /** * Class RecipesController * * @package App\Http\Controllers\Api\Dashboard */ class __SAMPLE__RecipesController extends Controller { use ApiTrait, FileSaver, Paginatable; /** * @var RecipeRepository */ private $recipeRepository; /** * @var RecipeTransformer */ private $recipeTransformer; /** * RecipesController constructor. * * @param RecipeRepository $recipeRepository * @param RecipeTransformer $recipeTransformer */ public function __construct(RecipeRepository $recipeRepository, RecipeTransformer $recipeTransformer) { $this->recipeRepository = $recipeRepository; $this->recipeTransformer = $recipeTransformer; } /** * @param $id * @return array */ public function category($id) { $filters = [ 'category_id' => $id ]; $items = $this->recipeRepository->getList($filters, $this->getPaginationLimit('dashboard.recipes')); $data = $this->recipeTransformer->transformCollection($items->toArray()['data']); $response = [ 'pagination' => $this->buildPagination($items), 'list' => $data ]; return $this->respond($response); } /** * @param Requests\StoreRecipe $request */ public function store(Requests\StoreRecipe $request) { $data = $request->all(); $recipe = Recipe::create($data); //add parent_id to files $this->createMediaByUser($data, $recipe->id); } /** * @param $id * @param Requests\StoreRecipe $request */ public function update($id, Requests\StoreRecipe $request) { $data = $request->all(); $item = Recipe::findOrFail($id); $item->fill($data); $item->save(); $parentCoverToken = false; if($item->avatar) { $parentCoverToken = $item->avatar['token']; } //add parent_id to files $this->updateMediaByUser($data, $id, $parentCoverToken); } /** * @param $id * @return mixed|\Symfony\Component\HttpFoundation\Response */ public function edit($id) { $item = Recipe::with('avatar','gallery')->findOrFail($id); if($item) { return $this->respond([ 'item' => $this->recipeTransformer->transform($item->toArray()) ]); } else { return $this->respondNotFound(); } } public function delete($id) { $item = Recipe::findOrFail($id); $item->delete(); //delete cover if($item->avatar && $item->avatar['token']) { File::findOrFail($item->avatar['id'])->update(['parent_id' => 0]); } //delete images } }
Example of repo
<?php namespace App\Repositories; use App\Recipe; /** * Class LandingPageFieldRepository * * @package App\Repositories */ class __SAMPLE__RecipeRepository { /** * @param array $filters * @param $limit * @return mixed */ public function getList($filters = [], $limit) { $query = Recipe::with('avatar'); $items = $this->applyFilters($query, $filters)->paginate($limit); return $items; } /** * @param int $limit * @return mixed */ public function getLast($limit = 6) { return Recipe::with('avatar')->orderBy('recipes.id', 'DESC')->take($limit)->get(); } /** * @param $query * @param array $filters * @return mixed */ private function applyFilters($query, array $filters = []) { //searching by first name or last name or combined if (array_key_exists('category_id', $filters)) { $query->where('category_id', $filters['category_id']); } //ordering $query->orderBy('recipes.id', 'DESC'); return $query; } }
webkid/cms 适用场景与选型建议
webkid/cms 是一款 基于 JavaScript 开发的 Composer 扩展包,目前已累计 109 次下载、GitHub Stars 达 0, 最近一次更新时间为 2017 年 11 月 23 日, 在 PHP 生态内属于活跃度较高的组件。
我们在过去多个企业项目中使用过 webkid/cms 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。
基于 webkid/cms 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。
线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。
承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。
统计信息
- 总下载量: 109
- 月度下载量: 0
- 日度下载量: 0
- 收藏数: 0
- 点击次数: 1
- 依赖项目数: 0
- 推荐数: 0
其他信息
- 授权协议: MIT
- 更新时间: 2017-11-23