ridji/blog-bundle

Symfony EDBlogBundle

安装: 63

依赖者: 0

建议者: 0

安全: 0

星标: 1

关注者: 3

分支: 20

类型:symfony-bundle

v1.0.5 2016-10-05 08:01 UTC

README

EDBlogBundle 是一个功能丰富且用户友好的博客组件,适用于 Symfony2。它提供了许多有趣的功能,可以将您的 Symfony2 应用程序打造成一个专业的博客平台。它非常直观且灵活,您可以根据自己的需求轻松进行定制。

功能

  • 博客管理面板
  • 用户管理,多个角色:贡献者、作者、编辑和管理员
  • 评论管理
  • 分类
  • 标签
  • 具有多个修订版本的文章,写锁,自动保存...
  • 媒体库
  • RSS 订阅

许可

此组件采用 MIT 许可。

Resources/meta/LICENSE

先决条件

此组件依赖于许多由非常流行的 Symfony2 组件提供的酷炫功能,例如

演示

访问演示应用程序 http://blog-demo.etonlabs.com,以查看我们的组件集成到标准 Symfony2 应用程序中的行为。

安装

安装过程包括以下步骤

  1. Composer 供应商安装和激活
  2. 从提供的模型创建博客相关实体
  3. EDBlogBundle 配置
  4. SonataMediaBundle 安装和配置
  5. 路由配置
  6. Assetic 配置
  7. RSS 订阅配置
  8. 完成

步骤 1: Composer 供应商安装和激活

如果您尚未安装 composer,您可以使用以下命令安装:

$ wget https://getcomposer.org.cn/composer.phar

然后,您可以使用以下包

$ composer require friendsofsymfony/user-bundle:"~2.0@dev" eko/feedbundle:1.2.5 ed/blog-bundle:v1.0.5

app/AppKernel.php 中激活新要求的包,类似于以下示例

<?php
//app/AppKernel.php

class AppKernel extends Kernel
{
    public function registerBundles()
    {
        $bundles = array(
            // ...
            new FOS\UserBundle\FOSUserBundle(),	
            new ED\BlogBundle\EDBlogBundle(),
            new Knp\Bundle\PaginatorBundle\KnpPaginatorBundle(),
            new Sonata\CoreBundle\SonataCoreBundle(),
            new Sonata\MediaBundle\SonataMediaBundle(),
            new Sonata\EasyExtendsBundle\SonataEasyExtendsBundle(),
            new JMS\SerializerBundle\JMSSerializerBundle(),
            new Doctrine\Bundle\FixturesBundle\DoctrineFixturesBundle(),
            new Stof\DoctrineExtensionsBundle\StofDoctrineExtensionsBundle(),
            new Eko\FeedBundle\EkoFeedBundle(),
            //new Application\Sonata\MediaBundle\ApplicationSonataMediaBundle(), //will be generated later	
        );

        // ...
    }
}

步骤 2: 从提供的模型创建博客相关实体

为了能够使用 EDBlogBundle 的功能,您必须在应用程序内部某个位置实现某些实体。这将非常简单,您需要做的只是创建相关的类并扩展我们准备好的模型。

###2.1 文章实体

创建您的文章实体,类似于以下示例

<?php     
//src/Acme/DemoBundle/Entity/Article.php

namespace Acme\Bundle\DemoBundle\Entity; 

use ED\BlogBundle\Interfaces\Model\ArticleInterface;
use ED\BlogBundle\Model\Entity\Article as BaseArticle;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Table(name="acme_demo_article")
 * @ORM\HasLifecycleCallbacks
 * @ORM\Entity(repositoryClass="ED\BlogBundle\Model\Repository\ArticleRepository")
 */
class Article extends BaseArticle implements ArticleInterface
{
}

###2.2 文章元数据实体

创建您的文章元数据实体,类似于以下示例

<?php        
//src/Acme/DemoBundle/Entity/ArticleMeta.php

namespace Acme\Bundle\DemoBundle\Entity; 

use ED\BlogBundle\Interfaces\Model\ArticleMetaInterface;
use ED\BlogBundle\Model\Entity\ArticleMeta as BaseArticleMeta;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Table(name="acme_demo_article_meta")
 * @ORM\Entity()
 */
class ArticleMeta extends BaseArticleMeta implements ArticleMetaInterface
{
}

###2.3 评论实体

创建您的评论实体,类似于以下示例

<?php
//src/Acme/DemoBundle/Entity/Comment.php

namespace Acme\Bundle\DemoBundle\Entity; 

use ED\BlogBundle\Interfaces\Model\CommentInterface;
use ED\BlogBundle\Model\Entity\Comment as BaseComment;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Table(name="acme_demo_comment")
 * @ORM\HasLifecycleCallbacks
 * @ORM\Entity(repositoryClass="ED\BlogBundle\Model\Repository\CommentRepository")
 */
class Comment extends BaseComment implements CommentInterface
{
}            

###2.4 设置实体

创建您的设置实体,类似于以下示例

<?php
//src/Acme/DemoBundle/Entity/Settings.php

namespace Acme\Bundle\DemoBundle\Entity; 

