Php 重构雄辩的回调

Php 重构雄辩的回调,php,laravel,callback,eloquent,Php,Laravel,Callback,Eloquent,有没有办法重构这些函数?我想在回调中重用重复的代码。我不知道从哪里开始,我不仅有这两种方法,我还有更多的方法,重复使用代码会很有帮助 public static function addedPaginatedUrls($crawl_id, $cmp_crawl_id) { return UrlStatus::paginated($crawl_id) ->whereNotIn('url.url', function ($sql) use($cmp_crawl_id)

有没有办法重构这些函数?我想在回调中重用重复的代码。我不知道从哪里开始,我不仅有这两种方法,我还有更多的方法,重复使用代码会很有帮助

public static function addedPaginatedUrls($crawl_id, $cmp_crawl_id) {
    return UrlStatus::paginated($crawl_id)
        ->whereNotIn('url.url', function ($sql) use($cmp_crawl_id) {
            // START REPEATED CODE
            $sql->select('url.url')->from('url_status')
            ->join('url', 'url.id', '=', 'url_status.url_id')
            ->join('crawl', 'crawl.id', '=', 'url_status.crawl_id')
            ->where('url_status.crawl_id', '=', $cmp_crawl_id)
            // END REPEATED CODE
            ->where('url_status.pagination', '<>', '')
            ->whereNotNull('url_status.pagination');
        });
}

public static function addedCanonicalUrls($crawl_id, $cmp_crawl_id) {
    return UrlStatus::canonical($crawl_id)
        ->whereNotIn('url.url', function ($sql) use($cmp_crawl_id) {
            // START REPEATED CODE
            $sql->select('url.url')->from('url_status')
            ->join('url', 'url.id', '=', 'url_status.url_id')
            ->join('crawl', 'crawl.id', '=', 'url_status.crawl_id')
            ->where('url_status.crawl_id', '=', $cmp_crawl_id)
            // END REPEATED CODE
            ->whereNotNull('url_status.canonical');
        });
}
公共静态函数addedPaginatedUrls($crawl\u id,$cmp\u crawl\u id){
返回URL状态::已分页($crawl\u id)
->whereNotIn('url.url',函数($sql)使用($cmp\u crawl\u id){
//启动重复代码
$sql->select('url.url')->from('url\u status'))
->join('url','url.id','=','url\u status.url\u id')
->加入('crawl'、'crawl.id'、'='、'url\u status.crawl\u id')
->其中('url\u status.crawl\u id','=',$cmp\u crawl\u id)
//结束重复代码
->其中('url_status.pagination','','')
->whereNotNull('url_status.pagination');
});
}
公共静态函数addedCanonicalUrls($crawl\u id,$cmp\u crawl\u id){
返回UrlStatus::规范($crawl\u id)
->whereNotIn('url.url',函数($sql)使用($cmp\u crawl\u id){
//启动重复代码
$sql->select('url.url')->from('url\u status'))
->join('url','url.id','=','url\u status.url\u id')
->加入('crawl'、'crawl.id'、'='、'url\u status.crawl\u id')
->其中('url\u status.crawl\u id','=',$cmp\u crawl\u id)
//结束重复代码
->whereNotNull('url_status.canonical');
});
}

您可以在您的模型上创建一个静态方法,尽管我不知道这是否有意义,因为我不知道您的所有应用程序逻辑

在您的UrlStatus模型中:

public static function repeatedCodeRefractoringNameItWhateverYouWant($sql, $cmp_crawl_id){
    // START REPEATED CODE
    return $sql->select('url.url')->from('url_status')
    ->join('url', 'url.id', '=', 'url_status.url_id')
    ->join('crawl', 'crawl.id', '=', 'url_status.crawl_id')
    ->where('url_status.crawl_id', '=', $cmp_crawl_id);
    // END REPEATED CODE
}
然后在代码中静态调用它:

public static function addedPaginatedUrls($crawl_id, $cmp_crawl_id) {
    return UrlStatus::paginated($crawl_id)
        ->whereNotIn('url.url', function ($sql) use($cmp_crawl_id) {
            // START REPEATED CODE
            UrlStatus::repeatedCodeRefractoringNameItWhateverYouWant($sql, $cmp_crawl_id)
            // END REPEATED CODE
            ->where('url_status.pagination', '<>', '')
            ->whereNotNull('url_status.pagination');
        });
}

