扩展Laravel包

时间:2017-12-27 16:34:44

标签: laravel laravel-5 composer-php package extend

我已经四处寻找,但却找不到明确的答案......

我有一个包DevDojo Chatter,并希望使用我的应用程序扩展它。我知道我必须覆盖这些函数,以便作曲家更新不会覆盖我的更改。

我该怎么做?

更新

public function store(Request $request)
{
    $request->request->add(['body_content' => strip_tags($request->body)]);

    $validator = Validator::make($request->all(), [
        'title'               => 'required|min:5|max:255',
        'body_content'        => 'required|min:10',
        'chatter_category_id' => 'required',
    ]);

    Event::fire(new ChatterBeforeNewDiscussion($request, $validator));
    if (function_exists('chatter_before_new_discussion')) {
        chatter_before_new_discussion($request, $validator);
    }

    if ($validator->fails()) {
        return back()->withErrors($validator)->withInput();
    }

    $user_id = Auth::user()->id;

    if (config('chatter.security.limit_time_between_posts')) {
        if ($this->notEnoughTimeBetweenDiscussion()) {
            $minute_copy = (config('chatter.security.time_between_posts') == 1) ? ' minute' : ' minutes';
            $chatter_alert = [
                'chatter_alert_type' => 'danger',
                'chatter_alert'      => 'In order to prevent spam, please allow at least '.config('chatter.security.time_between_posts').$minute_copy.' in between submitting content.',
                ];

            return redirect('/'.config('chatter.routes.home'))->with($chatter_alert)->withInput();
        }
    }

    // *** Let's gaurantee that we always have a generic slug *** //
    $slug = str_slug($request->title, '-');

    $discussion_exists = Models::discussion()->where('slug', '=', $slug)->first();
    $incrementer = 1;
    $new_slug = $slug;
    while (isset($discussion_exists->id)) {
        $new_slug = $slug.'-'.$incrementer;
        $discussion_exists = Models::discussion()->where('slug', '=', $new_slug)->first();
        $incrementer += 1;
    }

    if ($slug != $new_slug) {
        $slug = $new_slug;
    }

    $new_discussion = [
        'title'               => $request->title,
        'chatter_category_id' => $request->chatter_category_id,
        'user_id'             => $user_id,
        'slug'                => $slug,
        'color'               => $request->color,
        ];

    $category = Models::category()->find($request->chatter_category_id);
    if (!isset($category->slug)) {
        $category = Models::category()->first();
    }

    $discussion = Models::discussion()->create($new_discussion);

    $new_post = [
        'chatter_discussion_id' => $discussion->id,
        'user_id'               => $user_id,
        'body'                  => $request->body,
        ];

    if (config('chatter.editor') == 'simplemde'):
       $new_post['markdown'] = 1;
    endif;

    // add the user to automatically be notified when new posts are submitted
    $discussion->users()->attach($user_id);

    $post = Models::post()->create($new_post);


    if ($post->id) {
        Event::fire(new ChatterAfterNewDiscussion($request));
        if (function_exists('chatter_after_new_discussion')) {
            chatter_after_new_discussion($request);
        }

        if($discussion->status === 1) {
            $chatter_alert = [
                'chatter_alert_type' => 'success',
                'chatter_alert'      => 'Successfully created a new '.config('chatter.titles.discussion').'.',
            ];
            return redirect('/'.config('chatter.routes.home').'/'.config('chatter.routes.discussion').'/'.$category->slug.'/'.$slug)->with($chatter_alert);
        } else {
            $chatter_alert = [
                'chatter_alert_type' => 'info',
                'chatter_alert'      => 'You post has been submitted for approval.',
            ];
            return redirect()->back()->with($chatter_alert);
        }

    } else {
        $chatter_alert = [
            'chatter_alert_type' => 'danger',
            'chatter_alert'      => 'Whoops :( There seems to be a problem creating your '.config('chatter.titles.discussion').'.',
            ];

        return redirect('/'.config('chatter.routes.home').'/'.config('chatter.routes.discussion').'/'.$category->slug.'/'.$slug)->with($chatter_alert);
    }
}

供应商包中有一个我想要修改/覆盖的商店功能。我希望能够修改一些功能,或者如果需要可能修改它的一部分。请有人指出我正确的方向。

1 个答案:

答案 0 :(得分:0)

如果您的意思是在应用程序中修改类实现,则可以更改类的解析方式:

app()->bind(PackageClass:class, YourCustomClass::class);

现在你可以像这样创建这个自定义类:

class YourCustomClass extends PackageClass
{
   public function packageClassYouWantToChange()
   {
       // here you can modify behavior
   }
}

我建议您详细了解binding

当然,很大程度上取决于如何创建类,如果使用new运算符创建它,您可能需要更改多个类,但如果注入它,则应该足以更改此单个类。