Я хочу генерировать Dynamic sitemap
для моего проекта Laravel. Я уже искал ответ на многих сайтах. некоторые из них описывают это с помощью композитора. Я не понял, как это сделать. и на некоторых других сайтах они написали коды для получения URL из db в циклах. В моем проекте БД я не сохранил ни одной ссылки. Мой проект — это сайт для врачей и пациентов.
так кто-нибудь знает, как писать php / laravel codes for dynamic sitemap generation
.?
редактировать
Я новичок в Laravel, поэтому я просто незнаком с этим композитором. Может ли кто-нибудь, пожалуйста, скажите мне, если я загружаю laravel-sitemap-master.zip с github, где я могу извлечь его и сохранить в каталоге моего проекта? это будет очень полезно, если кто-нибудь, пожалуйста, ответьте на это.
Добавьте эту строку в свой routes.php
Route::get('/sitemap', function()
{
return Response::view('sitemap')->header('Content-Type', 'application/xml');
});
Создать новый файл Приложение \ Http \ Middleware \ sitemap.php
<?php namespace App\Http\Middleware;
use Closure;
use Carbon\Carbon;
use Illuminate\Contracts\Auth\Guard;
class sitemap {
/**
* The Guard implementation.
*
* @var Guard
*/
protected $auth;
public function __construct(Guard $auth)
{
$this->auth = $auth;
}/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
*
* @return mixed
*/
public function handle($request, Closure $next)
{
if ( !$request->is("sitemap") && $request->fullUrl() != '' && $this->auth->guest() )
{
$aSiteMap = \Cache::get('sitemap', []);
$changefreq = 'always';
if ( !empty( $aSiteMap[$request->fullUrl()]['added'] ) ) {
$aDateDiff = Carbon::createFromTimestamp( $aSiteMap[$request->fullUrl()]['added'] )->diff( Carbon::now() );
if ( $aDateDiff->y > 0 ) {
$changefreq = 'yearly';
} else if ( $aDateDiff->m > 0) {
$changefreq = 'monthly';
} else if ( $aDateDiff->d > 6 ) {
$changefreq = 'weekly';
} else if ( $aDateDiff->d > 0 && $aDateDiff->d < 7 ) {
$changefreq = 'daily';
} else if ( $aDateDiff->h > 0 ) {
$changefreq = 'hourly';
} else {
$changefreq = 'always';
}
}
$aSiteMap[$request->fullUrl()] = [
'added' => time(),
'lastmod' => Carbon::now()->toIso8601String(),
'priority' => 1 - substr_count($request->getPathInfo(), '/') / 10,
'changefreq' => $changefreq
];
\Cache::put('sitemap', $aSiteMap, 2880);
}
return $next($request);
}
}
И создайте новый файл вида ресурсы \ вид \ sitemap.blade.php
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"xmlns:image="http://www.google.com/schemas/sitemap-image/1.1"xmlns:video="http://www.google.com/schemas/sitemap-video/1.1">
@foreach( Cache::get('sitemap') as $url => $params )
<url>
<loc>{{$url}}</loc>
<lastmod>{{$params['lastmod']}}</lastmod>
<changefreq>{{$params['changefreq']}}</changefreq>
<priority>{{$params['priority']}}</priority>
</url>
@endforeach
</urlset>
Добавить запись в защищенный массив $ middleware в файле Приложение \ Http \ Kernel.php
'sitemap' => 'App\Http\Middleware\sitemap'
Предположим, вы хотите, чтобы ваш сайт sitemap.xml
файл, чтобы включить ссылки на всех врачей и пациентов, у вас есть в базе данных, вы можете сделать это так:
в файле rout.php ..
Route::get("sitemap.xml", array(
"as" => "sitemap",
"uses" => "HomeController@sitemap", // or any other controller you want to use
));
в файле HomeController.php (если вы решили использовать HomeController) ..
public function sitemap()
{
$doctors = Doctor::remember(59) // chach this query for 59 minutes
->select(["id", "updated_at"])
// you may want to add where clauses here according to your needs
->orderBy("id", "desc")
->take(50000) // each Sitemap file must have no more than 50,000 URLs and must be no larger than 10MB
->get();
$patients = Patient::remember(59) // chach this query for 59 minutes
->select(["id", "updated_at"])
// you may want to add where clauses here according to your needs
->orderBy("id", "desc")
->take(50000) // each Sitemap file must have no more than 50,000 URLs and must be no larger than 10MB
->get();
$content = View::make('sitemap', ['doctors' => $doctors, 'patients' => $patients]);
return Response::make($content)->header('Content-Type', 'text/xml;charset=utf-8');
}
в файле views / sitemap.blade.php ..
<?php echo '<?xml version="1.0" encoding="UTF-8"?>' ?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
@foreach($doctors as $doctor)
<url>
<loc>{{ URL::route("doctors.show", [$doctor->id]) }}</loc>
<lastmod>{{ gmdate(DateTime::W3C, strtotime($doctor->updated_at)) }}</lastmod>
<changefreq>daily</changefreq>
<priority>1.0</priority>
</url>
@endforeach
@foreach($patients as $patient)
<url>
<loc>{{ URL::route("patients.show", [$patient->id]) }}</loc>
<lastmod>{{ gmdate(DateTime::W3C, strtotime($patient->updated_at)) }}</lastmod>
<changefreq>daily</changefreq>
<priority>1.0</priority>
</url>
@endforeach
</urlset>
проверять https://github.com/RoumenDamianoff/laravel-sitemap
Простой генератор карт сайта для Laravel 4.
Route::get('sitemap', function(){
// create new sitemap object
$sitemap = App::make("sitemap");
// set cache (key (string), duration in minutes (Carbon|Datetime|int), turn on/off (boolean))
// by default cache is disabled
$sitemap->setCache('laravel.sitemap', 3600);
// check if there is cached sitemap and build new only if is not
if (!$sitemap->isCached())
{
// add item to the sitemap (url, date, priority, freq)
$sitemap->add(URL::to('/'), '2012-08-25T20:10:00+02:00', '1.0', 'daily');
$sitemap->add(URL::to('page'), '2012-08-26T12:30:00+02:00', '0.9', 'monthly');
// get all posts from db
$posts = DB::table('posts')->orderBy('created_at', 'desc')->get();
// add every post to the sitemap
foreach ($posts as $post)
{
$sitemap->add($post->slug, $post->modified, $post->priority, $post->freq);
}
}
// show your sitemap (options: 'xml' (default), 'html', 'txt', 'ror-rss', 'ror-rdf')
return $sitemap->render('xml');
});
Я использовал это. работает отлично!
Чтобы устранить путаницу, давайте возьмем пример.
скажем, у меня есть таблица блога с id
, title
, blog
у меня есть маршрут как, Route::get('blog/{blog}',['as' => 'blog.show', 'uses' => 'Blog@show'];
Сначала я получу содержимое, $blogs = DB::table('blog')->get();
$blogs
будет содержать результаты.
я просто зациклюсь,
foreach($blogs as $i)
{
$sitemap->add(route('blog.show',[$i->title]), '2014-11-11', '1.0','daily');
}
все мои блоги добавлены в карту сайта.