use ED\BlogBundle\Interfaces\Model\BlogSettingsInterface;
use ED\BlogBundle\Model\Entity\BlogSettings as BaseSettings;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Table(name="acme_demo_settings")
 * @ORM\Entity(repositoryClass="ED\BlogBundle\Model\Repository\BlogSettingsRepository")
 */
class Settings extends BaseSettings implements BlogSettingsInterface
{
}

###2.5 分类实体

创建您的分类实体,类似于以下示例

<?php
//src/Acme/DemoBundle/Entity/Taxonomy.php

namespace Acme\Bundle\DemoBundle\Entity; 

use ED\BlogBundle\Interfaces\Model\BlogTaxonomyInterface;
use ED\BlogBundle\Model\Entity\Taxonomy as BaseTaxonomy;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Table(name="acme_demo_taxonomy")
 * @ORM\Entity(repositoryClass="ED\BlogBundle\Model\Repository\TaxonomyRepository")
 */
class Taxonomy extends BaseTaxonomy implements BlogTaxonomyInterface
{
}

###2.6 分类关系实体

创建您的分类关系实体,类似于以下示例

<?php
//src/Acme/DemoBundle/Entity/TaxonomyRelation.php

namespace Acme\Bundle\DemoBundle\Entity; 

use ED\BlogBundle\Interfaces\Model\TaxonomyRelationInterface;
use ED\BlogBundle\Model\Entity\TaxonomyRelation as BaseTaxonomyRelation;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Table(name="acme_demo_taxonomy_relation")
 * @ORM\Entity()
 */
class TaxonomyRelation extends BaseTaxonomyRelation implements TaxonomyRelationInterface
{
}

###2.7 术语实体

创建您的术语实体,类似于以下示例

<?php
//src/Acme/DemoBundle/Entity/Term.php

namespace Acme\Bundle\DemoBundle\Entity; 

use ED\BlogBundle\Interfaces\Model\BlogTermInterface;
use ED\BlogBundle\Model\Entity\Term as BaseTerm;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Table(name="acme_demo_term")
 * @ORM\Entity()
 * @UniqueEntity("slug")
 */
class Term extends BaseTerm implements BlogTermInterface
{
}

###2.8 用户实体

为了能够使用 EDBlogBundle,您的用户实体应该实现两个接口:BlogUserInterface 和 ArticleCommenterInterface。修改您的用户实体,类似于以下示例。

注意

在以下链接了解更多关于FOSUser集成信息:https://github.com/FriendsOfSymfony/FOSUserBundle/blob/1.2.0/Resources/doc/index.md

<?php
//src/AppBundle/Entity/User

namespace Acme\Bundle\DemoBundle\Entity; 

use ED\BlogBundle\Interfaces\Model\BlogUserInterface;
use ED\BlogBundle\Interfaces\Model\ArticleCommenterInterface;
use FOS\UserBundle\Model\User as BaseUser;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 * @ORM\Table(name="user")
 * @ORM\Entity(repositoryClass="AppBundle\Repository\UserRepository")
 */
class User extends BaseUser implements BlogUserInterface, ArticleCommenterInterface
{
    //...

    /**
     * Required by BlogUserInterface
     *
     * @ORM\Column(name="blog_display_name", type="string")
     */
    protected $blogDisplayName;

    public function getBlogDisplayName()
    {
        return $this->blogDisplayName;
    }
    
    public function setBlogDisplayName($blogDisplayName)
    {
        $this->blogDisplayName = $blogDisplayName;
    
        return $this;
    }
    
    public function getCommenterDisplayName()
    {
        return $this->blogDisplayName;
    }
}

###2.9 用户仓库

您的用户仓库类应实现BlogUserRepositoryInterface。我们准备了一个起始点,即ED\BlogBundle\Model\Repository\UserRepository,您可以以此为基础进行修改。修改您的UserRepository类,使其类似以下内容:

<?php
//src/AppBundle/Repository/UserRepository

namespace AppBundle\Repository; 

use ED\BlogBundle\Interfaces\Repository\BlogUserRepositoryInterface;
use ED\BlogBundle\Model\Repository\UserRepository as BaseUserRepository;

class AppUserRepository extends BaseUserRepository implements BlogUserRepositoryInterface
{
}

第3步:EDBlogBundle配置

现在当您的实体准备就绪后,您可以在您的app/config/config.yml中配置EDBlogBundle。请在配置中添加ed_blog,同时指向先前创建的实体,类似于以下示例:

 # app/config/config.yml
 
# ...
ed_blog:
    entities:
        user_model_class: AppBundle\Entity\User
        article_class: Acme\Bundle\DemoBundle\Entity\Article
        article_meta_class: Acme\Bundle\DemoBundle\Entity\ArticleMeta
        blog_term_class: Acme\Bundle\DemoBundle\Entity\Term
        blog_taxonomy_class: Acme\Bundle\DemoBundle\Entity\Taxonomy
        blog_taxonomy_relation_class: Acme\Bundle\DemoBundle\Entity\TaxonomyRelation
        blog_comment_class: Acme\Bundle\DemoBundle\Entity\Comment
        blog_settings_class: Acme\Bundle\DemoBundle\Entity\Settings