public static function addedCanonicalUrls($crawl_id, $cmp_crawl_id) {
    return UrlStatus::canonical($crawl_id)
        ->whereNotIn('url.url', function ($sql) use($cmp_crawl_id) {
            // START REPEATED CODE
            UrlStatus::repeatedCodeRefractoringNameItWhateverYouWant($sql, $cmp_crawl_id)
            // END REPEATED CODE
            ->whereNotNull('url_status.canonical');
        });
}
公共静态函数addedPaginatedUrls($crawl\u id,$cmp\u crawl\u id){
返回URL状态::已分页($crawl\u id)
->whereNotIn('url.url',函数($sql)使用($cmp\u crawl\u id){
//启动重复代码
UrlStatus::repeatedCodeRefractoringNameItWhateverYouWant($sql、$cmp\u crawl\u id)
//结束重复代码
->其中('url_status.pagination','','')
->whereNotNull('url_status.pagination');
});
}
公共静态函数addedCanonicalUrls($crawl\u id,$cmp\u crawl\u id){
返回UrlStatus::规范($crawl\u id)
->whereNotIn('url.url',函数($sql)使用($cmp\u crawl\u id){
//启动重复代码
UrlStatus::repeatedCodeRefractoringNameItWhateverYouWant($sql、$cmp\u crawl\u id)
//结束重复代码
->whereNotNull('url_status.canonical');
});
}

如果这个重复的代码应该被一些或所有的模型共享,只需使用这个方法创建一个新的模型类并从中扩展所有的模型,你就可以在你的模型上创建一个静态方法,尽管我不知道这是否有意义,因为我不知道你的所有应用程序逻辑

在您的UrlStatus模型中:

public static function repeatedCodeRefractoringNameItWhateverYouWant($sql, $cmp_crawl_id){
    // START REPEATED CODE
    return $sql->select('url.url')->from('url_status')
    ->join('url', 'url.id', '=', 'url_status.url_id')
    ->join('crawl', 'crawl.id', '=', 'url_status.crawl_id')
    ->where('url_status.crawl_id', '=', $cmp_crawl_id);
    // END REPEATED CODE
}
然后在代码中静态调用它:

public static function addedPaginatedUrls($crawl_id, $cmp_crawl_id) {
    return UrlStatus::paginated($crawl_id)
        ->whereNotIn('url.url', function ($sql) use($cmp_crawl_id) {
            // START REPEATED CODE
            UrlStatus::repeatedCodeRefractoringNameItWhateverYouWant($sql, $cmp_crawl_id)
            // END REPEATED CODE
            ->where('url_status.pagination', '<>', '')
            ->whereNotNull('url_status.pagination');
        });
}

public static function addedCanonicalUrls($crawl_id, $cmp_crawl_id) {
    return UrlStatus::canonical($crawl_id)
        ->whereNotIn('url.url', function ($sql) use($cmp_crawl_id) {
            // START REPEATED CODE
            UrlStatus::repeatedCodeRefractoringNameItWhateverYouWant($sql, $cmp_crawl_id)
            // END REPEATED CODE
            ->whereNotNull('url_status.canonical');
        });
}
公共静态函数addedPaginatedUrls($crawl\u id,$cmp\u crawl\u id){
返回URL状态::已分页($crawl\u id)
->whereNotIn('url.url',函数($sql)使用($cmp\u crawl\u id){
//启动重复代码
UrlStatus::repeatedCodeRefractoringNameItWhateverYouWant($sql、$cmp\u crawl\u id)
//结束重复代码
->其中('url_status.pagination','','')
->whereNotNull('url_status.pagination');
});
}
公共静态函数addedCanonicalUrls($crawl\u id,$cmp\u crawl\u id){
返回UrlStatus::规范($crawl\u id)
->whereNotIn('url.url',函数($sql)使用($cmp\u crawl\u id){
//启动重复代码
UrlStatus::repeatedCodeRefractoringNameItWhateverYouWant($sql、$cmp\u crawl\u id)
//结束重复代码
->whereNotNull('url_status.canonical');
});
}
如果这个重复的代码应该由一些或所有模型共享,只需使用这个方法创建一个新的模型类,并从中扩展所有模型