第4步:SonataMediaBundle安装和配置

接下来,我们将安装和配置媒体管理核心。将以下配置添加到您的config.yml中:

# app/config/config.yml

sonata_media:
   default_context: default
   db_driver: doctrine_orm # or doctrine_mongodb, doctrine_phpcr
   contexts:
       default:  # the default context is mandatory
           providers:
               - sonata.media.provider.dailymotion
               - sonata.media.provider.youtube
               - sonata.media.provider.image
               - sonata.media.provider.file

           formats:
               crop:  { width: 600 , quality: 80}
               small: { width: 100 , quality: 70}
               big:   { width: 500 , quality: 70}
               lib:   { width: 350 , height: 250 , quality: 70}
               excerpt:   { width: 780 , height: 500 , quality: 70}

   cdn:
       server:
           path: /uploads/media # http://media.sonata-project.org/

   filesystem:
       local:
           directory:  %kernel.root_dir%/../web/uploads/media
           create:     false

要生成ApplicationSonataMediaBundle,请打开终端并运行以下代码:

$ php app/console sonata:easy-extends:generate --dest=src SonataMediaBundle

现在您可以通过在app/AppKernel.php中添加/取消注释此行来将ApplicationSonataMediaBundle包含在内:

<?php
//app/Kernel.php

//...
class AppKernel extends Kernel
{
    public function registerBundles()
    {
        $bundles = array(
            // ...
            new Application\Sonata\MediaBundle\ApplicationSonataMediaBundle(), //add/uncomment	
        );
        
        // ...
    }
}

最后,我们应该为媒体存储创建本地目录

$ mkdir web/uploads
$ mkdir web/uploads/media
$ sudo chmod -R 0777 web/uploads

第5步:路由配置

通过在您的app/config/routing.yml中添加以下代码来启用EDBlogBundle和SonataMediaBundle的路由:

 # app/config/routing.yml
 
gallery:
    resource: '@SonataMediaBundle/Resources/config/routing/gallery.xml'
    prefix: /media/gallery

media:
    resource: '@SonataMediaBundle/Resources/config/routing/media.xml'
    prefix: /media

ed_blog_admin_feed:
    path:      /feed/{type}
    defaults:  { _controller: EDBlogBundle:Backend/Feed:feed }

ed_blog_frontend:
    resource: "@EDBlogBundle/Controller/Frontend/"
    type:     annotation
    prefix:   /

ed_blog:
    resource: "@EDBlogBundle/Controller/Backend/"
    type:     annotation
    prefix:   /blog/admin/
    
fos_user:
    resource: "@FOSUserBundle/Resources/config/routing/all.xml"

第6步:Assetic配置

将EDBlogBundle添加到您的Assetic配置中,类似于以下内容:

# app/config/config.yml

#...
assetic:
    # ...
    bundles:    [ EDBlogBundle ]

第7步:RSS订阅配置

为了使用RSS订阅功能,请在您的app/config/config.yml中添加eko_feed配置。请根据您的应用程序更改所需行。

 # app/config/config.yml
 
# ...
eko_feed:
    feeds:
        article:
            title:       'My articles/posts'
            description: 'Latests articles'
            link:
                route_name: ed_blog_admin_feed
                route_params: {type: rss} # necessary if route cantains required parameters
            encoding:    'utf-8'
            author:      'Acme' # Only required for Atom feeds

注意

访问https://github.com/eko/FeedBundle以了解有关eko/FeedBundle的更多信息

第8步:完成

现在您已经准备好完成EDBlogBundle的安装

$ php app/console as:in --symlink
$ php app/console as:du --env=prod
$ php app/console doc:sc:update --force

在您能够访问博客管理区域之前,您应该提升一个博客管理员。为了做到这一点,您应该将两个角色分配给您的未来博客管理员用户ROLE_BLOG_USERROLE_BLOG_ADMIN。您可以通过修改您的注册动作或通过在控制台运行以下代码来轻松完成此操作:

$ php app/console fos:user:promote

注意

每个博客用户都必须分配ROLE_BLOG_USER角色。除了这个角色之外,根据权限级别,他们还应该拥有以下之一

  • ROLE_BLOG_ADMIN - 管理员可以查看/访问/修改:文章、用户、分类、标签、评论、媒体库、设置
  • ROLE_BLOG_EDITOR - 编辑员可以查看/访问:文章、评论、媒体库
  • ROLE_BLOG_AUTHOR - 作者可以查看/访问:文章、媒体库,可以发布和管理自己的帖子
  • ROLE_BLOG_CONTRIBUTOR - 贡献者可以查看/访问:文章、媒体库,可以撰写和管理自己的帖子,但不能发布它们

现在您可以以博客管理员身份登录并访问/blog/admin/。请在/blog/admin/settings/edit上首先保存您的初始博客设置。

恭喜!您的EDBlogBundle已准备就绪。

请告诉我们您的想法。

享受使用EDBlogBundle,并不要忘记贡献力量!